diff --git a/4.1-Path-Tracing-1.pdf b/4.1-Path-Tracing-1.pdf new file mode 100644 index 0000000..20671e5 Binary files /dev/null and b/4.1-Path-Tracing-1.pdf differ diff --git a/4.2-Path-Tracing-2.pdf b/4.2-Path-Tracing-2.pdf new file mode 100644 index 0000000..3865333 Binary files /dev/null and b/4.2-Path-Tracing-2.pdf differ diff --git a/CMakeLists.txt b/CMakeLists.txt index 76a65a0..77e084b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,8 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CUDA_PROPAGATE_HOST_FLAGS OFF) endif() -#add_subdirectory(stream_compaction) # TODO: uncomment if using your stream compaction +include_directories(.) +add_subdirectory(stream_compaction) # TODO: uncomment if using your stream compaction add_subdirectory(src) cuda_add_executable(${CMAKE_PROJECT_NAME} @@ -77,7 +78,7 @@ cuda_add_executable(${CMAKE_PROJECT_NAME} target_link_libraries(${CMAKE_PROJECT_NAME} src - #stream_compaction # TODO: uncomment if using your stream compaction + stream_compaction # TODO: uncomment if using your stream compaction ${CORELIBS} ) @@ -87,4 +88,4 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/shaders ${CMAKE_BINARY_DIR}/shaders - ) + ) \ No newline at end of file diff --git a/README.md b/README.md index 5485396..10559a7 100644 --- a/README.md +++ b/README.md @@ -3,284 +3,83 @@ CUDA Path Tracer **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 3** -* (TODO) YOUR NAME HERE -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) - -### (TODO: Your README) - -*DO NOT* leave the README to the last minute! It is a crucial part of the -project, and we will not be able to grade you without a good README. - -Instructions (delete me) -======================== - -This is due Thursday, September 24 evening at midnight. - -**Summary:** -In this project, you'll implement a CUDA-based path tracer capable of rendering -globally-illuminated images very quickly. -Since in this class we are concerned with working in GPU programming, -performance, and the generation of actual beautiful images (and not with -mundane programming tasks like I/O), this project includes base code for -loading a scene description file, described below, and various other things -that generally make up a framework for previewing and saving images. - -The core renderer is left for you to implement. Finally, note that, while this -base code is meant to serve as a strong starting point for a CUDA path tracer, -you are not required to use it if you don't want to. You may also change any -part of the base code as you please. **This is YOUR project.** - -**Recommendation:** Every image you save should automatically get a different -filename. Don't delete all of them! For the benefit of your README, keep a -bunch of them around so you can pick a few to document your progress at the -end. - -### Contents - -* `src/` C++/CUDA source files. -* `scenes/` Example scene description files. -* `img/` Renders of example scene description files. - (These probably won't match precisely with yours.) -* `external/` Includes and static libraries for 3rd party libraries. - - -### Running the code - -The main function requires a scene description file. Call the program with -one as an argument: `cis565_path_tracer scene/sphere.txt`. -(In Visual Studio, `../scene/sphere.txt`.) - -If you are using Visual Studio, you can set this in the Debugging > Command -Arguments section in the Project properties. Make sure you get the path right - -read the console for errors. - -#### Controls - -* Esc to save an image and exit. -* Space to save an image. Watch the console for the output filename. -* W/A/S/D and R/F move the camera. Arrow keys rotate. - -## Requirements - -**Ask on the mailing list for clarifications.** - -In this project, you are given code for: - -* Loading and reading the scene description format -* Sphere and box intersection functions -* Support for saving images -* Working CUDA-GL interop for previewing your render while it's running -* A function which generates random screen noise (instead of an actual render). - -You will need to implement the following features: - -* Raycasting from the camera into the scene through an imaginary grid of pixels - (the screen) - * Implement antialiasing (by jittering rays within each pixel) -* Diffuse surfaces -* Perfectly specular-reflective (mirrored) surfaces - * See notes on diffuse/specular in `scatterRay` -* Stream compaction optimization. You may use any of: - * Your global-memory work-efficient stream compaction implementation. - * A shared-memory work-efficient stream compaction (see below). - * `thrust::remove_if` or any of the other Thrust stream compaction functions. - -You are also required to implement at least 2 of the following features. -Please ask if you need good references (they will be added to this README -later on). If you find good references, share them! **Extra credit**: implement -more features on top of the 2 required ones, with point value up to +20/100 at -the grader's discretion (based on difficulty and coolness). - -* Work-efficient stream compaction using shared memory across multiple blocks - (See *GPU Gems 3* Chapter 39). -* These 2 smaller features: - * Refraction (e.g. glass/water) with Frensel effects using Schlick's - approximation or more accurate methods - * Physically-based depth-of-field (by jittering rays within an aperture) - * Recommended but not required: non-perfect specular surfaces -* Texture mapping -* Bump mapping -* Direct lighting (by taking a final ray directly to a random point on an - emissive object acting as a light source) -* Some method of defining object motion, and motion blur -* Subsurface scattering -* Arbitrary mesh loading and rendering (e.g. `obj` files). You can find these - online or export them from your favorite 3D modeling application. - With approval, you may use a third-party OBJ loading code to bring the data - into C++. - * You can use the triangle intersection function `glm::intersectRayTriangle`. - -This 'extra features' list is not comprehensive. If you have a particular idea -you would like to implement (e.g. acceleration structures, etc.), please -contact us first. - -For each extra feature, you must provide the following analysis: - -* Overview write-up of the feature -* Performance impact of the feature -* If you did something to accelerate the feature, what did you do and why? -* Compare your GPU version of the feature to a HYPOTHETICAL CPU version - (you don't have to implement it!) Does it benefit or suffer from being - implemented on the GPU? -* How might this feature be optimized beyond your current implementation? - -## Base Code Tour - -You'll be working in the following files. Look for important parts of the code: -search for `CHECKITOUT`. You'll have to implement parts labeled with `TODO`. -(But don't let these constrain you - you have free rein!) - -* `src/pathtrace.cu`: path tracing kernels, device functions, and calling code - * `pathtraceInit` initializes the path tracer state - it should copy - scene data (e.g. geometry, materials) from `Scene`. - * `pathtraceFree` frees memory allocated by `pathtraceInit` - * `pathtrace` performs one iteration of the rendering - it handles kernel - launches, memory copies, transferring some data, etc. - * See comments for a low-level path tracing recap. -* `src/intersections.h`: ray intersection functions - * `boxIntersectionTest` and `sphereIntersectionTest`, which take in a ray and - a geometry object and return various properties of the intersection. -* `src/interactions.h`: ray scattering functions - * `calculateRandomDirectionInHemisphere`: a cosine-weighted random direction - in a hemisphere. Needed for implementing diffuse surfaces. - * `scatterRay`: this function should perform all ray scattering, and will - call `calculateRandomDirectionInHemisphere`. See comments for details. -* `src/main.cpp`: you don't need to do anything here, but you can change the - program to save `.hdr` image files, if you want (for postprocessing). - -### Generating random numbers - -``` -thrust::default_random_engine rng(hash(index)); -thrust::uniform_real_distribution u01(0, 1); -float result = u01(rng); -``` - -There is a convenience function for generating a random engine using a -combination of index, iteration, and depth as the seed: - -``` -thrust::default_random_engine rng = random_engine(iter, index, depth); -``` - -### Notes on GLM - -This project uses GLM for linear algebra. - -On NVIDIA cards pre-Fermi (pre-DX12), you may have issues with mat4-vec4 -multiplication. If you have one of these cards, be careful! If you have issues, -you might need to grab `cudamat4` and `multiplyMV` from the -[Fall 2014 project](https://github.com/CIS565-Fall-2014/Project3-Pathtracer). -Let us know if you need to do this. - -### Scene File Format - -This project uses a custom scene description format. Scene files are flat text -files that describe all geometry, materials, lights, cameras, and render -settings inside of the scene. Items in the format are delimited by new lines, -and comments can be added using C-style `// comments`. - -Materials are defined in the following fashion: - -* MATERIAL (material ID) //material header -* RGB (float r) (float g) (float b) //diffuse color -* SPECX (float specx) //specular exponent -* SPECRGB (float r) (float g) (float b) //specular color -* REFL (bool refl) //reflectivity flag, 0 for no, 1 for yes -* REFR (bool refr) //refractivity flag, 0 for no, 1 for yes -* REFRIOR (float ior) //index of refraction for Fresnel effects -* EMITTANCE (float emittance) //the emittance of the material. Anything >0 - makes the material a light source. - -Cameras are defined in the following fashion: - -* CAMERA //camera header -* RES (float x) (float y) //resolution -* FOVY (float fovy) //vertical field of view half-angle. the horizonal angle is calculated from this and the reslution -* ITERATIONS (float interations) //how many iterations to refine the image, - only relevant for supersampled antialiasing, depth of field, area lights, and - other distributed raytracing applications -* DEPTH (int depth) //maximum depth (number of times the path will bounce) -* FILE (string filename) //file to output render to upon completion -* EYE (float x) (float y) (float z) //camera's position in worldspace -* VIEW (float x) (float y) (float z) //camera's view direction -* UP (float x) (float y) (float z) //camera's up vector - -Objects are defined in the following fashion: - -* OBJECT (object ID) //object header -* (cube OR sphere OR mesh) //type of object, can be either "cube", "sphere", or - "mesh". Note that cubes and spheres are unit sized and centered at the - origin. -* material (material ID) //material to assign this object -* TRANS (float transx) (float transy) (float transz) //translation -* ROTAT (float rotationx) (float rotationy) (float rotationz) //rotation -* SCALE (float scalex) (float scaley) (float scalez) //scale - -Two examples are provided in the `scenes/` directory: a single emissive sphere, -and a simple cornell box made using cubes for walls and lights and a sphere in -the middle. - -## Third-Party Code Policy - -* Use of any third-party code must be approved by asking on our Google Group. -* If it is approved, all students are welcome to use it. Generally, we approve - use of third-party code that is not a core part of the project. For example, - for the path tracer, we would approve using a third-party library for loading - models, but would not approve copying and pasting a CUDA function for doing - refraction. -* Third-party code **MUST** be credited in README.md. -* Using third-party code without its approval, including using another - student's code, is an academic integrity violation, and will, at minimum, - result in you receiving an F for the semester. - -## README - -Please see: [**TIPS FOR WRITING AN AWESOME README**](https://github.com/pjcozzi/Articles/blob/master/CIS565/GitHubRepo/README.md) - -* Sell your project. -* Assume the reader has a little knowledge of path tracing - don't go into - detail explaining what it is. Focus on your project. -* Don't talk about it like it's an assignment - don't say what is and isn't - "extra" or "extra credit." Talk about what you accomplished. -* Use this to document what you've done. -* *DO NOT* leave the README to the last minute! It is a crucial part of the - project, and we will not be able to grade you without a good README. - -In addition: - -* This is a renderer, so include images that you've made! -* Be sure to back your claims for optimization with numbers and comparisons. -* If you reference any other material, please provide a link to it. -* You wil not be graded on how fast your path tracer runs, but getting close to - real-time is always nice! -* If you have a fast GPU renderer, it is very good to show case this with a - video to show interactivity. If you do so, please include a link! - -### Analysis - -* Stream compaction helps most after a few bounces. Print and plot the - effects of stream compaction within a single iteration (i.e. the number of - unterminated rays after each bounce) and evaluate the benefits you get from - stream compaction. -* Compare scenes which are open (like the given cornell box) and closed - (i.e. no light can escape the scene). Again, compare the performance effects - of stream compaction! Remember, stream compaction only affects rays which - terminate, so what might you expect? - - -## Submit - -If you have modified any of the `CMakeLists.txt` files at all (aside from the -list of `SOURCE_FILES`), you must test that your project can build in Moore -100B/C. Beware of any build issues discussed on the Google Group. - -1. Open a GitHub pull request so that we can see that you have finished. - The title should be "Submission: YOUR NAME". -2. Send an email to the TA (gmail: kainino1+cis565@) with: - * **Subject**: in the form of `[CIS565] Project N: PENNKEY`. - * Direct link to your pull request on GitHub. - * Estimate the amount of time you spent on the project. - * If there were any outstanding problems, or if you did any extra - work, *briefly* explain. - * Feedback on the project itself, if any. +* Kangning Li +* Tested on: Windows 10, i7-4790 @ 3.60GHz 16GB, GTX 970 4096MB (Personal) + +![](images/toBoldlyGo.gif) + +This repository contains a CUDA path tracer with the following features: +- basic diffuse and perfectly reflective materials +- work-efficient shared memory scan for stream compaction +- obj file loading and naive rendering +- motion blur + +This was done as HW3 for CIS 565 2015, GPU Programming at the University of Pennsylvania. + +**Materials** + +![](images/cornell.2015-09-30_01-56-56z.5000samp.png) + +The content of this assignment was weighted more towards learning CUDA than pathtracing. As such, this path tracer only supports perfectly reflective and perfect "diffuse" materials at the moment. Code in interactions.h exists with the intent to enable support in the future for simple refraction as well as fresnel reflection/refraction approximated using Schlick's law. However, these features are not complete as can be seen below: + +![](images/cornell.2015-09-30_02-04-20z.5000samp.png) + +We can still get some interesting images, however, such as this one with a lensing effect: + +![](images/cornell.2015-09-30_02-17-23z.5000samp.png) + +All lights are just geometry objects with an emissive material. I will elaborate on the scene file format further down. + +**Stream Compaction** + +Within one sampling iteration the GPU will produce a pool of rays by raycasting. Then it will repeatedly test the rays for intersection in the scene and remove bottomed out rays until the pool is empty. + +Removing bottomed out rays from the pool uses stream compaction. This program includes a work-efficient shared memory implementation of Scan but can also be configured to use work-efficient global memory scan or the thrust library's version of stream compaction. + +The work-efficient scan implementations are available in [stream_compaction/efficient.cu](stream_compaction/efficient.cu). The function scan_components_test() also contains some unit tests for the components of work-efficient global memory scan. The shared memory size can be changed by tweaking DEVICE_SHARED_MEMORY in [stream_compaction/efficient.h](stream_compaction/efficient.h). + +Stream compaction meanwhile is implemented in [src/pathtrace.cu](src/pathtrace.cu). To switch between different stream compaction implementations, see [line 362](src/pathtrace.cu#L362). +Unit tests for work-efficient shared memory implementation can be run on the first path tracing iteration by uncommenting code at line 296 in [src/pathtrace.cu](src/pathtrace.cu#L296). + +**Artifacting** +![](images/cornell.2015-09-30_02-09-52z.5000samp.png) + +Some of my renders have noticeable artifacting, which seemed to come and go throughout the process. At one point I thought it might have been a difference in stream compaction since images rendered with thrust seemed cleaner than those rendered with my implementations, but more recent tests show artifacting across all implementations. This is an area I want to investigate further. + +**Scene File Changes** + +The scene file format has some extensions from the original format described [here](https://github.com/CIS565-Fall-2015/Project3-CUDA-Path-Tracer#scene-file-format). + +My modifications exist to enable motion blur and arbitrary obj file loading. The scene file [scenes/toBoldlyGo.txt](scenes/toBoldlyGo.txt) is a pretty representative example. + +At [line 51 and 52](scenes/toBoldlyGo.txt#L51) I added CAMERATIME and SHUTTERDURATION, which define the current "world" time in the path tracer world and how long the camera shutter stays open in milliseconds. [Line 106](scenes/toBoldlyGo.txt#L106) defines a translational "speed" for the object as distance in world units traveled per millisecond. When a SPEED is defined, the object's original TRANS value will be treated as its initial position. + +[Line 110](scenes/toBoldlyGo.txt#L110) simply includes the file name of the obj file to be loaded. + +**Motion Blur** + +This is a scaled cube: +![](images/car.2015-09-29_23-01-03z.216samp.png) + +And this is a very fast scaled cube: +![](images/car.2015-09-29_23-37-10z.840samp.png) + +Implementing motion blur required modifying the scene primitives' intersection functions and storing temporal data with each ray. At ray cast time, a camera with a SHUTTERDURATION value will "jitter" the cast rays between the CAMERATIME it currently has stored and CAMERATIME + SHUTTERDURATION. + +When an intersection test is run between a ray and a scene primitive, the primitive's transformation is recalculated to accomodate the translation from the initial position calculated from the ray's timestamp and the primitive's SPEED. + +Although the additional recomputation in intersection testing causes a slight performance hit compared to stationary rendering, motion blur does not add samples like anti-aliasing and depth of field do, so it should not cause orders of magnitude performance loss per iteration. However, it may increase noise for the same number of samples since the samples are spread out "over time". + +**Mesh loading** + +![](images/cornell.2015-09-29_11-44-39z.5000samp.png) + +The mesh loading and rendering in this project are both very straightforward. All the host mesh loading code can be found in [src/Mesh.cpp](src/Mesh.cpp), which expects meshes that have already been triangulated and have indices in counter clockwise order. Normals are currently ignored and calculated in the mesh intersection checker in [src/intersections.h](src/intersections.h). + +At the moment rendering scenes with meshes causes drastic performance decreases compared to rendering scenes with sphere and cube primitives. In addition to the additonal number of intersection tests that must be done in naive mesh rendering (every triangle must be checked against every ray), the mesh is also stored exclusively in device global memory, slowing down access time. + +**Estimates on Performance** + +In anecdotal tests, the work efficient/shared memory version can render [scenes/cornell_reflect.txt](scenes/cornell_reflect.txt) out to 1000 iterations in about 50 seconds, while the thrust implementation can take up to a 75 seconds. Surprisingly, the work-efficient global memory implementation was able to do the same render in 35 seconds. However, it should be noted that the work efficient/shared memory version has not been optimized for block size. + +Rendering [scenes/cornell_teapot.txt](scenes/cornell_teapot.txt) to 1000 iterations took the work efficient/shared memory implementation about 4 minutes and 45 seconds. \ No newline at end of file diff --git a/images/car.2015-09-29_22-36-43z.2054samp.png b/images/car.2015-09-29_22-36-43z.2054samp.png new file mode 100644 index 0000000..ff3d0e4 Binary files /dev/null and b/images/car.2015-09-29_22-36-43z.2054samp.png differ diff --git a/images/car.2015-09-29_22-47-55z.320samp.png b/images/car.2015-09-29_22-47-55z.320samp.png new file mode 100644 index 0000000..a45c848 Binary files /dev/null and b/images/car.2015-09-29_22-47-55z.320samp.png differ diff --git a/images/car.2015-09-29_23-01-03z.216samp.png b/images/car.2015-09-29_23-01-03z.216samp.png new file mode 100644 index 0000000..421ba5e Binary files /dev/null and b/images/car.2015-09-29_23-01-03z.216samp.png differ diff --git a/images/car.2015-09-29_23-37-10z.840samp.png b/images/car.2015-09-29_23-37-10z.840samp.png new file mode 100644 index 0000000..2f8c98d Binary files /dev/null and b/images/car.2015-09-29_23-37-10z.840samp.png differ diff --git a/images/car.2015-09-30_00-01-16z.85samp.png b/images/car.2015-09-30_00-01-16z.85samp.png new file mode 100644 index 0000000..3969618 Binary files /dev/null and b/images/car.2015-09-30_00-01-16z.85samp.png differ diff --git a/images/car.2015-09-30_00-18-13z.72samp.png b/images/car.2015-09-30_00-18-13z.72samp.png new file mode 100644 index 0000000..9c939c2 Binary files /dev/null and b/images/car.2015-09-30_00-18-13z.72samp.png differ diff --git a/images/car.2015-09-30_00-19-01z.161samp.png b/images/car.2015-09-30_00-19-01z.161samp.png new file mode 100644 index 0000000..110eb37 Binary files /dev/null and b/images/car.2015-09-30_00-19-01z.161samp.png differ diff --git a/images/car.2015-09-30_00-20-22z.79samp.png b/images/car.2015-09-30_00-20-22z.79samp.png new file mode 100644 index 0000000..ae12192 Binary files /dev/null and b/images/car.2015-09-30_00-20-22z.79samp.png differ diff --git a/images/cornell.2015-09-21_17-51-20z.5samp.png b/images/cornell.2015-09-21_17-51-20z.5samp.png new file mode 100644 index 0000000..a95921b Binary files /dev/null and b/images/cornell.2015-09-21_17-51-20z.5samp.png differ diff --git a/images/cornell.2015-09-21_18-26-38z.5samp.png b/images/cornell.2015-09-21_18-26-38z.5samp.png new file mode 100644 index 0000000..94ef0b5 Binary files /dev/null and b/images/cornell.2015-09-21_18-26-38z.5samp.png differ diff --git a/images/cornell.2015-09-21_19-28-47z.5samp.png b/images/cornell.2015-09-21_19-28-47z.5samp.png new file mode 100644 index 0000000..5487d89 Binary files /dev/null and b/images/cornell.2015-09-21_19-28-47z.5samp.png differ diff --git a/images/cornell.2015-09-21_20-37-49z.5000samp.png b/images/cornell.2015-09-21_20-37-49z.5000samp.png new file mode 100644 index 0000000..e491db0 Binary files /dev/null and b/images/cornell.2015-09-21_20-37-49z.5000samp.png differ diff --git a/images/cornell.2015-09-28_01-26-01z.5000samp.png b/images/cornell.2015-09-28_01-26-01z.5000samp.png new file mode 100644 index 0000000..909f5ee Binary files /dev/null and b/images/cornell.2015-09-28_01-26-01z.5000samp.png differ diff --git a/images/cornell.2015-09-28_02-03-35z.2496samp.png b/images/cornell.2015-09-28_02-03-35z.2496samp.png new file mode 100644 index 0000000..0af028e Binary files /dev/null and b/images/cornell.2015-09-28_02-03-35z.2496samp.png differ diff --git a/images/cornell.2015-09-28_02-06-59z.3741samp.png b/images/cornell.2015-09-28_02-06-59z.3741samp.png new file mode 100644 index 0000000..e1564d5 Binary files /dev/null and b/images/cornell.2015-09-28_02-06-59z.3741samp.png differ diff --git a/images/cornell.2015-09-28_02-15-17z.5000samp.png b/images/cornell.2015-09-28_02-15-17z.5000samp.png new file mode 100644 index 0000000..fcec7ac Binary files /dev/null and b/images/cornell.2015-09-28_02-15-17z.5000samp.png differ diff --git a/images/cornell.2015-09-28_02-38-37z.5000samp.png b/images/cornell.2015-09-28_02-38-37z.5000samp.png new file mode 100644 index 0000000..50252b7 Binary files /dev/null and b/images/cornell.2015-09-28_02-38-37z.5000samp.png differ diff --git a/images/cornell.2015-09-28_11-52-56z.2669samp.png b/images/cornell.2015-09-28_11-52-56z.2669samp.png new file mode 100644 index 0000000..dff4773 Binary files /dev/null and b/images/cornell.2015-09-28_11-52-56z.2669samp.png differ diff --git a/images/cornell.2015-09-28_12-01-33z.1409samp.png b/images/cornell.2015-09-28_12-01-33z.1409samp.png new file mode 100644 index 0000000..da5b2bc Binary files /dev/null and b/images/cornell.2015-09-28_12-01-33z.1409samp.png differ diff --git a/images/cornell.2015-09-28_22-38-33z.5000samp.png b/images/cornell.2015-09-28_22-38-33z.5000samp.png new file mode 100644 index 0000000..41dccb3 Binary files /dev/null and b/images/cornell.2015-09-28_22-38-33z.5000samp.png differ diff --git a/images/cornell.2015-09-29_05-36-47z.5000samp.png b/images/cornell.2015-09-29_05-36-47z.5000samp.png new file mode 100644 index 0000000..6c7bca1 Binary files /dev/null and b/images/cornell.2015-09-29_05-36-47z.5000samp.png differ diff --git a/images/cornell.2015-09-29_06-25-17z.1403samp.png b/images/cornell.2015-09-29_06-25-17z.1403samp.png new file mode 100644 index 0000000..e01a5e0 Binary files /dev/null and b/images/cornell.2015-09-29_06-25-17z.1403samp.png differ diff --git a/images/cornell.2015-09-29_09-12-53z.357samp.png b/images/cornell.2015-09-29_09-12-53z.357samp.png new file mode 100644 index 0000000..e402471 Binary files /dev/null and b/images/cornell.2015-09-29_09-12-53z.357samp.png differ diff --git a/images/cornell.2015-09-29_11-22-28z.585samp.png b/images/cornell.2015-09-29_11-22-28z.585samp.png new file mode 100644 index 0000000..ad8b2c9 Binary files /dev/null and b/images/cornell.2015-09-29_11-22-28z.585samp.png differ diff --git a/images/cornell.2015-09-29_11-41-33z.445samp.png b/images/cornell.2015-09-29_11-41-33z.445samp.png new file mode 100644 index 0000000..06720ba Binary files /dev/null and b/images/cornell.2015-09-29_11-41-33z.445samp.png differ diff --git a/images/cornell.2015-09-29_11-42-38z.1368samp.png b/images/cornell.2015-09-29_11-42-38z.1368samp.png new file mode 100644 index 0000000..a148ac3 Binary files /dev/null and b/images/cornell.2015-09-29_11-42-38z.1368samp.png differ diff --git a/images/cornell.2015-09-29_11-44-39z.5000samp.png b/images/cornell.2015-09-29_11-44-39z.5000samp.png new file mode 100644 index 0000000..9855599 Binary files /dev/null and b/images/cornell.2015-09-29_11-44-39z.5000samp.png differ diff --git a/images/cornell.2015-09-29_12-26-54z.5000samp.png b/images/cornell.2015-09-29_12-26-54z.5000samp.png new file mode 100644 index 0000000..5d41793 Binary files /dev/null and b/images/cornell.2015-09-29_12-26-54z.5000samp.png differ diff --git a/images/cornell.2015-09-29_12-33-04z.5000samp.png b/images/cornell.2015-09-29_12-33-04z.5000samp.png new file mode 100644 index 0000000..4df1e41 Binary files /dev/null and b/images/cornell.2015-09-29_12-33-04z.5000samp.png differ diff --git a/images/cornell.2015-09-29_12-37-57z.5000samp.png b/images/cornell.2015-09-29_12-37-57z.5000samp.png new file mode 100644 index 0000000..4b16703 Binary files /dev/null and b/images/cornell.2015-09-29_12-37-57z.5000samp.png differ diff --git a/images/cornell.2015-09-29_12-50-41z.5000samp.png b/images/cornell.2015-09-29_12-50-41z.5000samp.png new file mode 100644 index 0000000..9b0ef9b Binary files /dev/null and b/images/cornell.2015-09-29_12-50-41z.5000samp.png differ diff --git a/images/cornell.2015-09-30_01-56-56z.5000samp.png b/images/cornell.2015-09-30_01-56-56z.5000samp.png new file mode 100644 index 0000000..12c58f9 Binary files /dev/null and b/images/cornell.2015-09-30_01-56-56z.5000samp.png differ diff --git a/images/cornell.2015-09-30_02-04-20z.5000samp.png b/images/cornell.2015-09-30_02-04-20z.5000samp.png new file mode 100644 index 0000000..5ed6ce3 Binary files /dev/null and b/images/cornell.2015-09-30_02-04-20z.5000samp.png differ diff --git a/images/cornell.2015-09-30_02-09-52z.5000samp.png b/images/cornell.2015-09-30_02-09-52z.5000samp.png new file mode 100644 index 0000000..45a4632 Binary files /dev/null and b/images/cornell.2015-09-30_02-09-52z.5000samp.png differ diff --git a/images/cornell.2015-09-30_02-17-23z.5000samp.png b/images/cornell.2015-09-30_02-17-23z.5000samp.png new file mode 100644 index 0000000..2e1ce6d Binary files /dev/null and b/images/cornell.2015-09-30_02-17-23z.5000samp.png differ diff --git a/images/toBoldlyGo.gif b/images/toBoldlyGo.gif new file mode 100644 index 0000000..45d9d1b Binary files /dev/null and b/images/toBoldlyGo.gif differ diff --git a/scenes/USSEnterprise.obj b/scenes/USSEnterprise.obj new file mode 100644 index 0000000..a2b41ad --- /dev/null +++ b/scenes/USSEnterprise.obj @@ -0,0 +1,8058 @@ +# http://tf3dm.com/3d-model/uss-enterprise-ncc-1701-a-72153.html + +# Blender v2.72 (sub 0) OBJ File: 'USSEnterprise.blend' +# www.blender.org +v 0.428472 2.401108 0.502814 +v 0.451313 2.636127 0.387985 +v 0.830635 2.401108 0.624809 +v 0.875440 2.636127 0.516642 +v 1.201271 2.401108 0.822918 +v 1.266317 2.636127 0.725570 +v 1.526136 2.401108 1.089528 +v 1.608923 2.636127 1.006740 +v 1.792745 2.401108 1.414392 +v 1.890093 2.636127 1.349347 +v 1.990854 2.401108 1.785028 +v 2.099021 2.636127 1.740224 +v 2.112849 2.401108 2.187191 +v 2.227679 2.636127 2.164350 +v 2.154042 2.401108 2.605426 +v 2.271121 2.636127 2.605426 +v 2.112849 2.401108 3.023662 +v 2.227679 2.636127 3.046503 +v 1.990854 2.401108 3.425825 +v 2.099021 2.636127 3.470629 +v 1.792745 2.401108 3.796461 +v 1.890093 2.636127 3.861506 +v 1.526136 2.401108 4.121325 +v 1.608923 2.636127 4.204113 +v 1.201271 2.401108 4.387935 +v 1.266317 2.636127 4.485283 +v 0.830635 2.401108 4.586044 +v 0.875439 2.636127 4.694211 +v 0.428472 2.401108 4.708038 +v 0.451313 2.636127 4.822868 +v 0.199285 2.724997 1.655017 +v 0.381068 2.724997 1.710160 +v 0.548600 2.724997 1.799708 +v 0.695444 2.724997 1.920220 +v 0.815955 2.724997 2.067063 +v 0.905503 2.724997 2.234595 +v 0.960646 2.724997 2.416378 +v 0.979266 2.724997 2.605427 +v 0.960646 2.724997 2.794475 +v 0.905503 2.724997 2.976258 +v 0.815955 2.724997 3.143790 +v 0.695444 2.724997 3.290633 +v 0.548600 2.724997 3.411145 +v 0.381068 2.724997 3.500693 +v 0.199285 2.724997 3.555836 +v 0.148365 2.786363 1.911007 +v 0.281186 2.786363 1.951297 +v 0.403594 2.786363 2.016726 +v 0.510886 2.786363 2.104778 +v 0.598938 2.786363 2.212069 +v 0.664366 2.786363 2.334477 +v 0.704657 2.786363 2.467298 +v 0.718261 2.786363 2.605427 +v 0.704657 2.786363 2.743555 +v 0.664366 2.786363 2.876376 +v 0.598938 2.786363 2.998784 +v 0.510886 2.786363 3.106075 +v 0.403594 2.786363 3.194127 +v 0.281186 2.786363 3.259556 +v 0.148365 2.786363 3.299846 +v 0.190799 2.401108 1.697677 +v 0.364423 2.401108 1.750345 +v 0.524435 2.401108 1.835874 +v 0.664687 2.401108 1.950976 +v 0.779789 2.401108 2.091228 +v 0.865318 2.401108 2.251240 +v 0.917986 2.401108 2.424864 +v 0.935770 2.401108 2.605427 +v 0.917986 2.401108 2.785989 +v 0.865318 2.401108 2.959613 +v 0.779789 2.401108 3.119625 +v 0.664687 2.401108 3.259877 +v 0.524435 2.401108 3.374979 +v 0.364423 2.401108 3.460508 +v 0.190799 2.401108 3.513175 +v 0.124743 2.226103 2.328983 +v 0.176475 2.226103 2.356634 +v 0.221817 2.226103 2.393846 +v 0.259029 2.226103 2.439189 +v 0.286680 2.226103 2.490920 +v 0.286680 2.224290 2.719933 +v 0.259029 2.224290 2.771664 +v 0.221817 2.224290 2.817007 +v 0.176475 2.224290 2.854219 +v 0.131645 2.224290 2.881870 +v 0.248892 2.687974 1.405625 +v 0.478376 2.687974 1.475238 +v 0.689870 2.687974 1.588284 +v 0.875246 2.687974 1.740418 +v 1.027379 2.687974 1.925794 +v 1.140425 2.687974 2.137287 +v 1.210038 2.687974 2.366771 +v 1.233544 2.687974 2.605427 +v 1.210038 2.687974 2.844082 +v 1.140425 2.687974 3.073566 +v 1.027379 2.687974 3.285059 +v 0.875246 2.687974 3.470435 +v 0.689870 2.687974 3.622569 +v 0.478376 2.687974 3.735615 +v 0.248892 2.687974 3.805228 +v 0.293581 2.674420 1.180959 +v 0.566036 2.674420 1.263607 +v 0.817133 2.674420 1.397821 +v 1.037221 2.674420 1.578443 +v 1.217842 2.674420 1.798530 +v 1.352056 2.674420 2.049627 +v 1.434704 2.674420 2.322082 +v 1.462611 2.674420 2.605426 +v 1.434704 2.674420 2.888771 +v 1.352056 2.674420 3.161226 +v 1.217842 2.674420 3.412323 +v 1.037221 2.674420 3.632411 +v 0.817133 2.674420 3.813032 +v 0.566036 2.674420 3.947246 +v 0.293581 2.674420 4.029894 +v 0.186198 2.989043 2.464260 +v 0.117923 2.817720 1.948062 +v 0.221472 2.817720 2.061252 +v 0.316903 2.817720 2.146468 +v 0.400549 2.817720 2.215115 +v 0.469195 2.817720 2.298760 +v 0.520204 2.817720 2.394191 +v 0.551615 2.817720 2.497740 +v 0.562221 2.817720 2.605427 +v 0.551615 2.817720 2.713113 +v 0.520204 2.817720 2.816662 +v 0.469195 2.817720 2.912093 +v 0.400549 2.817720 2.995739 +v 0.316903 2.817720 3.064385 +v 0.221472 2.817720 3.115394 +v 0.117923 2.817720 3.146805 +v 0.111147 2.829494 1.962628 +v 0.208178 2.829494 2.093345 +v 0.297604 2.829494 2.175352 +v 0.375986 2.829494 2.239678 +v 0.440312 2.829494 2.318060 +v 0.488110 2.829494 2.407485 +v 0.517545 2.829494 2.504517 +v 0.527484 2.829494 2.605427 +v 0.517545 2.829494 2.706336 +v 0.488110 2.829494 2.803368 +v 0.440312 2.829494 2.892793 +v 0.375986 2.829494 2.971175 +v 0.297604 2.829494 3.035501 +v 0.208178 2.829494 3.083300 +v 0.111146 2.829494 3.112735 +v 0.101750 2.854550 1.993152 +v 0.189746 2.854550 2.137846 +v 0.270844 2.854550 2.215401 +v 0.341926 2.854550 2.273737 +v 0.400263 2.854550 2.344820 +v 0.443610 2.854550 2.425917 +v 0.470304 2.854550 2.513914 +v 0.479317 2.854550 2.605427 +v 0.470304 2.854550 2.696939 +v 0.443610 2.854550 2.784935 +v 0.400263 2.854550 2.866033 +v 0.341926 2.854550 2.937116 +v 0.270844 2.854550 2.995452 +v 0.189746 2.854550 3.038800 +v 0.101750 2.854550 3.065493 +v 0.091950 2.882759 2.026502 +v 0.170523 2.882759 2.184255 +v 0.242936 2.882759 2.257168 +v 0.306406 2.882759 2.309257 +v 0.358495 2.882759 2.372728 +v 0.397201 2.882759 2.445141 +v 0.421036 2.882759 2.523714 +v 0.429084 2.882759 2.605427 +v 0.421036 2.882759 2.687140 +v 0.397201 2.882759 2.765712 +v 0.358495 2.882759 2.838125 +v 0.306406 2.882759 2.901596 +v 0.242936 2.882759 2.953685 +v 0.170523 2.882759 2.992391 +v 0.091950 2.882759 3.016226 +v 0.063376 2.935363 2.872576 +v 0.114474 2.935363 2.857076 +v 0.161565 2.935363 2.831905 +v 0.202841 2.935363 2.798031 +v 0.236716 2.935363 2.756755 +v 0.261887 2.935363 2.709663 +v 0.277387 2.935363 2.658566 +v 0.282621 2.935363 2.605427 +v 0.277387 2.935363 2.552287 +v 0.261886 2.935363 2.501190 +v 0.236716 2.935363 2.454098 +v 0.202841 2.935363 2.387167 +v 0.161565 2.935363 2.307682 +v 0.114474 2.935363 2.305316 +v 0.063376 2.935363 2.102851 +v 0.051523 2.989043 2.789394 +v 0.091223 2.989043 2.777351 +v 0.127810 2.989043 2.757795 +v 0.159879 2.989043 2.731477 +v 0.186198 2.989043 2.699407 +v 0.205754 2.989043 2.662820 +v 0.217797 2.989043 2.623120 +v 0.221863 2.989043 2.581834 +v 0.159879 2.989043 2.412258 +v 0.127810 2.989043 2.350503 +v 0.091223 2.989043 2.348665 +v 0.051523 2.989043 2.303479 +v 0.112185 1.572123 1.218153 +v 0.198827 1.509212 1.218260 +v 0.251644 1.403255 1.227998 +v 0.264300 1.323179 1.228035 +v 0.305045 1.370555 -1.877710 +v 0.230556 1.208175 1.218367 +v 0.158934 1.128584 1.218311 +v 0.047913 1.085005 1.218217 +v 0.158944 1.677040 0.937879 +v 0.284231 1.586070 0.938034 +v 0.361685 1.452005 0.938149 +v 0.377914 1.298028 0.938203 +v 0.330112 1.150761 0.938189 +v 0.226544 1.035669 0.938108 +v 0.085118 0.972653 0.937973 +v 0.223044 1.768315 -0.622005 +v 0.374142 1.666486 -0.621800 +v 0.476626 1.489100 -0.621648 +v 0.498099 1.285366 -0.621576 +v 0.434850 1.090512 -0.621595 +v 0.292515 0.947409 -0.621702 +v 0.105388 0.864029 -0.621881 +v 0.109624 0.858051 0.642730 +v 0.301334 1.271826 -1.770128 +v 0.312733 1.334754 -1.770077 +v 0.328655 1.436867 -1.770068 +v 0.074129 1.953466 -0.200068 +v 0.206677 1.784041 0.642606 +v 0.371380 1.664451 0.642810 +v 0.318446 1.533730 -1.770102 +v 0.394318 1.469958 -1.183803 +v 0.318799 1.616113 -1.183928 +v 0.194107 1.715288 -1.184097 +v 0.494536 1.285790 0.643033 +v 0.431695 1.092193 0.643013 +v 0.295544 0.940893 0.642907 +v 0.473201 1.488209 0.642961 +v 0.266281 1.618065 -1.770174 +v 0.146212 1.675292 -1.770272 +v 0.057024 1.265994 -1.770213 +v 0.092808 0.947375 -1.157143 +v 0.241479 1.020895 -1.183848 +v 0.359897 1.141546 -1.183759 +v 0.412011 1.302094 -1.183743 +v 0.475319 1.067082 0.109403 +v 0.120239 0.808943 0.109090 +v 0.325213 0.900275 0.109285 +v 0.544601 1.280521 0.109424 +v 0.291855 1.793287 0.108954 +v 0.521079 1.503687 0.109345 +v 0.408822 1.697992 0.109179 +v 0.431806 1.478880 -0.959368 +v 0.238757 1.725592 -0.919595 +v 0.365732 1.636902 -0.774711 +v 0.097588 0.917353 -0.959575 +v 0.388378 1.123802 -0.959321 +v 0.444723 1.297385 -0.959304 +v 0.264288 0.991631 -0.959416 +v 0.110175 0.846273 -0.386269 +v 0.447894 1.082960 -0.385974 +v 0.385321 1.676641 -0.504915 +v 0.303054 0.932216 -0.386085 +v 0.490954 1.493802 -0.386029 +v 0.297426 1.782170 -0.366351 +v 0.513088 1.283804 -0.385955 +v 1.493032 2.651631 -2.598188 +v 1.354493 2.725137 -2.616995 +v 1.552491 2.624253 -2.591190 +v 1.726076 2.722816 -0.042957 +v 1.484007 3.097118 -2.686587 +v 1.654815 3.045792 0.097871 +v 1.381624 2.969088 -2.668038 +v 1.652569 2.650256 -0.080383 +v 1.555222 3.073169 0.104558 +v 1.727373 2.922343 0.059959 +v 1.354248 2.750373 -2.642563 +v 1.753457 2.822407 0.008412 +v 1.753310 2.747791 -2.641901 +v 1.354395 2.824988 0.009743 +v 1.727222 2.966852 -2.667466 +v 1.381775 2.924579 0.061111 +v 1.607652 2.650340 -2.597857 +v 1.455284 3.047083 0.098537 +v 1.624754 3.095827 -2.686257 +v 1.552629 2.624170 -0.093839 +v 1.753246 2.722902 -2.616433 +v 1.453038 2.651547 -0.079718 +v 1.555067 3.123205 -2.693299 +v 1.380479 2.725052 -0.041804 +v 1.541025 2.651692 -4.445485 +v 1.459654 2.861202 -4.624067 +v 1.516033 3.047244 -4.772202 +v 1.554981 2.607552 -4.408181 +v 1.468461 2.769373 -4.558311 +v 1.479563 2.924737 -4.676544 +v 1.554953 3.071091 -4.789927 +v 1.653471 2.858620 -4.621945 +v 1.634222 2.922501 -4.674706 +v 1.568740 2.650401 -4.444424 +v 1.593853 3.045953 -4.772438 +v 1.642243 2.767137 -4.556490 +v 1.555160 3.123149 -1.012046 +v 1.354579 2.725086 -1.073644 +v 1.493116 2.651581 -1.088831 +v 1.552574 2.624203 -1.094490 +v 1.753394 2.747741 -1.132186 +v 1.381710 2.969037 -1.113415 +v 1.484095 3.097065 -1.100079 +v 1.354332 2.750323 -1.131712 +v 1.624842 3.095774 -1.100316 +v 1.607609 2.568838 -1.163812 +v 1.753328 2.722853 -1.150487 +v 1.727308 2.966801 -1.113825 +v 1.484100 3.097062 -1.017421 +v 1.381715 2.969034 -1.032418 +v 1.354336 2.750320 -1.052996 +v 1.753398 2.747738 -1.053529 +v 1.501444 3.080591 -3.683239 +v 1.416682 2.943324 -3.652929 +v 1.394893 2.864048 -3.611308 +v 1.712542 2.861993 -3.610228 +v 1.475168 3.040851 -4.084122 +v 1.416661 2.943337 -4.045755 +v 1.394871 2.864061 -3.993073 +v 1.712520 2.862006 -3.991706 +v 1.554740 3.101357 -3.694184 +v 1.415660 2.784497 -3.569538 +v 1.473419 2.725986 -3.538815 +v 1.552694 2.704194 -3.527379 +v 1.554718 3.061617 -4.097969 +v 1.415639 2.784509 -3.940204 +v 1.473399 2.725998 -3.901316 +v 1.552674 2.704206 -3.886841 +v 1.727225 2.966851 -2.615155 +v 1.753249 2.722900 -2.567074 +v 1.607532 2.568884 -2.549573 +v 1.624757 3.095825 -2.632858 +v 1.727313 2.966798 -1.032879 +v 1.607736 2.650290 -1.089097 +v 1.624846 3.095772 -1.017687 +v 1.753332 2.722850 -1.074110 +v 1.691775 2.941545 -3.651994 +v 1.632243 2.724959 -3.538275 +v 1.606943 3.079564 -3.682700 +v 1.690752 2.782717 -3.568614 +v 1.354251 2.750371 -2.591692 +v 1.484010 3.097116 -2.633170 +v 1.381627 2.969087 -2.615695 +v 1.753313 2.747790 -2.591069 +v 1.555070 3.123203 -2.639495 +v 1.552493 2.569058 -2.543292 +v 1.354496 2.725136 -2.567604 +v 1.493555 2.569140 -2.549885 +v 1.555156 3.123152 -1.095303 +v 1.552570 2.569012 -1.168608 +v 1.354574 2.725089 -1.150072 +v 1.493632 2.569094 -1.163576 +v 1.691753 2.941558 -4.044572 +v 1.632223 2.724971 -3.900633 +v 1.633993 3.039824 -4.083439 +v 1.690731 2.782730 -3.939032 +v 1.753310 2.722863 -1.466533 +v 1.607591 2.568848 -1.472980 +v 1.727289 2.966812 -1.448778 +v 1.624823 3.095786 -1.442233 +v 1.552553 2.569022 -1.475306 +v 1.354557 2.725099 -1.466329 +v 1.555136 3.123163 -1.439818 +v 1.493615 2.569105 -1.472867 +v 1.484076 3.097076 -1.442118 +v 1.381692 2.969048 -1.448580 +v 1.354314 2.750334 -1.457439 +v 1.753376 2.747752 -1.457669 +v 0.132685 2.142496 2.462135 +v 0.099852 2.088318 2.494968 +v 0.050714 2.041885 2.544105 +v 0.190647 2.142496 2.602068 +v 0.144214 2.088318 2.602068 +v 0.074723 2.041885 2.602068 +v 0.132685 2.142496 2.742001 +v 0.099852 2.088318 2.709168 +v 0.050714 2.041885 2.660030 +v 0.318385 1.240444 -1.476959 +v 0.351953 1.407097 -1.476948 +v 0.066736 1.206266 -1.477122 +v 0.307628 1.209148 -1.477020 +v 0.339708 1.523272 -1.476989 +v 0.171873 1.693061 -1.477192 +v 0.281269 1.624424 -1.477076 +v 1.753346 2.747770 -1.994588 +v 0.300006 1.147295 -1.330449 +v 0.075813 1.137197 -1.330567 +v 0.376529 1.375902 -1.330366 +v 0.318129 1.192040 -1.330379 +v 0.253845 1.525363 -1.938830 +v 0.362387 1.510071 -1.330414 +v 0.117884 1.625643 -2.062768 +v 0.200127 1.585639 -1.988647 +v 1.354284 2.750352 -1.994762 +v 1.381661 2.969066 -2.001470 +v 0.294897 1.626889 -1.330514 +v 0.176808 1.706156 -1.330649 +v 1.484044 3.097095 -2.006348 +v 1.712528 2.862002 -3.861123 +v 1.394879 2.864057 -3.862392 +v 1.416668 2.943333 -3.911287 +v 1.505600 3.040847 -3.946897 +v 1.415646 2.784505 -3.813322 +v 1.473406 2.725994 -3.777229 +v 1.554725 3.061612 -3.959751 +v 1.552681 2.704201 -3.763794 +v 1.691760 2.941553 -3.910190 +v 1.598617 3.039819 -3.946263 +v 1.690738 2.782726 -3.812235 +v 1.632230 2.724967 -3.776595 +v 1.726067 2.722821 -0.207467 +v 1.619421 3.045798 -0.080104 +v 1.652560 2.650261 -0.241313 +v 1.727364 2.922349 -0.114392 +v 1.552621 2.624175 -0.253483 +v 1.453029 2.651552 -0.240711 +v 1.380470 2.725057 -0.206423 +v 1.555212 3.073175 -0.067336 +v 1.753447 2.822412 -0.161009 +v 1.354386 2.824994 -0.159805 +v 1.381766 2.924585 -0.113350 +v 1.485698 3.047089 -0.079503 +v 1.726065 2.722823 -0.252212 +v 1.652557 2.650263 -0.285084 +v 1.727361 2.922351 -0.161813 +v 1.624896 3.095742 -0.128512 +v 1.552618 2.624177 -0.296904 +v 1.380467 2.725059 -0.251198 +v 1.555210 3.123119 -0.116112 +v 1.453026 2.651554 -0.284500 +v 1.753445 2.822414 -0.207090 +v 1.381763 2.924587 -0.160802 +v 1.484149 3.097033 -0.127928 +v 1.354383 2.824996 -0.205921 +v 1.577627 2.499476 -2.418768 +v 1.551819 2.499558 -2.415823 +v 1.524182 2.499597 -2.418914 +v 1.577655 2.499460 -1.488318 +v 1.551847 2.499541 -1.480699 +v 1.524210 2.499580 -1.479556 +v 1.501212 2.551754 -2.517142 +v 1.501264 2.551723 -1.474539 +v 1.516561 2.516961 -1.477884 +v 1.516525 2.516982 -2.451657 +v 0.032537 2.465002 0.247029 +v 0.103150 1.551812 1.218148 +v 0.182312 1.494333 1.218246 +v 0.231251 1.409625 1.218319 +v 0.241506 1.312334 1.218353 +v 0.211302 1.219284 1.218344 +v 0.145863 1.146564 1.218292 +v 0.056502 1.106747 1.218207 +v 0.103897 1.543208 1.250644 +v 0.179710 1.488160 1.250738 +v 0.226578 1.407036 1.250807 +v 0.236399 1.313862 1.250840 +v 0.207473 1.224749 1.250831 +v 0.144802 1.155106 1.250782 +v 0.059223 1.116974 1.250701 +v 0.343723 1.777484 -1.050826 +v 0.406759 1.819806 -0.565925 +v 0.051523 3.051488 2.303479 +v 0.091223 3.051488 2.348665 +v 0.044698 3.105677 2.569301 +v 0.073708 3.078323 2.540415 +v 0.130956 3.051488 2.464260 +v 0.120042 3.051488 2.350503 +v 0.131395 3.051488 2.412258 +v 0.058768 3.105677 2.603478 +v 0.099707 3.078323 2.603566 +v 0.127062 3.037384 2.603625 +v 0.136668 2.989093 2.603646 +v 0.044551 3.105677 2.637595 +v 0.073437 3.078323 2.666605 +v 0.092738 3.037384 2.685989 +v 0.099515 2.989093 2.692796 +v 0.100518 2.401108 1.688786 +v 0.219355 2.401108 0.482218 +v 1.672077 2.758376 -0.026830 +v 1.623168 2.980043 0.069824 +v 1.621627 2.708577 -0.052516 +v 1.554816 2.998832 0.074414 +v 1.672967 2.895317 0.043804 +v 1.690869 2.826728 0.008426 +v 1.416983 2.828500 0.009340 +v 1.435775 2.896852 0.044595 +v 1.486225 2.980929 0.070281 +v 1.553036 2.690673 -0.061751 +v 1.484684 2.709463 -0.052060 +v 1.434885 2.759911 -0.026038 +v 1.672061 2.757850 -0.068753 +v 1.623153 2.979516 0.027901 +v 1.621611 2.708050 -0.094439 +v 1.554800 2.998306 0.032491 +v 1.672951 2.894790 0.001881 +v 1.690853 2.826201 -0.033497 +v 1.416967 2.827973 -0.032583 +v 1.435759 2.896325 0.002672 +v 1.486210 2.980402 0.028358 +v 1.553020 2.690146 -0.103674 +v 1.484668 2.708936 -0.093983 +v 1.434869 2.759384 -0.067961 +v 1.712539 2.861995 -3.655508 +v 1.394890 2.864050 -3.656621 +v 1.416680 2.943326 -3.699556 +v 1.499593 3.073419 -3.730823 +v 1.415657 2.784498 -3.613535 +v 1.473416 2.725988 -3.581842 +v 1.554737 3.094184 -3.742112 +v 1.552692 2.704195 -3.570046 +v 1.691772 2.941546 -3.698592 +v 1.608937 3.072391 -3.730266 +v 1.690749 2.782719 -3.612581 +v 1.632241 2.724960 -3.581285 +v 0.192106 1.751434 0.790247 +v 0.344795 1.640567 0.790436 +v 0.439190 1.477180 0.790576 +v 0.458968 1.289525 0.790643 +v 0.400711 1.110049 0.790625 +v 0.274490 0.969785 0.790526 +v 0.102132 0.892985 0.790362 +v 0.324523 2.240687 2.446783 +v 0.392584 2.263214 2.346195 +v 0.099948 2.244183 2.239800 +v 0.252387 2.962076 2.593686 +v 0.153166 2.948720 2.318336 +v 0.207209 1.062222 1.095481 +v 0.301650 1.167170 1.095555 +v 0.345239 1.301457 1.095569 +v 0.330440 1.441864 1.095519 +v 0.211577 2.962076 2.459155 +v 0.233954 2.962076 2.686353 +v 0.057478 2.962076 2.831183 +v 0.224146 2.948720 2.742486 +v 0.102903 2.962076 2.326888 +v 0.144768 2.962076 2.328991 +v 0.247734 2.962076 2.546445 +v 0.057478 2.961664 2.292536 +v 0.231769 2.962076 2.501020 +v 0.211577 2.962076 2.728218 +v 0.335396 2.263843 2.926831 +v 0.153166 2.948720 2.813466 +v 0.267504 2.948720 2.599556 +v 0.078248 1.004759 1.095359 +v 0.181462 2.962076 2.764912 +v 0.144768 2.962076 2.795027 +v 0.259813 1.564113 1.095414 +v 0.145567 1.647066 1.095273 +v 0.192152 2.948720 2.781471 +v 0.060427 2.948514 2.159352 +v 0.102903 2.962076 2.817404 +v 0.247734 2.962076 2.640927 +v 0.181462 2.962076 2.399653 +v 0.055092 2.244183 2.234273 +v 0.247920 2.948720 2.698008 +v 0.265713 2.263843 2.984018 +v 0.368632 2.240687 2.601671 +v 0.129274 2.250607 2.998332 +v 0.359797 2.240687 2.691382 +v 0.335396 2.263214 2.276512 +v 0.265713 2.263214 2.219324 +v 0.192152 2.948720 2.393410 +v 0.262560 2.948720 2.649747 +v 0.246827 2.948720 2.501105 +v 0.108689 2.948720 2.316102 +v 0.262560 2.948720 2.549366 +v 0.224146 2.948720 2.456627 +v 0.108689 2.948720 2.837240 +v 0.060427 2.948720 2.851880 +v 0.325002 2.240687 2.757041 +v 0.099948 2.250607 3.026225 +v 0.149311 2.244183 2.263092 +v 0.359797 2.240687 2.511960 +v 0.392584 2.263843 2.857147 +v 0.584834 2.321844 2.219602 +v 0.584834 2.321844 2.987470 +v 0.498892 2.321844 2.114881 +v 0.498892 2.321844 3.092191 +v 0.688021 2.321844 2.738355 +v 0.274695 2.321844 3.241994 +v 0.394171 2.321844 3.178133 +v 0.701299 2.321844 2.603536 +v 0.145056 2.321844 1.925752 +v 0.648695 2.321844 2.339077 +v 0.394171 2.321844 2.028938 +v 0.077647 2.321844 1.919113 +v 0.648695 2.321844 2.867994 +v 0.145056 2.321844 3.281320 +v 0.688021 2.321844 2.468716 +v 0.274695 2.321844 1.965077 +v 0.314756 2.636127 0.377124 +v 0.323913 2.401108 0.492516 +v 0.145659 2.401108 1.693232 +v 0.166158 2.667501 1.022331 +v 0.286911 2.659499 0.863485 +v 0.115060 2.674420 1.163376 +v 0.138645 2.667936 1.028787 +v 0.052627 2.684586 1.329028 +v 0.110555 2.681197 1.277466 +v 0.230751 2.678150 0.363945 +v 0.314732 2.669724 0.374805 +v 0.166134 2.688218 1.020012 +v 0.286887 2.680216 0.861166 +v 0.115036 2.684007 1.161057 +v 0.138621 2.688652 1.026468 +v 0.052603 2.694172 1.326708 +v 0.110531 2.690784 1.275147 +v 0.114796 2.401108 0.471920 +v 0.055377 2.401108 1.684340 +v 0.111351 2.321844 1.922432 +v 0.043942 2.321844 1.915793 +v 0.116100 2.454780 0.445310 +v 0.223203 2.462719 0.443145 +v 0.314555 2.483611 0.443375 +v 0.314756 2.636127 0.246049 +v 0.230751 2.674030 0.232869 +v 0.310904 2.657659 0.243730 +v 0.114796 2.401108 0.340844 +v 0.116100 2.454780 0.314235 +v 0.223203 2.462719 0.312070 +v 0.309437 2.487592 0.312300 +v 0.056732 1.953082 0.678167 +v 0.114796 2.335214 0.471920 +v 0.062516 2.401108 0.466771 +v 0.114796 2.335214 0.340844 +v 0.045352 1.701151 0.937753 +v 0.041987 1.669051 1.095158 +v 0.062516 2.335214 0.335695 +v 0.062516 2.401108 0.335695 +v 0.062516 2.335214 0.466771 +v 0.080277 1.828956 -0.381558 +v 1.485361 3.091249 -3.385416 +v 0.032807 2.401108 1.682117 +v 0.041009 1.953060 0.977736 +v 0.073136 1.953189 0.187327 +v 0.059137 1.953361 0.581628 +v 1.656071 2.777029 -4.235336 +v 1.608227 3.042385 -4.421340 +v 1.595684 2.717414 -4.190361 +v 1.657125 2.940961 -4.358953 +v 1.675356 2.858853 -4.297033 +v 1.434641 2.860974 -4.298634 +v 1.453636 2.942798 -4.360338 +v 1.501283 3.043446 -4.421533 +v 1.553926 2.688133 -4.158688 +v 1.512198 2.718474 -4.191161 +v 1.452582 2.778866 -4.236709 +v 1.554820 3.063829 -4.435523 +v 0.060161 1.364330 -2.266561 +v 1.493587 2.569122 -1.983076 +v 0.282375 1.355369 -1.957947 +v 0.249994 1.459453 -1.980553 +v 1.555105 3.123182 -2.008133 +v 0.120413 2.678150 0.222489 +v 0.116402 2.678150 0.353187 +v 1.357443 2.798300 -3.312869 +v 1.750051 2.795759 -3.311779 +v 1.384376 2.935489 -3.354847 +v 1.555012 3.116915 -3.396459 +v 1.454499 2.652966 -3.239752 +v 1.552482 2.626031 -3.228219 +v 1.357267 2.725284 -3.270740 +v 1.724384 2.933290 -3.353904 +v 1.623313 3.089979 -3.384871 +v 1.750431 2.723084 -3.269809 +v 1.650803 2.651696 -3.239208 +v 0.038009 2.678150 0.214187 +v 0.031189 2.401108 0.333121 +v 0.033856 2.678150 0.345421 +v 0.031412 2.449598 0.309035 +v 0.314756 2.636127 0.205569 +v 0.230751 2.674030 0.192389 +v 0.307800 2.657659 0.212681 +v 0.116100 2.454780 0.273755 +v 0.223203 2.462719 0.271590 +v 0.309437 2.487592 0.271820 +v 0.120413 2.678150 0.182009 +v 0.048761 2.678150 0.173707 +v 0.046722 2.657138 0.174806 +v 0.031412 2.449598 0.268555 +v 0.031412 2.437356 0.309035 +v 0.031412 2.437356 0.268555 +v 0.048782 2.678031 0.159891 +v 0.044704 2.636009 0.162088 +v 0.031433 2.449480 0.254739 +v 0.031433 2.437238 0.254739 +v 0.038009 2.692061 0.214187 +v 0.033856 2.684679 0.345421 +v 0.048761 2.692061 0.173707 +v 0.048782 2.689298 0.163517 +v 0.289145 2.662647 0.199941 +v 0.284433 2.480380 0.271753 +v 0.288901 2.649387 0.201067 +v 0.284929 2.498675 0.263582 +v 0.032543 2.465484 0.260665 +v 0.223961 2.480090 0.263889 +v 0.116493 2.470963 0.265733 +v 0.310064 2.505120 0.264002 +v 0.230763 2.655079 0.193549 +v 0.120460 2.657138 0.182928 +v 0.230763 2.655079 0.214039 +v 0.120460 2.657138 0.203419 +v 0.046722 2.657138 0.195297 +v 0.288901 2.649387 0.221558 +v 0.284929 2.498675 0.284073 +v 0.032543 2.465484 0.281156 +v 0.223961 2.480090 0.284379 +v 0.116493 2.470963 0.286223 +v 1.354528 2.725116 -1.988029 +v 1.624792 3.095804 -2.006261 +v 1.727259 2.966830 -2.001319 +v 0.161812 1.582820 -2.068119 +v 0.289677 1.445220 -1.897635 +v 1.607563 2.568865 -1.982988 +v 1.753281 2.722881 -1.987885 +v 0.339174 1.693520 -0.883548 +v 0.411963 1.736186 -0.575862 +v 0.103871 1.614079 -2.098121 +v 1.577642 2.499467 -1.929095 +v 1.551834 2.499549 -1.923690 +v 1.524197 2.499588 -1.924553 +v 0.374348 1.798045 -0.815246 +v 0.388901 1.722669 -0.673345 +v 1.516545 2.516971 -1.926587 +v 1.501239 2.551738 -1.974655 +v 0.221781 1.520603 -2.018724 +v 0.279581 1.391457 -1.957981 +v 0.293509 1.267781 -1.875379 +v 0.072307 1.314689 -2.242423 +v 0.088335 1.720162 -1.330722 +v 1.554976 2.684808 -4.473363 +v 1.554972 2.762065 -4.538545 +v 1.554967 2.774671 -4.562563 +v 1.554962 2.916578 -4.668909 +v 1.554957 2.993834 -4.734090 +v 0.077520 2.244183 2.235927 +v 0.027477 2.244183 2.232064 +v 0.021902 2.321844 1.914133 +v 0.013670 2.244183 2.230959 +v 0.031301 2.419232 0.321078 +v 0.035705 1.587260 1.218073 +v 0.035659 1.565085 1.218078 +v 0.040025 1.555768 1.250578 +v 1.554355 2.921266 -0.001551 +v 1.553910 2.844226 -0.035592 +v 1.553465 2.767186 -0.069633 +v 0.058873 1.635688 -2.082583 +v 0.096985 1.732811 -1.184189 +v 0.111453 1.798851 -0.622116 +v 0.085868 1.705188 -1.477256 +v 0.073037 1.685403 -1.770325 +v 0.119309 1.753806 -0.939740 +v 0.051867 1.624105 -2.107054 +v 1.552053 2.519828 -1.479124 +v 1.586358 2.519742 -2.456960 +v 1.586396 2.519719 -1.483840 +v 1.552016 2.519850 -2.453041 +v 1.586378 2.519730 -1.944830 +v 1.600592 2.552698 -1.970433 +v 1.552336 2.552867 -2.513596 +v 1.600565 2.552714 -2.519100 +v 1.552388 2.552836 -1.476562 +v 1.600617 2.552683 -1.476554 +v 0.084587 2.678150 0.177858 +v 0.083591 2.657138 0.178867 +v 0.074518 2.468223 0.283689 +v 0.073756 2.452189 0.311635 +v 0.075129 2.678150 0.349304 +v 0.073756 2.452189 0.271155 +v 0.083591 2.657138 0.199358 +v 0.074518 2.468223 0.263199 +v 0.079211 2.678150 0.218338 +v 0.437206 2.490968 0.458909 +v 0.847766 2.490968 0.583451 +v 1.226141 2.490968 0.785697 +v 1.557790 2.490968 1.057874 +v 1.829967 2.490968 1.389522 +v 2.032212 2.490968 1.767897 +v 2.156754 2.490968 2.178457 +v 2.198807 2.490968 2.605426 +v 2.156754 2.490968 3.032395 +v 2.032212 2.490968 3.442956 +v 1.829967 2.490968 3.821331 +v 1.557790 2.490968 4.152979 +v 1.226141 2.490968 4.425157 +v 0.847766 2.490968 4.627402 +v 0.437205 2.490968 4.751944 +v 0.309437 2.487592 0.292060 +v 0.226535 2.663500 0.942908 +v 0.112808 2.677809 1.220421 +v 0.272742 2.673937 0.369375 +v 0.226511 2.684217 0.940589 +v 0.112784 2.687395 1.218102 +v 0.270828 2.665845 0.238299 +v 0.216113 2.671178 1.104873 +v 0.073367 1.367828 -2.213065 +v 0.259333 1.362019 -1.957377 +v 0.232234 1.469464 -1.984319 +v 0.158436 1.578243 -2.050001 +v 0.109947 1.605704 -2.075109 +v 0.208623 1.516716 -2.007615 +v 0.267975 1.405693 -1.957406 +v 0.066425 1.614094 -2.082585 +v 0.224585 1.360504 -2.137573 +v 0.234931 1.297692 -2.159190 +v 0.231249 1.360482 -2.161467 +v 0.171763 1.496523 -2.112888 +v 0.202799 1.445257 -2.122453 +v 0.215046 1.405228 -2.130356 +v 0.160765 1.953815 -0.200068 +v 0.158566 1.953799 0.678167 +v 0.142844 1.953830 0.977736 +v 0.174970 1.953804 0.187327 +v 0.160972 1.953812 0.581628 +v 0.176225 1.831699 -0.200255 +v 0.177818 1.835845 0.158049 +v 0.042632 1.813319 0.976094 +v 0.177536 1.836437 0.604408 +v 0.177622 1.836058 0.720038 +v 0.076425 1.906952 -0.260758 +v 0.177451 1.836257 0.976141 +v 0.072101 2.031611 -0.106539 +v 0.059829 2.031518 0.558119 +v 0.057754 2.032295 0.640791 +v 0.070946 2.031961 0.217920 +v 0.039559 2.032264 0.977681 +v 1.730840 2.777029 -4.235336 +v 1.700583 2.782717 -3.587576 +v 1.700580 2.782719 -3.612581 +v 1.724032 2.767137 -4.427499 +v 1.710973 2.782726 -3.812235 +v 1.718288 2.782730 -3.939032 +v 1.698468 2.810800 -3.627787 +v 1.698526 2.811060 -3.829709 +v 1.698436 2.810761 -3.957657 +v 1.698537 2.811043 -3.583483 +v 1.663884 2.810176 -4.260330 +v 1.650969 2.810214 -4.586029 +v 1.717651 2.810800 -3.627787 +v 1.728114 2.811060 -3.829709 +v 1.735345 2.810761 -3.957657 +v 1.717721 2.811043 -3.602445 +v 1.748005 2.810176 -4.260330 +v 1.742112 2.810214 -4.457037 +v 1.554965 2.813299 -4.595154 +v 1.648008 2.767137 -4.623283 +v 1.565654 2.774671 -4.710088 +v 1.696774 2.767137 -4.519486 +v 1.656734 2.810214 -4.652822 +v 1.714854 2.810214 -4.549025 +v 1.565652 2.813299 -4.742679 +v 0.049694 1.931284 0.975197 +v 0.114135 1.917645 0.975197 +v 0.050780 1.837743 0.978493 +v 0.114953 1.853097 0.978525 +v 0.049694 1.931284 0.965331 +v 0.114135 1.917645 0.965331 +v 0.050780 1.837743 0.955333 +v 0.114953 1.853097 0.955364 +v 1.624066 3.038488 -3.673562 +v 1.646049 3.037645 -3.375371 +v 1.649247 3.040021 -2.004671 +v 1.648398 3.041794 -1.104522 +v 1.647474 3.043722 -0.138503 +v 1.622905 3.038462 -3.722053 +v 1.649828 3.038806 -2.627037 +v 1.648320 3.041956 -1.022402 +v 1.648720 3.041122 -1.444296 +v 1.649876 3.038705 -2.680067 +v 1.460974 3.053962 -0.136138 +v 1.466353 3.056497 -3.379154 +v 1.462690 3.057755 -2.682353 +v 1.462201 3.056680 -2.005205 +v 1.482346 3.045657 -3.675525 +v 1.461869 3.055938 -1.443659 +v 1.483355 3.044957 -3.723982 +v 1.461529 3.055197 -1.021062 +v 1.462651 3.057670 -2.629172 +v 1.461615 3.055381 -1.103303 +v 1.625751 2.650679 -1.156731 +v 1.625714 2.650718 -1.985591 +v 1.625678 2.650731 -2.558873 +v 1.625740 2.650697 -1.469554 +v 1.474596 2.650563 -2.559133 +v 1.474709 2.650455 -1.469457 +v 1.474747 2.650416 -1.156536 +v 1.474667 2.650490 -1.985660 +v 0.129326 1.610604 1.155057 +v 0.230141 1.537402 1.155182 +v 0.292467 1.429524 1.155275 +v 0.305526 1.305622 1.155318 +v 0.267061 1.187120 1.155307 +v 0.183722 1.094509 1.155241 +v 0.069920 1.043801 1.155133 +v 0.038930 1.629257 1.154960 +v 0.490960 1.472723 0.653692 +v 0.512295 1.310241 0.653764 +v 0.407715 1.322479 0.938203 +v 0.391486 1.436520 0.938149 +v 0.357487 1.426378 1.095519 +v 0.372285 1.325908 1.095569 +v 0.492986 1.313976 0.790643 +v 0.473208 1.461694 0.790576 +v 0.262192 1.382877 1.234035 +v 0.267115 1.350127 1.234073 +v 0.314036 1.412432 1.155275 +v 0.327096 1.330063 1.155318 +v 0.024113 1.084343 1.230476 +v 0.061140 0.948051 0.937973 +v 0.094145 0.833449 0.665285 +v 0.079474 0.868383 0.790362 +v 0.058473 0.980157 1.095359 +v 0.050145 1.019199 1.155133 +v 1.490126 3.088092 -3.473652 +v 1.368538 2.838969 -3.393963 +v 1.738938 2.836573 -3.392876 +v 1.393947 2.891031 -3.401748 +v 1.554932 3.112305 -3.484666 +v 1.460104 2.674600 -3.328355 +v 1.552544 2.649188 -3.316851 +v 1.392754 2.742827 -3.359265 +v 1.714723 2.888956 -3.400807 +v 1.618463 3.086894 -3.473109 +v 1.713529 2.740752 -3.358336 +v 1.645304 2.673401 -3.327812 +v 1.639536 3.037895 -3.463717 +v 1.471092 3.053285 -3.466960 +v 1.624884 3.095749 -0.348016 +v 1.743974 2.875512 -0.406704 +v 1.641493 2.650270 -0.483564 +v 1.726053 2.722830 -0.455107 +v 1.461111 3.054267 -0.354592 +v 1.647683 3.043286 -0.356704 +v 1.358306 2.817367 -0.418944 +v 1.484137 3.097040 -0.347510 +v 1.372039 2.877748 -0.410522 +v 1.753433 2.814785 -0.419956 +v 1.462923 2.651561 -0.483059 +v 1.555197 3.123126 -0.337284 +v 1.380456 2.725065 -0.454229 +v 1.552607 2.624183 -0.493798 +v 1.485090 3.092423 -3.245687 +v 1.356804 2.775758 -3.178843 +v 1.750702 2.773210 -3.177839 +v 1.383826 2.964744 -3.217522 +v 1.555023 3.118172 -3.255864 +v 1.462204 2.652699 -3.111473 +v 1.552483 2.625675 -3.100847 +v 1.356712 2.725255 -3.140026 +v 1.724951 2.962537 -3.216652 +v 1.623601 3.091149 -3.245185 +v 1.750994 2.723048 -3.139168 +v 1.642175 2.651425 -3.110971 +v 1.646814 3.037857 -3.236347 +v 1.465621 3.056748 -3.239831 +v 1.753358 2.722835 -0.609048 +v 1.633098 2.650275 -0.634155 +v 1.727340 2.966781 -0.539996 +v 1.624874 3.095755 -0.514557 +v 1.552599 2.624188 -0.643185 +v 1.354604 2.725070 -0.608272 +v 1.555188 3.123132 -0.505091 +v 1.470432 2.651566 -0.633709 +v 1.753425 2.747722 -0.574581 +v 1.381742 2.969017 -0.539223 +v 1.484128 3.097045 -0.514110 +v 1.354363 2.750304 -0.573688 +v 1.647841 3.042955 -0.522257 +v 1.461215 3.054498 -0.520337 +v 1.467099 2.651563 -0.566839 +v 1.555192 3.123129 -0.430605 +v 1.380451 2.725068 -0.539895 +v 1.552603 2.624186 -0.576875 +v 1.624878 3.095752 -0.440633 +v 1.733913 2.935231 -0.467578 +v 1.636824 2.650272 -0.567311 +v 1.726049 2.722832 -0.540717 +v 1.461169 3.054395 -0.446767 +v 1.647771 3.043102 -0.448772 +v 1.358172 2.774526 -0.503264 +v 1.484132 3.097043 -0.440160 +v 1.382763 2.937467 -0.466759 +v 1.753428 2.771945 -0.504210 +v 1.412283 2.967027 -2.652634 +v 1.385425 2.752456 -2.627641 +v 1.412367 2.966976 -1.127471 +v 1.385507 2.752407 -1.145421 +v 1.412372 2.966973 -1.048009 +v 1.385512 2.752404 -1.068196 +v 1.385428 2.752455 -2.577734 +v 1.412285 2.967025 -2.601281 +v 1.412349 2.966987 -1.456284 +v 1.385490 2.752418 -1.464975 +v 1.385460 2.752435 -1.992116 +v 1.412319 2.967005 -1.998696 +v 1.388560 2.799474 -3.285244 +v 1.414982 2.934065 -3.326427 +v 1.399445 2.839374 -3.364801 +v 1.424372 2.890449 -3.372438 +v 1.389406 2.818180 -0.446160 +v 1.402879 2.877418 -0.437898 +v 1.387933 2.777360 -3.153758 +v 1.414442 2.962765 -3.191704 +v 1.412398 2.966957 -0.564160 +v 1.385538 2.752389 -0.597972 +v 1.389275 2.776152 -0.528883 +v 1.413400 2.936004 -0.493069 +v 1.723882 2.749859 -2.627126 +v 1.698284 2.964807 -2.652211 +v 1.723965 2.749809 -1.145754 +v 1.698369 2.964756 -1.127738 +v 1.723969 2.749807 -1.068573 +v 1.698287 2.964805 -2.600881 +v 1.698373 2.964754 -1.048312 +v 1.723885 2.749857 -2.577248 +v 1.698351 2.964767 -1.456402 +v 1.723947 2.749820 -1.465127 +v 1.723918 2.749838 -1.991965 +v 1.720684 2.796926 -3.284427 +v 1.695499 2.931875 -3.325761 +v 1.698321 2.964785 -1.998569 +v 1.709780 2.836973 -3.364002 +v 1.686020 2.888373 -3.371784 +v 1.714722 2.875182 -0.433893 +v 1.724004 2.815595 -0.446896 +v 1.721324 2.774800 -3.153002 +v 1.696056 2.960573 -3.191086 +v 1.698400 2.964737 -0.564682 +v 1.723995 2.749791 -0.598618 +v 1.704850 2.933779 -0.493623 +v 1.723999 2.773559 -0.529568 +v 1.381637 2.997077 -2.676854 +v 1.682693 2.998361 0.083305 +v 1.427041 3.000015 0.084157 +v 1.502021 3.000174 -4.735449 +v 1.609363 2.998520 -4.734888 +v 1.457117 3.006339 -3.666843 +v 1.452688 3.003385 -4.069380 +v 1.381614 2.997024 -2.623994 +v 1.380956 2.995481 -1.025425 +v 1.381008 2.995595 -1.107188 +v 1.656185 3.002068 -4.068506 +v 1.381157 2.995942 -1.445550 +v 1.471430 3.003380 -3.933215 +v 1.634404 3.002064 -3.932403 +v 1.445765 3.000020 -0.092507 +v 1.660894 2.998367 -0.093278 +v 1.430540 3.004253 -0.145615 +v 1.642302 2.947490 0.059827 +v 1.466841 2.948625 0.060412 +v 1.642286 2.946963 0.017904 +v 1.466825 2.948098 0.018489 +v 1.457737 3.005908 -3.714597 +v 1.627014 3.003416 -4.397370 +v 1.482976 3.004775 -4.398021 +v 1.384949 2.983393 -3.369815 +v 1.554954 3.041408 -4.768473 +v 1.381349 2.996406 -2.003769 +v 1.554629 2.968706 0.019411 +v 1.650081 3.001240 -3.665275 +v 1.722509 2.970939 -3.367124 +v 1.725583 2.985289 -2.003383 +v 1.725079 2.986369 -1.108096 +v 1.678168 2.997089 -0.147460 +v 1.649365 3.001225 -3.713039 +v 1.725928 2.984548 -2.622471 +v 1.725033 2.986468 -1.026428 +v 1.725270 2.985960 -1.446018 +v 1.725956 2.984487 -2.675225 +v 1.668424 2.954059 -3.439546 +v 1.391544 2.964333 -3.441905 +v 1.731042 2.952214 -0.375915 +v 1.376981 2.959834 -0.376081 +v 1.723198 2.982307 -3.228780 +v 1.384287 2.994788 -3.231260 +v 1.380774 2.995044 -0.527593 +v 1.724748 2.987077 -0.529073 +v 1.727231 2.975045 -0.455997 +v 1.381137 2.982858 -0.454448 +v 1.478743 2.651571 -0.800464 +v 1.555178 3.123138 -0.690837 +v 1.354595 2.725076 -0.778783 +v 1.552590 2.624194 -0.808542 +v 1.724853 2.986854 -0.711302 +v 1.380841 2.995204 -0.709997 +v 1.723985 2.749797 -0.770808 +v 1.698390 2.964743 -0.741883 +v 1.624864 3.095761 -0.698902 +v 1.727330 2.966788 -0.720587 +v 1.623805 2.650280 -0.800844 +v 1.753348 2.722840 -0.779445 +v 1.354353 2.750310 -0.749305 +v 1.484117 3.097052 -0.698522 +v 1.381732 2.969023 -0.719928 +v 1.753415 2.747728 -0.750066 +v 1.385528 2.752394 -0.770260 +v 1.412389 2.966963 -0.741441 +v 1.461330 3.054754 -0.703801 +v 1.648016 3.042589 -0.705509 +v 1.318455 2.725086 -1.073644 +v 1.318213 2.750320 -1.052996 +v 1.318471 2.725076 -0.778783 +v 1.318229 2.750310 -0.749305 +v 1.351437 2.969017 -0.539223 +v 1.350468 2.995044 -0.527593 +v 1.350535 2.995204 -0.709997 +v 1.351427 2.969023 -0.719928 +v 1.791752 2.747738 -1.053529 +v 1.791686 2.722850 -1.074110 +v 1.791703 2.722840 -0.779445 +v 1.791769 2.747728 -0.750066 +v 1.757642 2.966781 -0.539996 +v 1.755051 2.987077 -0.529073 +v 1.755155 2.986854 -0.711302 +v 1.757632 2.966788 -0.720587 +v 1.371840 2.969017 -0.539223 +v 1.371830 2.969023 -0.719928 +v 1.370938 2.995204 -0.709997 +v 1.370871 2.995044 -0.527593 +v 1.339295 2.725086 -1.073644 +v 1.339312 2.725076 -0.778783 +v 1.339070 2.750310 -0.749305 +v 1.339053 2.750320 -1.052996 +v 1.770915 2.722850 -1.074110 +v 1.770931 2.722840 -0.779445 +v 1.770997 2.747728 -0.750066 +v 1.770981 2.747738 -1.053529 +v 1.738148 2.966781 -0.539996 +v 1.738138 2.966788 -0.720587 +v 1.735661 2.986854 -0.711302 +v 1.735557 2.987077 -0.529073 +v 1.580013 2.568971 -2.546432 +v 1.523024 2.569099 -2.546588 +v 1.523101 2.569053 -1.166092 +v 1.580089 2.568925 -1.166210 +v 1.590053 3.109430 -0.122312 +v 1.519679 3.110076 -0.122020 +v 1.576671 3.050716 -3.953007 +v 1.530162 3.051229 -3.953323 +v 0.043359 2.689090 0.966949 +v 0.044961 2.683172 0.632803 +v 0.126576 2.683230 0.678896 +v 0.134670 2.686785 0.906737 +v 0.175501 2.684713 0.792467 +v 0.052691 2.712187 0.913656 +v 0.053792 2.708118 0.683965 +v 0.109894 2.708159 0.715649 +v 0.115458 2.710602 0.872267 +v 0.143525 2.709178 0.793718 +v 0.023392 2.686524 0.853223 +v 0.023925 2.684552 0.741918 +v 0.052398 2.684572 0.757272 +v 0.055094 2.685756 0.833166 +v 0.068695 2.685066 0.795103 +v 0.068612 2.142498 2.311956 +v 0.124743 2.142498 2.328983 +v 0.176475 2.142498 2.356634 +v 0.221817 2.142498 2.393846 +v 0.259029 2.142498 2.439189 +v 0.286680 2.142498 2.490920 +v 0.303707 2.142498 2.547052 +v 0.309457 2.142498 2.605427 +v 0.303707 2.142498 2.663801 +v 0.286680 2.142498 2.715619 +v 0.259029 2.142498 2.771664 +v 0.221817 2.142498 2.817007 +v 0.176475 2.142498 2.854219 +v 0.131645 2.142498 2.881870 +v 0.068612 2.142498 2.898897 +v 0.039424 2.142498 2.309081 +v 0.324523 2.216429 2.446783 +v 0.099948 2.216429 2.252581 +v 0.055092 2.216429 2.247054 +v 0.368632 2.216429 2.601671 +v 0.129274 2.216429 2.983865 +v 0.359797 2.216429 2.691382 +v 0.325002 2.216429 2.756562 +v 0.099948 2.216429 3.011758 +v 0.149311 2.216429 2.275873 +v 0.359797 2.216429 2.511960 +v 0.054018 2.142498 2.310519 +v 0.077520 2.216429 2.248708 +v 0.019643 2.142498 2.307644 +v 0.027477 2.216429 2.244845 +v 0.009753 2.142498 2.306925 +v 0.013670 2.216429 2.243740 +v 0.372447 2.655274 4.426381 +v 0.720738 2.655274 4.320729 +v 1.041725 2.655274 4.149158 +v 1.323072 2.655274 3.918262 +v 1.553968 2.655274 3.636915 +v 1.725539 2.655274 3.315928 +v 1.831192 2.655274 2.967637 +v 0.720738 2.655274 0.890124 +v 0.372447 2.655274 0.784472 +v 1.041725 2.655274 1.061696 +v 1.323072 2.655274 1.292591 +v 1.553968 2.655274 1.573938 +v 1.725539 2.655274 1.894925 +v 1.831192 2.655274 2.243216 +v 1.866866 2.655274 2.605426 +v 0.300834 2.647813 0.620305 +v 0.300810 2.674970 0.617985 +v 0.249626 2.679077 0.654982 +v 0.030487 1.291363 -2.024685 +v 0.030523 1.287496 -1.984415 +v 0.025149 1.282170 -2.021550 +v 0.025310 1.278303 -1.988316 +v 0.002980 1.270826 -2.008147 +v 0.002981 1.270432 -2.004049 +v 0.002311 1.269730 -2.007570 +v 0.002349 1.269337 -2.004629 +v -0.428472 2.401108 0.502814 +v -0.451313 2.636127 0.387985 +v -0.830635 2.401108 0.624809 +v -0.875440 2.636127 0.516642 +v -1.201271 2.401108 0.822918 +v -1.266317 2.636127 0.725570 +v -1.526136 2.401108 1.089528 +v -1.608923 2.636127 1.006740 +v -1.792745 2.401108 1.414392 +v -1.890093 2.636127 1.349347 +v -1.990854 2.401108 1.785028 +v -2.099021 2.636127 1.740224 +v -2.112849 2.401108 2.187191 +v -2.227679 2.636127 2.164350 +v -2.154042 2.401108 2.605426 +v -2.271121 2.636127 2.605426 +v -2.112849 2.401108 3.023662 +v -2.227679 2.636127 3.046503 +v -1.990854 2.401108 3.425825 +v -2.099021 2.636127 3.470629 +v -1.792745 2.401108 3.796461 +v -1.890093 2.636127 3.861506 +v -1.526136 2.401108 4.121325 +v -1.608923 2.636127 4.204113 +v -1.201271 2.401108 4.387935 +v -1.266317 2.636127 4.485283 +v -0.830635 2.401108 4.586044 +v -0.875439 2.636127 4.694211 +v -0.428472 2.401108 4.708038 +v -0.451313 2.636127 4.822868 +v -0.199285 2.724997 1.655017 +v -0.381068 2.724997 1.710160 +v -0.548600 2.724997 1.799708 +v -0.695444 2.724997 1.920220 +v -0.815955 2.724997 2.067063 +v -0.905503 2.724997 2.234595 +v -0.960646 2.724997 2.416378 +v -0.979266 2.724997 2.605427 +v -0.960646 2.724997 2.794475 +v -0.905503 2.724997 2.976258 +v -0.815955 2.724997 3.143790 +v -0.695444 2.724997 3.290633 +v -0.548600 2.724997 3.411145 +v -0.381068 2.724997 3.500693 +v -0.199285 2.724997 3.555836 +v -0.148365 2.786363 1.911007 +v -0.281186 2.786363 1.951297 +v -0.403594 2.786363 2.016726 +v -0.510886 2.786363 2.104778 +v -0.598938 2.786363 2.212069 +v -0.664366 2.786363 2.334477 +v -0.704657 2.786363 2.467298 +v -0.718261 2.786363 2.605427 +v -0.704657 2.786363 2.743555 +v -0.664366 2.786363 2.876376 +v -0.598938 2.786363 2.998784 +v -0.510886 2.786363 3.106075 +v -0.403594 2.786363 3.194127 +v -0.281186 2.786363 3.259556 +v -0.148365 2.786363 3.299846 +v -0.190799 2.401108 1.697677 +v -0.364423 2.401108 1.750345 +v -0.524435 2.401108 1.835874 +v -0.664687 2.401108 1.950976 +v -0.779789 2.401108 2.091228 +v -0.865318 2.401108 2.251240 +v -0.917986 2.401108 2.424864 +v -0.935770 2.401108 2.605427 +v -0.917986 2.401108 2.785989 +v -0.865318 2.401108 2.959613 +v -0.779789 2.401108 3.119625 +v -0.664687 2.401108 3.259877 +v -0.524435 2.401108 3.374979 +v -0.364423 2.401108 3.460508 +v -0.190799 2.401108 3.513175 +v -0.124743 2.226103 2.328983 +v -0.176475 2.226103 2.356634 +v -0.221817 2.226103 2.393846 +v -0.259029 2.226103 2.439189 +v -0.286680 2.226103 2.490920 +v -0.286680 2.224290 2.719933 +v -0.259029 2.224290 2.771664 +v -0.221817 2.224290 2.817007 +v -0.176475 2.224290 2.854219 +v -0.131645 2.224290 2.881870 +v -0.248892 2.687974 1.405625 +v -0.478376 2.687974 1.475238 +v -0.689870 2.687974 1.588284 +v -0.875246 2.687974 1.740418 +v -1.027379 2.687974 1.925794 +v -1.140425 2.687974 2.137287 +v -1.210038 2.687974 2.366771 +v -1.233544 2.687974 2.605427 +v -1.210038 2.687974 2.844082 +v -1.140425 2.687974 3.073566 +v -1.027379 2.687974 3.285059 +v -0.875246 2.687974 3.470435 +v -0.689870 2.687974 3.622569 +v -0.478376 2.687974 3.735615 +v -0.248892 2.687974 3.805228 +v -0.293581 2.674420 1.180959 +v -0.566036 2.674420 1.263607 +v -0.817133 2.674420 1.397821 +v -1.037221 2.674420 1.578443 +v -1.217842 2.674420 1.798530 +v -1.352056 2.674420 2.049627 +v -1.434704 2.674420 2.322082 +v -1.462611 2.674420 2.605426 +v -1.434704 2.674420 2.888771 +v -1.352056 2.674420 3.161226 +v -1.217842 2.674420 3.412323 +v -1.037221 2.674420 3.632411 +v -0.817133 2.674420 3.813032 +v -0.566036 2.674420 3.947246 +v -0.293581 2.674420 4.029894 +v -0.186198 2.989043 2.464260 +v -0.117923 2.817720 1.948062 +v -0.221472 2.817720 2.061252 +v -0.316903 2.817720 2.146468 +v -0.400549 2.817720 2.215115 +v -0.469195 2.817720 2.298760 +v -0.520204 2.817720 2.394191 +v -0.551615 2.817720 2.497740 +v -0.562221 2.817720 2.605427 +v -0.551615 2.817720 2.713113 +v -0.520204 2.817720 2.816662 +v -0.469195 2.817720 2.912093 +v -0.400549 2.817720 2.995739 +v -0.316903 2.817720 3.064385 +v -0.221472 2.817720 3.115394 +v -0.117923 2.817720 3.146805 +v -0.111147 2.829494 1.962628 +v -0.208178 2.829494 2.093345 +v -0.297604 2.829494 2.175352 +v -0.375986 2.829494 2.239678 +v -0.440312 2.829494 2.318060 +v -0.488110 2.829494 2.407485 +v -0.517545 2.829494 2.504517 +v -0.527484 2.829494 2.605427 +v -0.517545 2.829494 2.706336 +v -0.488110 2.829494 2.803368 +v -0.440312 2.829494 2.892793 +v -0.375986 2.829494 2.971175 +v -0.297604 2.829494 3.035501 +v -0.208178 2.829494 3.083300 +v -0.111146 2.829494 3.112735 +v -0.101750 2.854550 1.993152 +v -0.189746 2.854550 2.137846 +v -0.270844 2.854550 2.215401 +v -0.341926 2.854550 2.273737 +v -0.400263 2.854550 2.344820 +v -0.443610 2.854550 2.425917 +v -0.470304 2.854550 2.513914 +v -0.479317 2.854550 2.605427 +v -0.470304 2.854550 2.696939 +v -0.443610 2.854550 2.784935 +v -0.400263 2.854550 2.866033 +v -0.341926 2.854550 2.937116 +v -0.270844 2.854550 2.995452 +v -0.189746 2.854550 3.038800 +v -0.101750 2.854550 3.065493 +v -0.091950 2.882759 2.026502 +v -0.170523 2.882759 2.184255 +v -0.242936 2.882759 2.257168 +v -0.306406 2.882759 2.309257 +v -0.358495 2.882759 2.372728 +v -0.397201 2.882759 2.445141 +v -0.421036 2.882759 2.523714 +v -0.429084 2.882759 2.605427 +v -0.421036 2.882759 2.687140 +v -0.397201 2.882759 2.765712 +v -0.358495 2.882759 2.838125 +v -0.306406 2.882759 2.901596 +v -0.242936 2.882759 2.953685 +v -0.170523 2.882759 2.992391 +v -0.091950 2.882759 3.016226 +v -0.063376 2.935363 2.872576 +v -0.114474 2.935363 2.857076 +v -0.161565 2.935363 2.831905 +v -0.202841 2.935363 2.798031 +v -0.236716 2.935363 2.756755 +v -0.261887 2.935363 2.709663 +v -0.277387 2.935363 2.658566 +v -0.282621 2.935363 2.605427 +v -0.277387 2.935363 2.552287 +v -0.261886 2.935363 2.501190 +v -0.236716 2.935363 2.454098 +v -0.202841 2.935363 2.387167 +v -0.161565 2.935363 2.307682 +v -0.114474 2.935363 2.305316 +v -0.063376 2.935363 2.102851 +v -0.051523 2.989043 2.789394 +v -0.091223 2.989043 2.777351 +v -0.127810 2.989043 2.757795 +v -0.159879 2.989043 2.731477 +v -0.186198 2.989043 2.699407 +v -0.205754 2.989043 2.662820 +v -0.217797 2.989043 2.623120 +v -0.221863 2.989043 2.581834 +v -0.159879 2.989043 2.412258 +v -0.127810 2.989043 2.350503 +v -0.091223 2.989043 2.348665 +v -0.051523 2.989043 2.303479 +v -0.112185 1.572123 1.218153 +v -0.198827 1.509212 1.218260 +v -0.251644 1.403255 1.227998 +v -0.264300 1.323179 1.228035 +v -0.305045 1.370555 -1.877710 +v -0.230556 1.208175 1.218367 +v -0.158934 1.128584 1.218311 +v -0.047913 1.085005 1.218217 +v -0.158944 1.677040 0.937879 +v -0.284231 1.586070 0.938034 +v -0.361685 1.452005 0.938149 +v -0.377914 1.298028 0.938203 +v -0.330112 1.150761 0.938189 +v -0.226544 1.035669 0.938108 +v -0.085118 0.972653 0.937973 +v -0.223044 1.768315 -0.622005 +v -0.374142 1.666486 -0.621800 +v -0.476626 1.489100 -0.621648 +v -0.498099 1.285366 -0.621576 +v -0.434850 1.090512 -0.621595 +v -0.292515 0.947409 -0.621702 +v -0.105388 0.864029 -0.621881 +v -0.109624 0.858051 0.642730 +v -0.301334 1.271826 -1.770128 +v -0.312733 1.334754 -1.770077 +v -0.328655 1.436867 -1.770068 +v -0.074129 1.953466 -0.200068 +v -0.206677 1.784041 0.642606 +v -0.371380 1.664451 0.642810 +v -0.318446 1.533730 -1.770102 +v -0.394318 1.469958 -1.183803 +v -0.318799 1.616113 -1.183928 +v -0.194107 1.715288 -1.184097 +v -0.494536 1.285790 0.643033 +v -0.431695 1.092193 0.643013 +v -0.295544 0.940893 0.642907 +v -0.473201 1.488209 0.642961 +v -0.266281 1.618065 -1.770174 +v -0.146212 1.675292 -1.770272 +v -0.057024 1.265994 -1.770213 +v -0.092808 0.947375 -1.157143 +v -0.241479 1.020895 -1.183848 +v -0.359897 1.141546 -1.183759 +v -0.412011 1.302094 -1.183743 +v -0.475319 1.067082 0.109403 +v -0.120239 0.808943 0.109090 +v -0.325213 0.900275 0.109285 +v -0.544601 1.280521 0.109424 +v -0.291855 1.793287 0.108954 +v -0.521079 1.503687 0.109345 +v -0.408822 1.697992 0.109179 +v -0.431806 1.478880 -0.959368 +v -0.238757 1.725592 -0.919595 +v -0.365732 1.636902 -0.774711 +v -0.097588 0.917353 -0.959575 +v -0.388378 1.123802 -0.959321 +v -0.444723 1.297385 -0.959304 +v -0.264288 0.991631 -0.959416 +v -0.110175 0.846273 -0.386269 +v -0.447894 1.082960 -0.385974 +v -0.385321 1.676641 -0.504915 +v -0.303054 0.932216 -0.386085 +v -0.490954 1.493802 -0.386029 +v -0.297426 1.782170 -0.366351 +v -0.513088 1.283804 -0.385955 +v -1.493032 2.651631 -2.598188 +v -1.354493 2.725137 -2.616995 +v -1.552491 2.624253 -2.591190 +v -1.726076 2.722816 -0.042957 +v -1.484007 3.097118 -2.686587 +v -1.654815 3.045792 0.097871 +v -1.381624 2.969088 -2.668038 +v -1.652569 2.650256 -0.080383 +v -1.555222 3.073169 0.104558 +v -1.727373 2.922343 0.059959 +v -1.354248 2.750373 -2.642563 +v -1.753457 2.822407 0.008412 +v -1.753310 2.747791 -2.641901 +v -1.354395 2.824988 0.009743 +v -1.727222 2.966852 -2.667466 +v -1.381775 2.924579 0.061111 +v -1.607652 2.650340 -2.597857 +v -1.455284 3.047083 0.098537 +v -1.624754 3.095827 -2.686257 +v -1.552629 2.624170 -0.093839 +v -1.753246 2.722902 -2.616433 +v -1.453038 2.651547 -0.079718 +v -1.555067 3.123205 -2.693299 +v -1.380479 2.725052 -0.041804 +v -1.541025 2.651692 -4.445485 +v -1.459654 2.861202 -4.624067 +v -1.516033 3.047244 -4.772202 +v -1.554981 2.607552 -4.408181 +v -1.468461 2.769373 -4.558311 +v -1.479563 2.924737 -4.676544 +v -1.554953 3.071091 -4.789927 +v -1.653471 2.858620 -4.621945 +v -1.634222 2.922501 -4.674706 +v -1.568740 2.650401 -4.444424 +v -1.593853 3.045953 -4.772438 +v -1.642243 2.767137 -4.556490 +v -1.555160 3.123149 -1.012046 +v -1.354579 2.725086 -1.073644 +v -1.493116 2.651581 -1.088831 +v -1.552574 2.624203 -1.094490 +v -1.753394 2.747741 -1.132186 +v -1.381710 2.969037 -1.113415 +v -1.484095 3.097065 -1.100079 +v -1.354332 2.750323 -1.131712 +v -1.624842 3.095774 -1.100316 +v -1.607609 2.568838 -1.163812 +v -1.753328 2.722853 -1.150487 +v -1.727308 2.966801 -1.113825 +v -1.484100 3.097062 -1.017421 +v -1.381715 2.969034 -1.032418 +v -1.354336 2.750320 -1.052996 +v -1.753398 2.747738 -1.053529 +v -1.501444 3.080591 -3.683239 +v -1.416682 2.943324 -3.652929 +v -1.394893 2.864048 -3.611308 +v -1.712542 2.861993 -3.610228 +v -1.475168 3.040851 -4.084122 +v -1.416661 2.943337 -4.045755 +v -1.394871 2.864061 -3.993073 +v -1.712520 2.862006 -3.991706 +v -1.554740 3.101357 -3.694184 +v -1.415660 2.784497 -3.569538 +v -1.473419 2.725986 -3.538815 +v -1.552694 2.704194 -3.527379 +v -1.554718 3.061617 -4.097969 +v -1.415639 2.784509 -3.940204 +v -1.473399 2.725998 -3.901316 +v -1.552674 2.704206 -3.886841 +v -1.727225 2.966851 -2.615155 +v -1.753249 2.722900 -2.567074 +v -1.607532 2.568884 -2.549573 +v -1.624757 3.095825 -2.632858 +v -1.727313 2.966798 -1.032879 +v -1.607736 2.650290 -1.089097 +v -1.624846 3.095772 -1.017687 +v -1.753332 2.722850 -1.074110 +v -1.691775 2.941545 -3.651994 +v -1.632243 2.724959 -3.538275 +v -1.606943 3.079564 -3.682700 +v -1.690752 2.782717 -3.568614 +v -1.354251 2.750371 -2.591692 +v -1.484010 3.097116 -2.633170 +v -1.381627 2.969087 -2.615695 +v -1.753313 2.747790 -2.591069 +v -1.555070 3.123203 -2.639495 +v -1.552493 2.569058 -2.543292 +v -1.354496 2.725136 -2.567604 +v -1.493555 2.569140 -2.549885 +v -1.555156 3.123152 -1.095303 +v -1.552570 2.569012 -1.168608 +v -1.354574 2.725089 -1.150072 +v -1.493632 2.569094 -1.163576 +v -1.691753 2.941558 -4.044572 +v -1.632223 2.724971 -3.900633 +v -1.633993 3.039824 -4.083439 +v -1.690731 2.782730 -3.939032 +v -1.753310 2.722863 -1.466533 +v -1.607591 2.568848 -1.472980 +v -1.727289 2.966812 -1.448778 +v -1.624823 3.095786 -1.442233 +v -1.552553 2.569022 -1.475306 +v -1.354557 2.725099 -1.466329 +v -1.555136 3.123163 -1.439818 +v -1.493615 2.569105 -1.472867 +v -1.484076 3.097076 -1.442118 +v -1.381692 2.969048 -1.448580 +v -1.354314 2.750334 -1.457439 +v -1.753376 2.747752 -1.457669 +v -0.132685 2.142496 2.462135 +v -0.099852 2.088318 2.494968 +v -0.050714 2.041885 2.544105 +v -0.190647 2.142496 2.602068 +v -0.144214 2.088318 2.602068 +v -0.074723 2.041885 2.602068 +v -0.132685 2.142496 2.742001 +v -0.099852 2.088318 2.709168 +v -0.050714 2.041885 2.660030 +v -0.318385 1.240444 -1.476959 +v -0.351953 1.407097 -1.476948 +v -0.066736 1.206266 -1.477122 +v -0.307628 1.209148 -1.477020 +v -0.339708 1.523272 -1.476989 +v -0.171873 1.693061 -1.477192 +v -0.281269 1.624424 -1.477076 +v -1.753346 2.747770 -1.994588 +v -0.300006 1.147295 -1.330449 +v -0.075813 1.137197 -1.330567 +v -0.376529 1.375902 -1.330366 +v -0.318129 1.192040 -1.330379 +v -0.253845 1.525363 -1.938830 +v -0.362387 1.510071 -1.330414 +v -0.117884 1.625643 -2.062768 +v -0.200127 1.585639 -1.988647 +v -1.354284 2.750352 -1.994762 +v -1.381661 2.969066 -2.001470 +v -0.294897 1.626889 -1.330514 +v -0.176808 1.706156 -1.330649 +v -1.484044 3.097095 -2.006348 +v -1.712528 2.862002 -3.861123 +v -1.394879 2.864057 -3.862392 +v -1.416668 2.943333 -3.911287 +v -1.505600 3.040847 -3.946897 +v -1.415646 2.784505 -3.813322 +v -1.473406 2.725994 -3.777229 +v -1.554725 3.061612 -3.959751 +v -1.552681 2.704201 -3.763794 +v -1.691760 2.941553 -3.910190 +v -1.598617 3.039819 -3.946263 +v -1.690738 2.782726 -3.812235 +v -1.632230 2.724967 -3.776595 +v -1.726067 2.722821 -0.207467 +v -1.619421 3.045798 -0.080104 +v -1.652560 2.650261 -0.241313 +v -1.727364 2.922349 -0.114392 +v -1.552621 2.624175 -0.253483 +v -1.453029 2.651552 -0.240711 +v -1.380470 2.725057 -0.206423 +v -1.555212 3.073175 -0.067336 +v -1.753447 2.822412 -0.161009 +v -1.354386 2.824994 -0.159805 +v -1.381766 2.924585 -0.113350 +v -1.485698 3.047089 -0.079503 +v -1.726065 2.722823 -0.252212 +v -1.652557 2.650263 -0.285084 +v -1.727361 2.922351 -0.161813 +v -1.624896 3.095742 -0.128512 +v -1.552618 2.624177 -0.296904 +v -1.380467 2.725059 -0.251198 +v -1.555210 3.123119 -0.116112 +v -1.453026 2.651554 -0.284500 +v -1.753445 2.822414 -0.207090 +v -1.381763 2.924587 -0.160802 +v -1.484149 3.097033 -0.127928 +v -1.354383 2.824996 -0.205921 +v -1.577627 2.499476 -2.418768 +v -1.551819 2.499558 -2.415823 +v -1.524182 2.499597 -2.418914 +v -1.577655 2.499460 -1.488318 +v -1.551847 2.499541 -1.480699 +v -1.524210 2.499580 -1.479556 +v -1.501212 2.551754 -2.517142 +v -1.501264 2.551723 -1.474539 +v -1.516561 2.516961 -1.477884 +v -1.516525 2.516982 -2.451657 +v -0.032537 2.465002 0.247029 +v -0.103150 1.551812 1.218148 +v -0.182312 1.494333 1.218246 +v -0.231251 1.409625 1.218319 +v -0.241506 1.312334 1.218353 +v -0.211302 1.219284 1.218344 +v -0.145863 1.146564 1.218292 +v -0.056502 1.106747 1.218207 +v -0.103897 1.543208 1.250644 +v -0.179710 1.488160 1.250738 +v -0.226578 1.407036 1.250807 +v -0.236399 1.313862 1.250840 +v -0.207473 1.224749 1.250831 +v -0.144802 1.155106 1.250782 +v -0.059223 1.116974 1.250701 +v -0.343723 1.777484 -1.050826 +v -0.406759 1.819806 -0.565925 +v -0.051523 3.051488 2.303479 +v -0.091223 3.051488 2.348665 +v -0.044698 3.105677 2.569301 +v -0.073708 3.078323 2.540415 +v -0.130956 3.051488 2.464260 +v -0.120042 3.051488 2.350503 +v -0.131395 3.051488 2.412258 +v -0.058768 3.105677 2.603478 +v -0.099707 3.078323 2.603566 +v -0.127062 3.037384 2.603625 +v -0.136668 2.989093 2.603646 +v -0.044551 3.105677 2.637595 +v -0.073437 3.078323 2.666605 +v -0.092738 3.037384 2.685989 +v -0.099515 2.989093 2.692796 +v -0.100518 2.401108 1.688786 +v -0.219355 2.401108 0.482218 +v -1.672077 2.758376 -0.026830 +v -1.623168 2.980043 0.069824 +v -1.621627 2.708577 -0.052516 +v -1.554816 2.998832 0.074414 +v -1.672967 2.895317 0.043804 +v -1.690869 2.826728 0.008426 +v -1.416983 2.828500 0.009340 +v -1.435775 2.896852 0.044595 +v -1.486225 2.980929 0.070281 +v -1.553036 2.690673 -0.061751 +v -1.484684 2.709463 -0.052060 +v -1.434885 2.759911 -0.026038 +v -1.672061 2.757850 -0.068753 +v -1.623153 2.979516 0.027901 +v -1.621611 2.708050 -0.094439 +v -1.554800 2.998306 0.032491 +v -1.672951 2.894790 0.001881 +v -1.690853 2.826201 -0.033497 +v -1.416967 2.827973 -0.032583 +v -1.435759 2.896325 0.002672 +v -1.486210 2.980402 0.028358 +v -1.553020 2.690146 -0.103674 +v -1.484668 2.708936 -0.093983 +v -1.434869 2.759384 -0.067961 +v -1.712539 2.861995 -3.655508 +v -1.394890 2.864050 -3.656621 +v -1.416680 2.943326 -3.699556 +v -1.499593 3.073419 -3.730823 +v -1.415657 2.784498 -3.613535 +v -1.473416 2.725988 -3.581842 +v -1.554737 3.094184 -3.742112 +v -1.552692 2.704195 -3.570046 +v -1.691772 2.941546 -3.698592 +v -1.608937 3.072391 -3.730266 +v -1.690749 2.782719 -3.612581 +v -1.632241 2.724960 -3.581285 +v -0.192106 1.751434 0.790247 +v -0.344795 1.640567 0.790436 +v -0.439190 1.477180 0.790576 +v -0.458968 1.289525 0.790643 +v -0.400711 1.110049 0.790625 +v -0.274490 0.969785 0.790526 +v -0.102132 0.892985 0.790362 +v -0.324523 2.240687 2.446783 +v -0.392584 2.263214 2.346195 +v -0.099948 2.244183 2.239800 +v -0.252387 2.962076 2.593686 +v -0.153166 2.948720 2.318336 +v -0.207209 1.062222 1.095481 +v -0.301650 1.167170 1.095555 +v -0.345239 1.301457 1.095569 +v -0.330440 1.441864 1.095519 +v -0.211577 2.962076 2.459155 +v -0.233954 2.962076 2.686353 +v -0.057478 2.962076 2.831183 +v -0.224146 2.948720 2.742486 +v -0.102903 2.962076 2.326888 +v -0.144768 2.962076 2.328991 +v -0.247734 2.962076 2.546445 +v -0.057478 2.961664 2.292536 +v -0.231769 2.962076 2.501020 +v -0.211577 2.962076 2.728218 +v -0.335396 2.263843 2.926831 +v -0.153166 2.948720 2.813466 +v -0.267504 2.948720 2.599556 +v -0.078248 1.004759 1.095359 +v -0.181462 2.962076 2.764912 +v -0.144768 2.962076 2.795027 +v -0.259813 1.564113 1.095414 +v -0.145567 1.647066 1.095273 +v -0.192152 2.948720 2.781471 +v -0.060427 2.948514 2.159352 +v -0.102903 2.962076 2.817404 +v -0.247734 2.962076 2.640927 +v -0.181462 2.962076 2.399653 +v -0.055092 2.244183 2.234273 +v -0.247920 2.948720 2.698008 +v -0.265713 2.263843 2.984018 +v -0.368632 2.240687 2.601671 +v -0.129274 2.250607 2.998332 +v -0.359797 2.240687 2.691382 +v -0.335396 2.263214 2.276512 +v -0.265713 2.263214 2.219324 +v -0.192152 2.948720 2.393410 +v -0.262560 2.948720 2.649747 +v -0.246827 2.948720 2.501105 +v -0.108689 2.948720 2.316102 +v -0.262560 2.948720 2.549366 +v -0.224146 2.948720 2.456627 +v -0.108689 2.948720 2.837240 +v -0.060427 2.948720 2.851880 +v -0.325002 2.240687 2.757041 +v -0.099948 2.250607 3.026225 +v -0.149311 2.244183 2.263092 +v -0.359797 2.240687 2.511960 +v -0.392584 2.263843 2.857147 +v -0.584834 2.321844 2.219602 +v -0.584834 2.321844 2.987470 +v -0.498892 2.321844 2.114881 +v -0.498892 2.321844 3.092191 +v -0.688021 2.321844 2.738355 +v -0.274695 2.321844 3.241994 +v -0.394171 2.321844 3.178133 +v -0.701299 2.321844 2.603536 +v -0.145056 2.321844 1.925752 +v -0.648695 2.321844 2.339077 +v -0.394171 2.321844 2.028938 +v -0.077647 2.321844 1.919113 +v -0.648695 2.321844 2.867994 +v -0.145056 2.321844 3.281320 +v -0.688021 2.321844 2.468716 +v -0.274695 2.321844 1.965077 +v -0.314756 2.636127 0.377124 +v -0.323913 2.401108 0.492516 +v -0.145659 2.401108 1.693232 +v -0.166158 2.667501 1.022331 +v -0.286911 2.659499 0.863485 +v -0.115060 2.674420 1.163376 +v -0.138645 2.667936 1.028787 +v -0.052627 2.684586 1.329028 +v -0.110555 2.681197 1.277466 +v -0.230751 2.678150 0.363945 +v -0.314732 2.669724 0.374805 +v -0.166134 2.688218 1.020012 +v -0.286887 2.680216 0.861166 +v -0.115036 2.684007 1.161057 +v -0.138621 2.688652 1.026468 +v -0.052603 2.694172 1.326708 +v -0.110531 2.690784 1.275147 +v -0.114796 2.401108 0.471920 +v -0.055377 2.401108 1.684340 +v -0.111351 2.321844 1.922432 +v -0.043942 2.321844 1.915793 +v -0.116100 2.454780 0.445310 +v -0.223203 2.462719 0.443145 +v -0.314555 2.483611 0.443375 +v -0.314756 2.636127 0.246049 +v -0.230751 2.674030 0.232869 +v -0.310904 2.657659 0.243730 +v -0.114796 2.401108 0.340844 +v -0.116100 2.454780 0.314235 +v -0.223203 2.462719 0.312070 +v -0.309437 2.487592 0.312300 +v -0.056732 1.953082 0.678167 +v -0.114796 2.335214 0.471920 +v -0.062516 2.401108 0.466771 +v -0.114796 2.335214 0.340844 +v -0.045352 1.701151 0.937753 +v -0.041987 1.669051 1.095158 +v -0.062516 2.335214 0.335695 +v -0.062516 2.401108 0.335695 +v -0.062516 2.335214 0.466771 +v -0.080277 1.828956 -0.381558 +v -1.485361 3.091249 -3.385416 +v -0.032807 2.401108 1.682117 +v -0.041009 1.953060 0.977736 +v -0.073136 1.953189 0.187327 +v -0.059137 1.953361 0.581628 +v -1.656071 2.777029 -4.235336 +v -1.608227 3.042385 -4.421340 +v -1.595684 2.717414 -4.190361 +v -1.657125 2.940961 -4.358953 +v -1.675356 2.858853 -4.297033 +v -1.434641 2.860974 -4.298634 +v -1.453636 2.942798 -4.360338 +v -1.501283 3.043446 -4.421533 +v -1.553926 2.688133 -4.158688 +v -1.512198 2.718474 -4.191161 +v -1.452582 2.778866 -4.236709 +v -1.554820 3.063829 -4.435523 +v -0.060161 1.364330 -2.266561 +v -1.493587 2.569122 -1.983076 +v -0.282375 1.355369 -1.957947 +v -0.249994 1.459453 -1.980553 +v -1.555105 3.123182 -2.008133 +v -0.120413 2.678150 0.222489 +v -0.116402 2.678150 0.353187 +v -1.357443 2.798300 -3.312869 +v -1.750051 2.795759 -3.311779 +v -1.384376 2.935489 -3.354847 +v -1.555012 3.116915 -3.396459 +v -1.454499 2.652966 -3.239752 +v -1.552482 2.626031 -3.228219 +v -1.357267 2.725284 -3.270740 +v -1.724384 2.933290 -3.353904 +v -1.623313 3.089979 -3.384871 +v -1.750431 2.723084 -3.269809 +v -1.650803 2.651696 -3.239208 +v -0.038009 2.678150 0.214187 +v -0.031189 2.401108 0.333121 +v -0.033856 2.678150 0.345421 +v -0.031412 2.449598 0.309035 +v -0.314756 2.636127 0.205569 +v -0.230751 2.674030 0.192389 +v -0.307800 2.657659 0.212681 +v -0.116100 2.454780 0.273755 +v -0.223203 2.462719 0.271590 +v -0.309437 2.487592 0.271820 +v -0.120413 2.678150 0.182009 +v -0.048761 2.678150 0.173707 +v -0.046722 2.657138 0.174806 +v -0.031412 2.449598 0.268555 +v -0.031412 2.437356 0.309035 +v -0.031412 2.437356 0.268555 +v -0.048782 2.678031 0.159891 +v -0.044704 2.636009 0.162088 +v -0.031433 2.449480 0.254739 +v -0.031433 2.437238 0.254739 +v -0.038009 2.692061 0.214187 +v -0.033856 2.684679 0.345421 +v -0.048761 2.692061 0.173707 +v -0.048782 2.689298 0.163517 +v -0.289145 2.662647 0.199941 +v -0.284433 2.480380 0.271753 +v -0.288901 2.649387 0.201067 +v -0.284929 2.498675 0.263582 +v -0.032543 2.465484 0.260665 +v -0.223961 2.480090 0.263889 +v -0.116493 2.470963 0.265733 +v -0.310064 2.505120 0.264002 +v -0.230763 2.655079 0.193549 +v -0.120460 2.657138 0.182928 +v -0.230763 2.655079 0.214039 +v -0.120460 2.657138 0.203419 +v -0.046722 2.657138 0.195297 +v -0.288901 2.649387 0.221558 +v -0.284929 2.498675 0.284073 +v -0.032543 2.465484 0.281156 +v -0.223961 2.480090 0.284379 +v -0.116493 2.470963 0.286223 +v -1.354528 2.725116 -1.988029 +v -1.624792 3.095804 -2.006261 +v -1.727259 2.966830 -2.001319 +v -0.161812 1.582820 -2.068119 +v -0.289677 1.445220 -1.897635 +v -1.607563 2.568865 -1.982988 +v -1.753281 2.722881 -1.987885 +v -0.339174 1.693520 -0.883548 +v -0.411963 1.736186 -0.575862 +v -0.103871 1.614079 -2.098121 +v -1.577642 2.499467 -1.929095 +v -1.551834 2.499549 -1.923690 +v -1.524197 2.499588 -1.924553 +v -0.374348 1.798045 -0.815246 +v -0.388901 1.722669 -0.673345 +v -1.516545 2.516971 -1.926587 +v -1.501239 2.551738 -1.974655 +v -0.221781 1.520603 -2.018724 +v -0.279581 1.391457 -1.957981 +v -0.293509 1.267781 -1.875379 +v -0.072307 1.314689 -2.242423 +v -0.088335 1.720162 -1.330722 +v -1.554976 2.684808 -4.473363 +v -1.554972 2.762065 -4.538545 +v -1.554967 2.774671 -4.562563 +v -1.554962 2.916578 -4.668909 +v -1.554957 2.993834 -4.734090 +v -0.077520 2.244183 2.235927 +v -0.027477 2.244183 2.232064 +v -0.021902 2.321844 1.914133 +v -0.013670 2.244183 2.230959 +v -0.031301 2.419232 0.321078 +v -0.035705 1.587260 1.218073 +v -0.035659 1.565085 1.218078 +v -0.040025 1.555768 1.250578 +v -1.554355 2.921266 -0.001551 +v -1.553910 2.844226 -0.035592 +v -1.553465 2.767186 -0.069633 +v -0.058873 1.635688 -2.082583 +v -0.096985 1.732811 -1.184189 +v -0.111453 1.798851 -0.622116 +v -0.085868 1.705188 -1.477256 +v -0.073037 1.685403 -1.770325 +v -0.119309 1.753806 -0.939740 +v -0.051867 1.624105 -2.107054 +v -1.552053 2.519828 -1.479124 +v -1.586358 2.519742 -2.456960 +v -1.586396 2.519719 -1.483840 +v -1.552016 2.519850 -2.453041 +v -1.586378 2.519730 -1.944830 +v -1.600592 2.552698 -1.970433 +v -1.552336 2.552867 -2.513596 +v -1.600565 2.552714 -2.519100 +v -1.552388 2.552836 -1.476562 +v -1.600617 2.552683 -1.476554 +v -0.084587 2.678150 0.177858 +v -0.083591 2.657138 0.178867 +v -0.074518 2.468223 0.283689 +v -0.073756 2.452189 0.311635 +v -0.075129 2.678150 0.349304 +v -0.073756 2.452189 0.271155 +v -0.083591 2.657138 0.199358 +v -0.074518 2.468223 0.263199 +v -0.079211 2.678150 0.218338 +v -0.437206 2.490968 0.458909 +v -0.847766 2.490968 0.583451 +v -1.226141 2.490968 0.785697 +v -1.557790 2.490968 1.057874 +v -1.829967 2.490968 1.389522 +v -2.032212 2.490968 1.767897 +v -2.156754 2.490968 2.178457 +v -2.198807 2.490968 2.605426 +v -2.156754 2.490968 3.032395 +v -2.032212 2.490968 3.442956 +v -1.829967 2.490968 3.821331 +v -1.557790 2.490968 4.152979 +v -1.226141 2.490968 4.425157 +v -0.847766 2.490968 4.627402 +v -0.437205 2.490968 4.751944 +v -0.309437 2.487592 0.292060 +v -0.226535 2.663500 0.942908 +v -0.112808 2.677809 1.220421 +v -0.272742 2.673937 0.369375 +v -0.226511 2.684217 0.940589 +v -0.112784 2.687395 1.218102 +v -0.270828 2.665845 0.238299 +v -0.216113 2.671178 1.104873 +v -0.073367 1.367828 -2.213065 +v -0.259333 1.362019 -1.957377 +v -0.232234 1.469464 -1.984319 +v -0.158436 1.578243 -2.050001 +v -0.109947 1.605704 -2.075109 +v -0.208623 1.516716 -2.007615 +v -0.267975 1.405693 -1.957406 +v -0.066425 1.614094 -2.082585 +v -0.224585 1.360504 -2.137573 +v -0.234931 1.297692 -2.159190 +v -0.231249 1.360482 -2.161467 +v -0.171763 1.496523 -2.112888 +v -0.202799 1.445257 -2.122453 +v -0.215046 1.405228 -2.130356 +v -0.160765 1.953815 -0.200068 +v -0.158566 1.953799 0.678167 +v -0.142844 1.953830 0.977736 +v -0.174970 1.953804 0.187327 +v -0.160972 1.953812 0.581628 +v -0.176225 1.831699 -0.200255 +v -0.177818 1.835845 0.158049 +v -0.042632 1.813319 0.976094 +v -0.177536 1.836437 0.604408 +v -0.177622 1.836058 0.720038 +v -0.076425 1.906952 -0.260758 +v -0.177451 1.836257 0.976141 +v -0.072101 2.031611 -0.106539 +v -0.059829 2.031518 0.558119 +v -0.057754 2.032295 0.640791 +v -0.070946 2.031961 0.217920 +v -0.039559 2.032264 0.977681 +v -1.730840 2.777029 -4.235336 +v -1.700583 2.782717 -3.587576 +v -1.700580 2.782719 -3.612581 +v -1.724032 2.767137 -4.427499 +v -1.710973 2.782726 -3.812235 +v -1.718288 2.782730 -3.939032 +v -1.698468 2.810800 -3.627787 +v -1.698526 2.811060 -3.829709 +v -1.698436 2.810761 -3.957657 +v -1.698537 2.811043 -3.583483 +v -1.663884 2.810176 -4.260330 +v -1.650969 2.810214 -4.586029 +v -1.717651 2.810800 -3.627787 +v -1.728114 2.811060 -3.829709 +v -1.735345 2.810761 -3.957657 +v -1.717721 2.811043 -3.602445 +v -1.748005 2.810176 -4.260330 +v -1.742112 2.810214 -4.457037 +v -1.554965 2.813299 -4.595154 +v -1.648008 2.767137 -4.623283 +v -1.565654 2.774671 -4.710088 +v -1.696774 2.767137 -4.519486 +v -1.656734 2.810214 -4.652822 +v -1.714854 2.810214 -4.549025 +v -1.565652 2.813299 -4.742679 +v -0.049694 1.931284 0.975197 +v -0.114135 1.917645 0.975197 +v -0.050780 1.837743 0.978493 +v -0.114953 1.853097 0.978525 +v -0.049694 1.931284 0.965331 +v -0.114135 1.917645 0.965331 +v -0.050780 1.837743 0.955333 +v -0.114953 1.853097 0.955364 +v -1.624066 3.038488 -3.673562 +v -1.646049 3.037645 -3.375371 +v -1.649247 3.040021 -2.004671 +v -1.648398 3.041794 -1.104522 +v -1.647474 3.043722 -0.138503 +v -1.622905 3.038462 -3.722053 +v -1.649828 3.038806 -2.627037 +v -1.648320 3.041956 -1.022402 +v -1.648720 3.041122 -1.444296 +v -1.649876 3.038705 -2.680067 +v -1.460974 3.053962 -0.136138 +v -1.466353 3.056497 -3.379154 +v -1.462690 3.057755 -2.682353 +v -1.462201 3.056680 -2.005205 +v -1.482346 3.045657 -3.675525 +v -1.461869 3.055938 -1.443659 +v -1.483355 3.044957 -3.723982 +v -1.461529 3.055197 -1.021062 +v -1.462651 3.057670 -2.629172 +v -1.461615 3.055381 -1.103303 +v -1.625751 2.650679 -1.156731 +v -1.625714 2.650718 -1.985591 +v -1.625678 2.650731 -2.558873 +v -1.625740 2.650697 -1.469554 +v -1.474596 2.650563 -2.559133 +v -1.474709 2.650455 -1.469457 +v -1.474747 2.650416 -1.156536 +v -1.474667 2.650490 -1.985660 +v -0.129326 1.610604 1.155057 +v -0.230141 1.537402 1.155182 +v -0.292467 1.429524 1.155275 +v -0.305526 1.305622 1.155318 +v -0.267061 1.187120 1.155307 +v -0.183722 1.094509 1.155241 +v -0.069920 1.043801 1.155133 +v -0.038930 1.629257 1.154960 +v -0.490960 1.472723 0.653692 +v -0.512295 1.310241 0.653764 +v -0.407715 1.322479 0.938203 +v -0.391486 1.436520 0.938149 +v -0.357487 1.426378 1.095519 +v -0.372285 1.325908 1.095569 +v -0.492986 1.313976 0.790643 +v -0.473208 1.461694 0.790576 +v -0.262192 1.382877 1.234035 +v -0.267115 1.350127 1.234073 +v -0.314036 1.412432 1.155275 +v -0.327096 1.330063 1.155318 +v -0.024113 1.084343 1.230476 +v -0.061140 0.948051 0.937973 +v -0.094145 0.833449 0.665285 +v -0.079474 0.868383 0.790362 +v -0.058473 0.980157 1.095359 +v -0.050145 1.019199 1.155133 +v -1.490126 3.088092 -3.473652 +v -1.368538 2.838969 -3.393963 +v -1.738938 2.836573 -3.392876 +v -1.393947 2.891031 -3.401748 +v -1.554932 3.112305 -3.484666 +v -1.460104 2.674600 -3.328355 +v -1.552544 2.649188 -3.316851 +v -1.392754 2.742827 -3.359265 +v -1.714723 2.888956 -3.400807 +v -1.618463 3.086894 -3.473109 +v -1.713529 2.740752 -3.358336 +v -1.645304 2.673401 -3.327812 +v -1.639536 3.037895 -3.463717 +v -1.471092 3.053285 -3.466960 +v -1.624884 3.095749 -0.348016 +v -1.743974 2.875512 -0.406704 +v -1.641493 2.650270 -0.483564 +v -1.726053 2.722830 -0.455107 +v -1.461111 3.054267 -0.354592 +v -1.647683 3.043286 -0.356704 +v -1.358306 2.817367 -0.418944 +v -1.484137 3.097040 -0.347510 +v -1.372039 2.877748 -0.410522 +v -1.753433 2.814785 -0.419956 +v -1.462923 2.651561 -0.483059 +v -1.555197 3.123126 -0.337284 +v -1.380456 2.725065 -0.454229 +v -1.552607 2.624183 -0.493798 +v -1.485090 3.092423 -3.245687 +v -1.356804 2.775758 -3.178843 +v -1.750702 2.773210 -3.177839 +v -1.383826 2.964744 -3.217522 +v -1.555023 3.118172 -3.255864 +v -1.462204 2.652699 -3.111473 +v -1.552483 2.625675 -3.100847 +v -1.356712 2.725255 -3.140026 +v -1.724951 2.962537 -3.216652 +v -1.623601 3.091149 -3.245185 +v -1.750994 2.723048 -3.139168 +v -1.642175 2.651425 -3.110971 +v -1.646814 3.037857 -3.236347 +v -1.465621 3.056748 -3.239831 +v -1.753358 2.722835 -0.609048 +v -1.633098 2.650275 -0.634155 +v -1.727340 2.966781 -0.539996 +v -1.624874 3.095755 -0.514557 +v -1.552599 2.624188 -0.643185 +v -1.354604 2.725070 -0.608272 +v -1.555188 3.123132 -0.505091 +v -1.470432 2.651566 -0.633709 +v -1.753425 2.747722 -0.574581 +v -1.381742 2.969017 -0.539223 +v -1.484128 3.097045 -0.514110 +v -1.354363 2.750304 -0.573688 +v -1.647841 3.042955 -0.522257 +v -1.461215 3.054498 -0.520337 +v -1.467099 2.651563 -0.566839 +v -1.555192 3.123129 -0.430605 +v -1.380451 2.725068 -0.539895 +v -1.552603 2.624186 -0.576875 +v -1.624878 3.095752 -0.440633 +v -1.733913 2.935231 -0.467578 +v -1.636824 2.650272 -0.567311 +v -1.726049 2.722832 -0.540717 +v -1.461169 3.054395 -0.446767 +v -1.647771 3.043102 -0.448772 +v -1.358172 2.774526 -0.503264 +v -1.484132 3.097043 -0.440160 +v -1.382763 2.937467 -0.466759 +v -1.753428 2.771945 -0.504210 +v -1.412283 2.967027 -2.652634 +v -1.385425 2.752456 -2.627641 +v -1.412367 2.966976 -1.127471 +v -1.385507 2.752407 -1.145421 +v -1.412372 2.966973 -1.048009 +v -1.385512 2.752404 -1.068196 +v -1.385428 2.752455 -2.577734 +v -1.412285 2.967025 -2.601281 +v -1.412349 2.966987 -1.456284 +v -1.385490 2.752418 -1.464975 +v -1.385460 2.752435 -1.992116 +v -1.412319 2.967005 -1.998696 +v -1.388560 2.799474 -3.285244 +v -1.414982 2.934065 -3.326427 +v -1.399445 2.839374 -3.364801 +v -1.424372 2.890449 -3.372438 +v -1.389406 2.818180 -0.446160 +v -1.402879 2.877418 -0.437898 +v -1.387933 2.777360 -3.153758 +v -1.414442 2.962765 -3.191704 +v -1.412398 2.966957 -0.564160 +v -1.385538 2.752389 -0.597972 +v -1.389275 2.776152 -0.528883 +v -1.413400 2.936004 -0.493069 +v -1.723882 2.749859 -2.627126 +v -1.698284 2.964807 -2.652211 +v -1.723965 2.749809 -1.145754 +v -1.698369 2.964756 -1.127738 +v -1.723969 2.749807 -1.068573 +v -1.698287 2.964805 -2.600881 +v -1.698373 2.964754 -1.048312 +v -1.723885 2.749857 -2.577248 +v -1.698351 2.964767 -1.456402 +v -1.723947 2.749820 -1.465127 +v -1.723918 2.749838 -1.991965 +v -1.720684 2.796926 -3.284427 +v -1.695499 2.931875 -3.325761 +v -1.698321 2.964785 -1.998569 +v -1.709780 2.836973 -3.364002 +v -1.686020 2.888373 -3.371784 +v -1.714722 2.875182 -0.433893 +v -1.724004 2.815595 -0.446896 +v -1.721324 2.774800 -3.153002 +v -1.696056 2.960573 -3.191086 +v -1.698400 2.964737 -0.564682 +v -1.723995 2.749791 -0.598618 +v -1.704850 2.933779 -0.493623 +v -1.723999 2.773559 -0.529568 +v -1.381637 2.997077 -2.676854 +v -1.682693 2.998361 0.083305 +v -1.427041 3.000015 0.084157 +v -1.502021 3.000174 -4.735449 +v -1.609363 2.998520 -4.734888 +v -1.457117 3.006339 -3.666843 +v -1.452688 3.003385 -4.069380 +v -1.381614 2.997024 -2.623994 +v -1.380956 2.995481 -1.025425 +v -1.381008 2.995595 -1.107188 +v -1.656185 3.002068 -4.068506 +v -1.381157 2.995942 -1.445550 +v -1.471430 3.003380 -3.933215 +v -1.634404 3.002064 -3.932403 +v -1.445765 3.000020 -0.092507 +v -1.660894 2.998367 -0.093278 +v -1.430540 3.004253 -0.145615 +v -1.642302 2.947490 0.059827 +v -1.466841 2.948625 0.060412 +v -1.642286 2.946963 0.017904 +v -1.466825 2.948098 0.018489 +v -1.457737 3.005908 -3.714597 +v -1.627014 3.003416 -4.397370 +v -1.482976 3.004775 -4.398021 +v -1.384949 2.983393 -3.369815 +v -1.554954 3.041408 -4.768473 +v -1.381349 2.996406 -2.003769 +v -1.554629 2.968706 0.019411 +v -1.650081 3.001240 -3.665275 +v -1.722509 2.970939 -3.367124 +v -1.725583 2.985289 -2.003383 +v -1.725079 2.986369 -1.108096 +v -1.678168 2.997089 -0.147460 +v -1.649365 3.001225 -3.713039 +v -1.725928 2.984548 -2.622471 +v -1.725033 2.986468 -1.026428 +v -1.725270 2.985960 -1.446018 +v -1.725956 2.984487 -2.675225 +v -1.668424 2.954059 -3.439546 +v -1.391544 2.964333 -3.441905 +v -1.731042 2.952214 -0.375915 +v -1.376981 2.959834 -0.376081 +v -1.723198 2.982307 -3.228780 +v -1.384287 2.994788 -3.231260 +v -1.380774 2.995044 -0.527593 +v -1.724748 2.987077 -0.529073 +v -1.727231 2.975045 -0.455997 +v -1.381137 2.982858 -0.454448 +v -1.478743 2.651571 -0.800464 +v -1.555178 3.123138 -0.690837 +v -1.354595 2.725076 -0.778783 +v -1.552590 2.624194 -0.808542 +v -1.724853 2.986854 -0.711302 +v -1.380841 2.995204 -0.709997 +v -1.723985 2.749797 -0.770808 +v -1.698390 2.964743 -0.741883 +v -1.624864 3.095761 -0.698902 +v -1.727330 2.966788 -0.720587 +v -1.623805 2.650280 -0.800844 +v -1.753348 2.722840 -0.779445 +v -1.354353 2.750310 -0.749305 +v -1.484117 3.097052 -0.698522 +v -1.381732 2.969023 -0.719928 +v -1.753415 2.747728 -0.750066 +v -1.385528 2.752394 -0.770260 +v -1.412389 2.966963 -0.741441 +v -1.461330 3.054754 -0.703801 +v -1.648016 3.042589 -0.705509 +v -1.318455 2.725086 -1.073644 +v -1.318213 2.750320 -1.052996 +v -1.318471 2.725076 -0.778783 +v -1.318229 2.750310 -0.749305 +v -1.351437 2.969017 -0.539223 +v -1.350468 2.995044 -0.527593 +v -1.350535 2.995204 -0.709997 +v -1.351427 2.969023 -0.719928 +v -1.791752 2.747738 -1.053529 +v -1.791686 2.722850 -1.074110 +v -1.791703 2.722840 -0.779445 +v -1.791769 2.747728 -0.750066 +v -1.757642 2.966781 -0.539996 +v -1.755051 2.987077 -0.529073 +v -1.755155 2.986854 -0.711302 +v -1.757632 2.966788 -0.720587 +v -1.371840 2.969017 -0.539223 +v -1.371830 2.969023 -0.719928 +v -1.370938 2.995204 -0.709997 +v -1.370871 2.995044 -0.527593 +v -1.339295 2.725086 -1.073644 +v -1.339312 2.725076 -0.778783 +v -1.339070 2.750310 -0.749305 +v -1.339053 2.750320 -1.052996 +v -1.770915 2.722850 -1.074110 +v -1.770931 2.722840 -0.779445 +v -1.770997 2.747728 -0.750066 +v -1.770981 2.747738 -1.053529 +v -1.738148 2.966781 -0.539996 +v -1.738138 2.966788 -0.720587 +v -1.735661 2.986854 -0.711302 +v -1.735557 2.987077 -0.529073 +v 0.000138 2.401108 4.749231 +v 0.000138 2.636127 4.866311 +v 0.000000 2.731961 1.636398 +v 0.000138 2.724997 3.574455 +v 0.000000 2.785073 1.897402 +v 0.000138 2.786363 3.313451 +v 0.000138 2.401108 1.679893 +v 0.000138 2.401108 3.530960 +v 0.000138 2.687974 1.382119 +v 0.000138 2.687974 3.828734 +v 0.000138 2.674420 4.057801 +v 0.000000 2.816430 1.937456 +v 0.000138 2.817720 3.157411 +v 0.000000 2.828204 1.952690 +v 0.000138 2.829494 3.122673 +v 0.000000 2.853259 1.984139 +v 0.000138 2.854550 3.074507 +v 0.000000 2.881469 2.018454 +v 0.000138 2.882759 3.024274 +v 0.000138 2.935363 2.877810 +v 0.000000 2.934073 2.103318 +v 0.000000 2.989043 2.793460 +v 0.000000 2.988962 2.303842 +v 0.000138 0.859410 -0.621989 +v 0.000138 1.594354 1.218036 +v 0.000138 1.709187 0.937711 +v 0.000138 1.829388 -0.622227 +v 0.000138 1.084989 1.218161 +v 0.000138 1.750334 -1.184281 +v 0.000138 1.695515 -1.770378 +v 0.000138 1.116960 1.250651 +v 0.000138 1.782021 -0.959884 +v 0.000138 1.844551 -0.386626 +v 0.000138 0.947350 -1.157232 +v 0.000000 2.142496 2.404173 +v 0.000138 2.088318 2.450606 +v 0.000138 2.041885 2.520097 +v 0.000138 2.025580 2.602068 +v 0.000000 2.142496 2.799963 +v 0.000138 2.088318 2.753530 +v 0.000138 2.041885 2.684039 +v 0.000138 0.808910 0.108971 +v 0.000138 1.717315 -1.477320 +v 0.000000 1.364310 -2.272663 +v 0.000138 0.843132 -0.386381 +v 0.000000 1.645734 -2.088965 +v 0.000138 1.734168 -1.330796 +v 0.000138 1.265980 -1.770264 +v 0.000138 1.206249 -1.477183 +v 0.000138 0.915582 -0.959672 +v 0.000138 2.464697 0.244513 +v 0.000138 1.572124 1.218042 +v 0.000138 1.562660 1.250542 +v 0.000000 3.106106 2.555084 +v 0.000000 3.078751 2.514145 +v 0.000000 3.051917 2.470772 +v 0.000000 3.051917 2.303842 +v 0.000000 3.115712 2.603374 +v 0.000000 3.106106 2.651665 +v 0.000000 3.070068 2.692604 +v 0.000000 3.029129 2.719959 +v 0.000000 2.989023 2.729564 +v 0.000138 1.952866 0.976939 +v 0.000138 2.962076 2.835836 +v 0.000000 2.250607 3.028159 +v 0.000138 1.106733 1.218155 +v 0.000000 2.244183 2.230964 +v 0.000138 1.676380 1.095119 +v 0.000000 2.960374 2.292951 +v 0.000138 2.948720 2.856823 +v 0.000000 2.947223 2.159793 +v 0.000138 2.321844 1.912473 +v 0.000138 2.321844 3.294598 +v 0.000138 2.684586 1.324852 +v 0.000138 2.678150 0.342223 +v 0.000138 2.684007 1.150733 +v 0.000138 2.690784 1.265266 +v 0.000138 2.694172 1.322533 +v 0.000138 2.690678 1.056598 +v 0.000138 2.401108 0.330546 +v 0.000138 2.636009 0.159171 +v 0.000138 0.858021 0.642622 +v 0.000138 1.137178 -1.330638 +v 0.000138 1.955780 -0.197430 +v -1.580013 2.568971 -2.546432 +v 0.000138 2.437295 0.294394 +v 0.000138 2.437295 0.265941 +v 0.000138 2.678031 0.156852 +v 0.000138 2.449419 0.252124 +v 0.000138 2.437176 0.252124 +v 0.000138 2.684679 0.342223 +v 0.000138 2.692061 0.211148 +v 0.000138 2.692061 0.170668 +v 0.000138 2.689298 0.160477 +v 0.000000 1.629708 -2.112964 +v 0.000000 1.314661 -2.250092 +v 0.000138 2.419201 0.318483 +v 0.000000 3.051917 2.387307 +v 0.000138 2.490968 4.793997 +v 0.000138 2.687395 1.207999 +v 0.000138 1.366590 -2.212982 +v 0.000000 1.618783 -2.087531 +v 0.000138 1.813834 0.975579 +v 0.000138 1.914228 -0.260999 +v 0.000138 2.032280 0.976907 +v 0.000138 1.931154 0.974664 +v 0.000138 1.838088 0.978149 +v 0.000138 1.931154 0.964798 +v 0.000138 1.838088 0.954988 +v 0.000138 1.636472 1.154922 +v 0.000138 0.948471 0.937891 +v 0.000138 1.084186 1.231179 +v 0.000138 0.980579 1.095284 +v 0.000138 0.868799 0.790262 +v 0.000138 0.833421 0.665177 +v 0.000138 1.019623 1.155067 +v 0.000138 1.228385 1.250624 +v 0.000138 1.339810 1.250597 +v 0.000138 1.451235 1.250569 +v -1.523024 2.569099 -2.546588 +v -1.523101 2.569053 -1.166092 +v -1.580089 2.568925 -1.166210 +v -1.590053 3.109430 -0.122312 +v -1.519679 3.110076 -0.122020 +v -1.576671 3.050716 -3.953007 +v -1.530162 3.051229 -3.953323 +v 0.000138 2.683199 0.630156 +v 0.000138 2.689111 0.967262 +v -0.043359 2.689090 0.966949 +v -0.044961 2.683172 0.632803 +v -0.126576 2.683230 0.678896 +v -0.134670 2.686785 0.906737 +v -0.175501 2.684713 0.792467 +v 0.000000 2.708137 0.682145 +v 0.000000 2.712201 0.913871 +v -0.052691 2.712187 0.913656 +v -0.053792 2.708118 0.683965 +v -0.109894 2.708159 0.715649 +v -0.115458 2.710602 0.872267 +v -0.143525 2.709178 0.793718 +v 0.000000 2.684561 0.741036 +v 0.000000 2.686531 0.853327 +v -0.023392 2.686524 0.853223 +v -0.023925 2.684552 0.741918 +v -0.052398 2.684572 0.757272 +v -0.055094 2.685756 0.833166 +v -0.068695 2.685066 0.795103 +v -0.068612 2.142498 2.311956 +v -0.124743 2.142498 2.328983 +v -0.176475 2.142498 2.356634 +v -0.221817 2.142498 2.393846 +v -0.259029 2.142498 2.439189 +v -0.286680 2.142498 2.490920 +v -0.303707 2.142498 2.547052 +v -0.309457 2.142498 2.605427 +v -0.303707 2.142498 2.663801 +v -0.286680 2.142498 2.715619 +v -0.259029 2.142498 2.771664 +v -0.221817 2.142498 2.817007 +v -0.176475 2.142498 2.854219 +v -0.131645 2.142498 2.881870 +v -0.068612 2.142498 2.898897 +v -0.039424 2.142498 2.309081 +v -0.324523 2.216429 2.446783 +v -0.099948 2.216429 2.252581 +v -0.055092 2.216429 2.247054 +v -0.368632 2.216429 2.601671 +v -0.129274 2.216429 2.983865 +v -0.359797 2.216429 2.691382 +v -0.325002 2.216429 2.756562 +v -0.099948 2.216429 3.011758 +v -0.149311 2.216429 2.275873 +v -0.359797 2.216429 2.511960 +v -0.054018 2.142498 2.310519 +v -0.077520 2.216429 2.248708 +v -0.019643 2.142498 2.307644 +v -0.027477 2.216429 2.244845 +v -0.009753 2.142498 2.306925 +v -0.013670 2.216429 2.243740 +v 0.000000 2.142498 2.306206 +v 0.000000 2.142498 2.904647 +v 0.000000 2.216429 3.013692 +v 0.000000 2.216429 2.243745 +v 0.000000 2.685546 0.797181 +v 0.000000 2.655274 4.462056 +v -0.372447 2.655274 4.426381 +v -0.720738 2.655274 4.320729 +v -1.041725 2.655274 4.149158 +v -1.323072 2.655274 3.918262 +v -1.553968 2.655274 3.636915 +v -1.725539 2.655274 3.315928 +v -1.831192 2.655274 2.967637 +v -0.720738 2.655274 0.890124 +v -0.372447 2.655274 0.784472 +v -1.041725 2.655274 1.061696 +v -1.323072 2.655274 1.292591 +v -1.553968 2.655274 1.573938 +v -1.725539 2.655274 1.894925 +v -1.831192 2.655274 2.243216 +v -1.866866 2.655274 2.605426 +v -0.300834 2.647813 0.620305 +v -0.300810 2.674970 0.617985 +v -0.249626 2.679077 0.654982 +v 0.000000 1.294739 -2.042672 +v 0.000000 1.284520 -1.967043 +v -0.030487 1.291363 -2.024685 +v -0.030523 1.287496 -1.984415 +v 0.000000 1.285546 -2.036356 +v 0.000000 1.275328 -1.975842 +v -0.025149 1.282170 -2.021550 +v -0.025310 1.278303 -1.988316 +v 0.000000 1.270113 -2.001618 +v 0.000000 1.271170 -2.010522 +v -0.002980 1.270826 -2.008147 +v -0.002981 1.270432 -2.004049 +v 0.000000 1.269018 -2.002604 +v 0.000000 1.270075 -2.009408 +v -0.002311 1.269730 -2.007570 +v -0.002349 1.269337 -2.004629 +v -1.753361 2.735297 -1.141336 +v -1.753281 2.735345 -2.579072 +v -1.750241 2.759422 -3.290794 +v -1.753313 2.735325 -1.991237 +v -1.753278 2.735346 -2.629167 +v -1.726233 2.788662 -3.375606 +v -1.753343 2.735308 -1.462101 +v -1.750848 2.748129 -3.158504 +v -1.405274 2.824274 -3.635078 +v -1.405276 2.824273 -3.590423 +v -1.354435 2.737716 -1.461884 +v -1.405262 2.824281 -3.837857 +v -1.354406 2.737734 -1.991395 +v -1.354370 2.737755 -2.629778 +v -1.443612 2.819920 -4.267671 +v -1.318334 2.737703 -1.063320 +v -1.405255 2.824286 -3.966639 +v -1.354457 2.737703 -1.063320 +v -1.464058 2.815287 -4.591189 +v -1.354453 2.737706 -1.140892 +v -1.356758 2.750506 -3.159434 +v -1.339174 2.737703 -1.063320 +v -1.357355 2.761792 -3.291804 +v -1.380646 2.790898 -3.376614 +v -1.354373 2.737754 -2.579648 +v -1.753365 2.735294 -1.063819 +v -1.770948 2.735294 -1.063819 +v -1.791719 2.735294 -1.063819 +v -1.739755 2.772618 -0.229651 +v -1.739767 2.772611 -0.017272 +v -1.367437 2.775020 -0.016030 +v -1.425934 2.794205 -0.008349 +v -1.739757 2.772617 -0.184238 +v -1.681457 2.792026 -0.051125 +v -1.753391 2.735279 -0.591814 +v -1.553688 2.805706 -0.052613 +v -1.791736 2.735284 -0.764755 +v -1.739738 2.747389 -0.522463 +v -1.681473 2.792552 -0.009202 +v -1.753382 2.735284 -0.764755 +v -1.770964 2.735284 -0.764755 +v -1.425918 2.793679 -0.050272 +v -1.739743 2.768807 -0.437532 +v -1.354483 2.737687 -0.590980 +v 1.354453 2.737706 -1.140892 +v -1.318350 2.737693 -0.764044 +v -1.369381 2.771216 -0.436586 +v -1.367425 2.775027 -0.228559 +v -1.367428 2.775026 -0.183114 +v -1.369312 2.749797 -0.521580 +v -1.354474 2.737693 -0.764044 +v -1.339191 2.737693 -0.764044 +v 1.405255 2.824286 -3.966639 +v 1.443612 2.819920 -4.267671 +v 1.354373 2.737754 -2.579648 +v 1.464058 2.815287 -4.591189 +v 1.354435 2.737716 -1.461884 +v 1.354370 2.737755 -2.629778 +v 1.356758 2.750506 -3.159434 +v 1.380646 2.790898 -3.376614 +v 1.354406 2.737734 -1.991395 +v 1.405274 2.824274 -3.635078 +v 1.405276 2.824273 -3.590423 +v 1.405262 2.824281 -3.837857 +v 1.357355 2.761792 -3.291804 +v 1.354474 2.737693 -0.764044 +v 1.369381 2.771216 -0.436586 +v 1.739767 2.772611 -0.017272 +v 1.367437 2.775020 -0.016030 +v 1.553688 2.805706 -0.052613 +v 1.318334 2.737703 -1.063320 +v 1.425918 2.793679 -0.050272 +v 1.739743 2.768807 -0.437532 +v 1.753391 2.735279 -0.591814 +v 1.369312 2.749797 -0.521580 +v 1.681473 2.792552 -0.009202 +v 1.739738 2.747389 -0.522463 +v 1.367425 2.775027 -0.228559 +v 1.739755 2.772618 -0.229651 +v 1.339174 2.737703 -1.063320 +v 1.739757 2.772617 -0.184238 +v 1.339191 2.737693 -0.764044 +v 1.354483 2.737687 -0.590980 +v 1.681457 2.792026 -0.051125 +v 1.367428 2.775026 -0.183114 +v 1.318350 2.737693 -0.764044 +v 1.354457 2.737703 -1.063320 +v 1.425934 2.794205 -0.008349 +v 1.753278 2.735346 -2.629167 +v 1.750241 2.759422 -3.290794 +v 1.753365 2.735294 -1.063819 +v 1.753382 2.735284 -0.764755 +v 1.770964 2.735284 -0.764755 +v 1.791719 2.735294 -1.063819 +v 1.753281 2.735345 -2.579072 +v 1.753343 2.735308 -1.462101 +v 1.770948 2.735294 -1.063819 +v 1.753313 2.735325 -1.991237 +v 1.750848 2.748129 -3.158504 +v 1.726233 2.788662 -3.375606 +v 1.791736 2.735284 -0.764755 +v 1.753361 2.735297 -1.141336 +s off +f 898 206 912 +f 902 211 916 +f 209 458 459 +f 911 904 240 +f 919 918 226 +f 460 459 466 +f 750 749 2384 +f 211 210 459 +f 204 454 455 +f 2387 211 460 +f 206 205 455 +f 751 750 2411 +f 2425 460 467 +f 454 461 462 +f 455 462 463 +f 456 463 464 +f 458 457 464 +f 459 458 465 +f 917 218 552 +f 913 207 899 +f 204 749 750 +f 750 751 461 +f 910 906 215 +f 218 917 919 +f 237 905 910 +f 537 215 906 +f 214 907 911 +f 907 214 538 +f 898 914 908 +f 899 537 909 +f 920 552 902 +f 462 461 751 +f 464 463 462 +f 465 464 2478 +f 466 465 2477 +f 2390 467 466 +f 2118 2134 2132 +f 2122 2141 2136 +f 1679 1678 1429 +f 1743 1744 1433 +f 1744 1745 1434 +f 2131 1745 1460 +f 2139 1749 1446 +f 1680 1687 1686 +f 1970 2411 2384 +f 1431 1680 1679 +f 1675 1674 1424 +f 2387 2425 1680 +f 1426 1676 1675 +f 1678 1677 1427 +f 1971 2412 2411 +f 2425 2390 1687 +f 1682 1681 1674 +f 1683 1682 1675 +f 1684 1683 1676 +f 1678 1685 1684 +f 1679 1686 1685 +f 1451 1452 1744 +f 1452 1460 1745 +f 1772 1438 2137 +f 2119 1427 2133 +f 1970 1969 1424 +f 1681 1971 1970 +f 2130 1746 1435 +f 2139 2137 1438 +f 2130 2125 1457 +f 1757 2129 2126 +f 2131 2127 1434 +f 1758 1434 2127 +f 2118 1758 2128 +f 2119 2135 2129 +f 2122 1772 2140 +f 1971 1681 1682 +f 1684 2478 1682 +f 2478 1684 1685 +f 2477 1685 1686 +f 2390 2476 1686 +f 751 2412 1971 +f 2471 2387 1431 +f 2471 916 211 +f 914 898 912 +f 921 902 916 +f 210 209 459 +f 525 911 240 +f 529 919 226 +f 467 460 466 +f 2411 750 2384 +f 460 211 459 +f 205 204 455 +f 2425 2387 460 +f 456 206 455 +f 2412 751 2411 +f 2390 2425 467 +f 455 454 462 +f 456 455 463 +f 457 456 464 +f 465 458 464 +f 466 459 465 +f 920 917 552 +f 915 913 899 +f 454 204 750 +f 454 750 461 +f 526 910 215 +f 529 218 919 +f 526 237 910 +f 909 537 906 +f 525 214 911 +f 908 907 538 +f 538 898 908 +f 915 899 909 +f 921 920 902 +f 2478 462 751 +f 2478 464 462 +f 2477 465 2478 +f 2476 466 2477 +f 2476 2390 466 +f 1426 2118 2132 +f 1431 2122 2136 +f 1430 1679 1429 +f 1432 1743 1433 +f 1433 1744 1434 +f 2124 2131 1460 +f 2138 2139 1446 +f 1679 1680 1686 +f 1969 1970 2384 +f 1430 1431 1679 +f 1425 1675 1424 +f 1431 2387 1680 +f 1425 1426 1675 +f 1429 1678 1427 +f 1970 1971 2411 +f 1680 2425 1687 +f 1675 1682 1674 +f 1676 1683 1675 +f 1677 1684 1676 +f 1677 1678 1684 +f 1678 1679 1685 +f 1743 1451 1744 +f 1744 1452 1745 +f 2140 1772 2137 +f 2135 2119 2133 +f 1674 1970 1424 +f 1674 1681 1970 +f 2126 2130 1435 +f 1749 2139 1438 +f 1746 2130 1457 +f 1435 1757 2126 +f 1745 2131 1434 +f 2128 1758 2127 +f 2134 2118 2128 +f 1757 2119 2129 +f 2141 2122 2140 +f 2478 1971 1682 +f 1683 1684 1682 +f 2477 2478 1685 +f 2476 2477 1686 +f 1687 2390 1686 +f 2478 751 1971 +f 2136 2471 1431 +f 2387 2471 211 +s 1 +f 622 599 2 +f 2 4 782 +f 4 6 783 +f 6 8 784 +f 8 10 785 +f 10 12 786 +f 12 14 787 +f 787 14 16 +f 16 18 789 +f 18 20 790 +f 20 22 791 +f 22 24 792 +f 24 26 793 +f 793 26 28 +f 28 30 795 +f 30 2361 2458 +f 15 17 69 +f 45 60 2365 +f 41 40 55 +f 35 50 51 +f 31 2362 2364 +f 41 56 57 +f 36 51 52 +f 31 46 47 +f 42 57 58 +f 38 37 52 +f 32 47 48 +f 44 43 58 +f 39 38 53 +f 33 48 49 +f 44 59 60 +f 39 54 55 +f 35 34 49 +f 531 530 80 +f 29 2360 2367 +f 7 64 63 +f 616 486 485 +f 19 21 71 +f 11 66 65 +f 25 73 72 +f 15 68 67 +f 27 29 75 +f 5 63 62 +f 19 70 69 +f 9 65 64 +f 21 23 72 +f 13 67 66 +f 27 74 73 +f 1 3 62 +f 582 549 83 +f 578 81 1172 +f 1183 566 579 +f 549 564 84 +f 569 77 76 +f 566 85 84 +f 83 1174 1173 +f 569 568 78 +f 1168 80 530 +f 568 531 79 +f 1188 581 565 +f 582 82 81 +f 96 95 40 +f 90 35 36 +f 86 2368 2362 +f 96 41 42 +f 92 91 36 +f 87 86 31 +f 97 42 43 +f 92 37 38 +f 88 87 32 +f 98 43 44 +f 94 93 38 +f 88 33 34 +f 99 44 45 +f 94 39 40 +f 89 34 35 +f 100 45 2363 +f 113 112 97 +f 107 92 93 +f 103 102 87 +f 114 113 98 +f 108 93 94 +f 103 88 89 +f 114 99 100 +f 109 94 95 +f 104 89 90 +f 115 100 2369 +f 110 95 96 +f 105 90 91 +f 112 111 96 +f 107 106 91 +f 87 102 101 +f 80 1168 1167 +f 192 193 484 +f 1184 567 578 +f 195 484 193 +f 195 196 480 +f 82 1173 1172 +f 1182 565 567 +f 79 1167 1166 +f 747 745 1192 +f 580 76 1164 +f 78 1166 1165 +f 1179 530 581 +f 744 532 1180 +f 599 623 625 +f 1202 1203 101 +f 102 103 1204 +f 103 104 1205 +f 1206 1205 104 +f 1206 105 106 +f 1208 1207 106 +f 1208 107 108 +f 1201 1209 108 +f 1201 109 110 +f 110 111 1199 +f 111 112 1198 +f 1197 1198 112 +f 1197 113 114 +f 1196 114 115 +f 1195 115 2370 +f 50 121 122 +f 46 2364 2371 +f 56 127 128 +f 52 51 122 +f 47 46 117 +f 57 128 129 +f 52 123 124 +f 47 118 119 +f 58 129 130 +f 54 53 124 +f 49 48 119 +f 59 130 131 +f 54 125 126 +f 50 49 120 +f 60 131 2372 +f 55 126 127 +f 131 146 2374 +f 127 126 141 +f 122 121 136 +f 117 2371 2373 +f 127 142 143 +f 123 122 137 +f 117 132 133 +f 129 128 143 +f 124 123 138 +f 118 133 134 +f 129 144 145 +f 125 124 139 +f 119 134 135 +f 130 145 146 +f 126 125 140 +f 120 135 136 +f 144 159 160 +f 139 154 155 +f 135 134 149 +f 146 145 160 +f 140 155 156 +f 136 135 150 +f 146 161 2376 +f 141 156 157 +f 137 136 151 +f 132 2373 2375 +f 143 142 157 +f 137 152 153 +f 132 147 148 +f 143 158 159 +f 138 153 154 +f 133 148 149 +f 162 191 190 +f 157 172 173 +f 153 152 167 +f 147 162 163 +f 159 158 173 +f 154 153 168 +f 148 163 164 +f 159 174 175 +f 154 169 170 +f 149 164 165 +f 160 175 176 +f 155 170 171 +f 150 165 166 +f 161 176 2378 +f 156 171 172 +f 151 166 167 +f 147 2375 2377 +f 168 167 186 +f 172 181 180 +f 162 2377 2380 +f 167 166 187 +f 172 171 182 +f 176 177 2379 +f 165 188 187 +f 170 183 182 +f 176 175 178 +f 165 164 189 +f 169 184 183 +f 175 174 179 +f 164 163 190 +f 169 168 185 +f 174 173 180 +f 544 543 202 +f 554 553 195 +f 546 203 202 +f 553 548 196 +f 546 2428 2382 +f 548 540 197 +f 2423 541 192 +f 540 560 198 +f 541 559 193 +f 544 201 200 +f 560 533 199 +f 559 554 194 +f 896 204 205 +f 897 205 206 +f 207 209 900 +f 209 210 901 +f 901 210 211 +f 523 231 826 +f 523 212 213 +f 524 213 214 +f 215 216 527 +f 216 217 528 +f 217 218 529 +f 252 254 264 +f 220 221 255 +f 255 221 222 +f 260 222 223 +f 259 223 224 +f 261 224 225 +f 225 2383 2409 +f 404 235 234 +f 738 756 236 +f 394 245 244 +f 396 247 246 +f 231 232 254 +f 399 234 247 +f 237 238 248 +f 249 226 2441 +f 405 236 235 +f 244 2393 2442 +f 254 232 240 +f 397 246 245 +f 239 226 249 +f 238 239 250 +f 998 993 279 +f 253 240 237 +f 718 661 371 +f 371 661 406 +f 722 889 891 +f 400 242 241 +f 251 248 263 +f 249 2401 2404 +f 264 254 253 +f 250 249 262 +f 263 248 250 +f 266 253 251 +f 756 760 256 +f 236 256 257 +f 257 255 234 +f 234 255 260 +f 247 260 259 +f 259 261 245 +f 245 261 258 +f 258 2409 2393 +f 220 264 266 +f 268 263 223 +f 263 265 224 +f 265 262 225 +f 262 2404 2383 +f 760 757 219 +f 221 266 268 +f 649 300 301 +f 1062 1044 303 +f 646 303 299 +f 1040 275 351 +f 2636 270 355 +f 291 273 350 +f 269 271 354 +f 658 895 892 +f 354 271 285 +f 298 294 650 +f 647 302 304 +f 653 296 302 +f 1140 285 890 +f 1000 994 310 +f 340 287 291 +f 1074 1077 877 +f 1035 1028 671 +f 2673 2667 281 +f 497 290 288 +f 297 293 654 +f 293 296 653 +f 299 295 652 +f 1043 298 651 +f 334 335 412 +f 2633 355 717 +f 330 331 927 +f 933 346 348 +f 342 344 1099 +f 723 338 2673 +f 924 324 345 +f 322 323 923 +f 1027 665 924 +f 1078 1068 868 +f 1089 305 317 +f 928 332 346 +f 326 327 408 +f 1088 307 308 +f 331 332 928 +f 931 347 329 +f 329 321 922 +f 1132 1117 1118 +f 1045 322 925 +f 1090 306 307 +f 343 305 1089 +f 958 283 1017 +f 333 325 410 +f 1093 1048 318 +f 951 279 993 +f 418 362 364 +f 1124 1112 1111 +f 308 342 1098 +f 1143 314 888 +f 407 328 361 +f 414 336 362 +f 1075 875 1107 +f 1046 326 409 +f 767 769 339 +f 1053 1050 363 +f 335 336 414 +f 315 2680 2669 +f 305 357 311 +f 358 1143 342 +f 416 363 333 +f 666 1005 1011 +f 2665 2623 359 +f 1048 1049 310 +f 307 1142 358 +f 722 339 890 +f 353 350 406 +f 894 360 1142 +f 313 357 305 +f 718 340 353 +f 1071 871 875 +f 1103 320 1020 +f 942 1008 1014 +f 1047 351 403 +f 1070 1074 874 +f 2623 2635 370 +f 365 2674 2680 +f 1018 1020 320 +f 1142 369 1143 +f 360 372 369 +f 366 891 888 +f 357 371 373 +f 368 371 357 +f 351 999 1003 +f 1049 1051 374 +f 893 895 658 +f 1076 876 871 +f 378 2395 2394 +f 379 2396 2395 +f 380 381 378 +f 381 382 379 +f 383 384 381 +f 384 385 382 +f 2398 2399 384 +f 2399 2400 385 +f 776 780 675 +f 775 678 688 +f 2396 379 382 +f 382 385 2400 +f 390 233 241 +f 759 758 391 +f 389 388 243 +f 229 387 386 +f 233 390 387 +f 242 391 392 +f 388 2408 2407 +f 390 399 396 +f 391 405 404 +f 392 404 399 +f 395 2442 2408 +f 387 396 397 +f 758 738 405 +f 386 397 394 +f 389 394 395 +f 771 767 722 +f 665 1027 1034 +f 389 227 228 +f 723 2676 2674 +f 2635 2639 717 +f 411 412 516 +f 409 408 512 +f 1147 410 884 +f 522 418 417 +f 511 407 415 +f 518 414 418 +f 1052 409 513 +f 1073 1053 416 +f 412 414 518 +f 514 517 413 +f 290 424 423 +f 277 426 430 +f 423 421 276 +f 419 2659 2646 +f 420 426 277 +f 421 419 272 +f 1055 420 274 +f 427 422 278 +f 284 429 428 +f 1042 1054 429 +f 292 425 424 +f 2647 2663 425 +f 432 431 419 +f 439 433 422 +f 437 426 434 +f 424 438 435 +f 431 2657 2659 +f 425 436 438 +f 437 1145 441 +f 430 878 1056 +f 429 440 442 +f 2663 2656 436 +f 435 432 421 +f 1072 872 420 +f 445 444 728 +f 728 444 443 +f 763 443 444 +f 770 771 366 +f 452 765 444 +f 733 730 469 +f 207 206 456 +f 207 457 458 +f 474 2415 2414 +f 473 2414 2413 +f 478 479 474 +f 478 473 472 +f 484 480 479 +f 483 479 478 +f 196 197 198 +f 482 478 477 +f 2421 484 483 +f 2420 483 482 +f 2418 2419 482 +f 479 480 116 +f 477 472 2413 +f 2418 481 477 +f 539 116 545 +f 1156 1153 1148 +f 1 61 601 +f 85 1176 1175 +f 509 510 498 +f 495 490 277 +f 274 488 1057 +f 272 2646 2654 +f 2666 2647 292 +f 278 491 492 +f 1058 495 286 +f 493 494 284 +f 288 276 489 +f 277 490 488 +f 276 272 487 +f 498 292 290 +f 487 499 501 +f 508 509 497 +f 2654 2662 499 +f 507 502 490 +f 490 502 500 +f 510 2650 2666 +f 488 500 1059 +f 1060 507 495 +f 489 501 508 +f 505 506 494 +f 491 503 504 +f 515 516 331 +f 513 512 323 +f 517 514 321 +f 840 835 851 +f 346 522 521 +f 324 511 519 +f 332 518 522 +f 1061 513 322 +f 1068 1073 873 +f 516 518 332 +f 347 520 517 +f 835 838 852 +f 839 840 849 +f 929 2638 2641 +f 837 839 848 +f 348 836 850 +f 837 836 348 +f 849 843 842 +f 417 364 840 +f 231 523 524 +f 232 524 525 +f 912 206 207 +f 526 527 238 +f 527 528 239 +f 528 529 226 +f 535 552 218 +f 2429 577 541 +f 212 556 555 +f 537 536 216 +f 575 570 561 +f 213 555 538 +f 542 563 540 +f 572 575 539 +f 571 551 533 +f 536 535 217 +f 563 571 560 +f 534 544 561 +f 551 574 545 +f 577 576 559 +f 576 550 554 +f 534 573 543 +f 558 2430 2428 +f 557 542 548 +f 550 557 553 +f 574 572 547 +f 558 546 543 +f 180 181 542 +f 587 595 578 +f 584 582 578 +f 2379 177 577 +f 179 180 557 +f 191 558 573 +f 187 188 570 +f 189 190 573 +f 183 184 551 +f 185 186 572 +f 618 591 532 +f 191 2380 2430 +f 590 565 581 +f 184 185 574 +f 178 179 550 +f 177 178 576 +f 596 579 566 +f 186 187 575 +f 182 183 571 +f 585 568 569 +f 189 534 570 +f 589 588 566 +f 181 182 563 +f 586 549 582 +f 590 587 567 +f 596 2432 2424 +f 583 592 530 +f 593 569 580 +f 591 598 580 +f 583 531 568 +f 597 581 530 +f 589 564 549 +f 619 594 562 +f 70 595 587 +f 71 584 595 +f 61 591 618 +f 68 590 597 +f 75 596 588 +f 64 585 593 +f 74 588 589 +f 72 586 584 +f 69 587 590 +f 75 2367 2432 +f 66 592 583 +f 63 593 598 +f 62 598 591 +f 65 583 585 +f 67 597 592 +f 73 589 586 +f 617 485 594 +f 615 614 606 +f 613 612 604 +f 616 626 627 +f 600 601 485 +f 101 607 606 +f 623 599 622 +f 86 606 2433 +f 2486 1149 776 +f 801 612 2435 +f 800 611 1211 +f 615 2436 2437 +f 2435 612 613 +f 608 624 662 +f 1210 599 609 +f 801 615 607 +f 605 602 610 +f 2437 2433 606 +f 797 603 611 +f 799 802 624 +f 632 616 617 +f 601 618 594 +f 641 617 619 +f 616 620 621 +f 622 781 1 +f 633 626 616 +f 629 628 684 +f 685 662 624 +f 624 802 699 +f 683 628 627 +f 628 621 620 +f 622 600 486 +f 641 2366 2464 +f 631 638 636 +f 636 637 626 +f 632 638 631 +f 634 212 829 +f 635 556 212 +f 819 820 829 +f 730 219 267 +f 642 630 832 +f 824 821 822 +f 2385 2427 635 +f 824 252 267 +f 230 818 823 +f 831 832 630 +f 831 644 643 +f 833 643 230 +f 328 649 648 +f 1050 1062 646 +f 363 646 656 +f 651 650 327 +f 362 647 645 +f 336 653 647 +f 655 654 335 +f 654 653 336 +f 656 652 325 +f 1063 651 326 +f 847 850 836 +f 840 364 645 +f 476 474 116 +f 670 668 955 +f 961 674 673 +f 991 972 1037 +f 319 997 995 +f 1082 1069 869 +f 956 669 674 +f 668 669 956 +f 959 672 667 +f 667 640 950 +f 1064 666 953 +f 2643 670 957 +f 960 673 2668 +f 675 686 697 +f 698 691 2447 +f 676 678 775 +f 629 796 684 +f 675 780 772 +f 707 708 685 +f 682 705 704 +f 700 702 706 +f 690 2446 2449 +f 688 703 779 +f 691 698 697 +f 712 709 707 +f 453 703 688 +f 689 2445 2446 +f 676 748 689 +f 691 692 2440 +f 2448 2410 453 +f 2449 2448 693 +f 688 690 694 +f 696 695 2451 +f 697 2452 2451 +f 697 698 2453 +f 696 2450 2434 +f 695 696 677 +f 2456 748 676 +f 683 704 702 +f 703 714 774 +f 701 679 706 +f 701 707 680 +f 713 712 701 +f 704 705 716 +f 702 704 715 +f 715 709 712 +f 716 710 709 +f 774 778 710 +f 687 711 714 +f 724 731 220 +f 468 724 257 +f 208 735 660 +f 721 229 228 +f 398 233 229 +f 401 241 233 +f 755 759 242 +f 1051 1066 403 +f 1070 870 876 +f 892 269 1141 +f 448 729 728 +f 447 728 727 +f 732 729 448 +f 468 256 219 +f 658 733 450 +f 731 725 264 +f 2403 657 737 +f 400 726 761 +f 401 720 726 +f 720 401 398 +f 734 398 721 +f 736 813 814 +f 804 657 2403 +f 814 812 805 +f 810 735 659 +f 679 681 625 +f 679 701 699 +f 709 710 708 +f 772 773 687 +f 692 691 686 +f 778 711 687 +f 1065 1044 301 +f 743 301 300 +f 304 741 855 +f 741 304 302 +f 740 302 296 +f 1065 743 298 +f 743 742 294 +f 853 741 297 +f 741 740 293 +f 740 739 296 +f 1186 579 2424 +f 618 744 562 +f 1176 85 566 +f 77 1165 1164 +f 746 619 745 +f 1187 1180 532 +f 2431 746 747 +f 2366 641 746 +f 1190 1181 562 +f 533 545 116 +f 200 201 475 +f 201 202 471 +f 202 203 470 +f 198 199 116 +f 539 561 200 +f 203 2382 2416 +f 2445 689 748 +f 725 731 732 +f 508 754 510 +f 754 2648 2650 +f 505 753 752 +f 506 752 1067 +f 508 501 499 +f 754 499 2662 +f 504 503 752 +f 1059 500 502 +f 267 264 725 +f 372 360 894 +f 208 228 227 +f 735 208 736 +f 2388 2391 760 +f 2406 2388 756 +f 2406 738 758 +f 2469 2384 749 +f 2389 2402 758 +f 2405 2389 759 +f 2391 2386 757 +f 755 761 2454 +f 735 810 806 +f 471 470 2416 +f 475 471 2457 +f 2457 2415 474 +f 453 692 687 +f 356 449 733 +f 449 468 730 +f 2410 2440 692 +f 452 732 731 +f 729 732 452 +f 449 452 724 +f 757 639 267 +f 2463 828 639 +f 634 825 2462 +f 2392 639 757 +f 896 903 749 +f 605 604 798 +f 803 101 603 +f 1210 603 101 +f 372 450 770 +f 727 443 763 +f 446 727 766 +f 769 763 765 +f 447 446 764 +f 762 764 771 +f 764 766 767 +f 451 448 447 +f 766 763 769 +f 1141 354 1140 +f 768 1140 339 +f 449 768 765 +f 779 774 716 +f 685 708 773 +f 710 778 773 +f 637 775 627 +f 772 780 662 +f 663 662 780 +f 627 775 777 +f 777 779 705 +f 714 711 778 +f 781 782 3 +f 3 782 783 +f 783 784 7 +f 784 785 9 +f 9 785 786 +f 11 786 787 +f 787 788 15 +f 788 789 17 +f 789 790 19 +f 790 791 21 +f 791 792 23 +f 792 793 25 +f 25 793 794 +f 27 794 795 +f 795 2458 2360 +f 622 621 628 +f 679 623 684 +f 683 700 684 +f 615 801 2459 +f 1152 1212 799 +f 612 801 798 +f 602 797 800 +f 609 625 802 +f 803 798 607 +f 605 803 797 +f 699 802 625 +f 810 815 809 +f 809 815 808 +f 810 805 812 +f 2461 811 808 +f 726 720 807 +f 761 726 808 +f 809 734 660 +f 811 2461 2454 +f 809 807 720 +f 817 816 815 +f 812 804 2460 +f 813 737 657 +f 657 804 812 +f 815 816 817 +f 227 243 1214 +f 813 1213 2563 +f 2407 2564 1214 +f 822 644 630 +f 819 630 642 +f 821 643 644 +f 821 818 230 +f 827 826 822 +f 829 863 862 +f 827 829 212 +f 824 826 231 +f 821 824 823 +f 828 823 267 +f 2443 230 828 +f 860 861 820 +f 637 636 833 +f 632 832 831 +f 2464 2422 642 +f 230 2443 2439 +f 638 831 833 +f 2439 676 637 +f 832 632 641 +f 2640 515 330 +f 515 2640 2642 +f 411 2642 2631 +f 2632 655 334 +f 655 2632 2634 +f 842 843 328 +f 845 846 300 +f 511 324 844 +f 843 845 649 +f 841 842 407 +f 851 852 846 +f 847 841 844 +f 304 838 835 +f 854 856 838 +f 849 851 845 +f 848 842 841 +f 521 417 839 +f 742 300 846 +f 859 857 854 +f 856 854 857 +f 859 853 846 +f 859 855 741 +f 838 856 858 +f 857 846 852 +f 862 866 2468 +f 2467 864 860 +f 820 861 863 +f 860 642 2422 +f 2462 825 862 +f 866 867 865 +f 2467 2468 866 +f 865 861 860 +f 863 867 866 +f 861 865 867 +f 874 877 287 +f 875 343 1096 +f 520 1146 413 +f 871 313 343 +f 870 874 340 +f 872 434 426 +f 876 368 313 +f 962 869 672 +f 934 868 347 +f 870 718 368 +f 868 873 520 +f 1101 317 885 +f 640 879 963 +f 514 884 882 +f 321 882 935 +f 311 373 883 +f 1146 520 873 +f 426 441 878 +f 317 311 887 +f 373 406 881 +f 350 886 881 +f 273 880 886 +f 285 289 338 +f 889 890 338 +f 342 888 315 +f 891 365 315 +f 889 723 365 +f 370 717 895 +f 355 270 269 +f 359 894 307 +f 895 717 355 +f 893 894 359 +f 556 896 897 +f 555 897 898 +f 899 900 536 +f 900 901 535 +f 901 902 552 +f 2427 2469 903 +f 556 635 903 +f 907 906 910 +f 904 911 910 +f 908 909 906 +f 904 905 237 +f 914 915 909 +f 912 913 915 +f 921 916 2471 +f 919 917 2470 +f 918 919 2473 +f 2472 2470 917 +f 920 921 2475 +f 226 918 2474 +f 929 927 668 +f 674 933 932 +f 924 930 1031 +f 923 1006 1007 +f 1069 1078 934 +f 669 928 933 +f 927 928 669 +f 672 931 926 +f 926 922 640 +f 1064 1079 925 +f 670 2643 2638 +f 673 932 2678 +f 869 934 931 +f 922 935 879 +f 1145 947 943 +f 938 939 431 +f 440 944 942 +f 949 938 432 +f 1080 941 872 +f 941 936 434 +f 436 948 946 +f 2656 2645 948 +f 939 2651 2657 +f 1056 1081 944 +f 438 946 949 +f 1144 434 936 +f 441 943 940 +f 945 937 433 +f 957 955 269 +f 285 961 960 +f 316 1019 1024 +f 923 664 1004 +f 1077 1082 962 +f 271 956 961 +f 955 956 271 +f 287 959 954 +f 954 950 273 +f 1083 953 275 +f 2637 957 270 +f 289 960 2677 +f 877 962 959 +f 950 963 880 +f 965 964 985 +f 1036 966 983 +f 979 970 974 +f 978 971 968 +f 964 2652 2655 +f 980 969 971 +f 967 970 979 +f 1087 1084 973 +f 997 319 1100 +f 2653 2661 969 +f 968 965 984 +f 1085 976 987 +f 976 967 982 +f 989 974 977 +f 981 984 938 +f 341 1022 1019 +f 984 985 939 +f 2645 2653 980 +f 1080 1086 987 +f 987 982 936 +f 1087 990 944 +f 943 989 986 +f 985 2655 2651 +f 946 978 981 +f 947 979 989 +f 994 996 318 +f 982 979 947 +f 948 980 978 +f 1000 1003 1002 +f 992 993 998 +f 1105 996 997 +f 996 994 995 +f 999 998 1002 +f 994 1000 1001 +f 1005 1004 1010 +f 1007 1006 1004 +f 1011 1010 993 +f 1015 1012 1013 +f 1015 1014 1008 +f 1009 1008 942 +f 1002 998 349 +f 1005 666 925 +f 312 995 1001 +f 1102 318 996 +f 1013 975 988 +f 375 1001 1002 +f 992 275 953 +f 990 973 1012 +f 1015 1009 944 +f 1010 1004 664 +f 275 992 999 +f 1003 1000 374 +f 1023 1016 1017 +f 1020 1022 1095 +f 1026 1023 1021 +f 1018 1019 1022 +f 1025 1024 1019 +f 1026 1029 1024 +f 1034 1027 1028 +f 1027 1030 1031 +f 1016 1034 1035 +f 1037 1036 1038 +f 1039 1038 1032 +f 1022 341 1097 +f 1026 1025 376 +f 1016 281 952 +f 1021 1017 283 +f 1033 1032 937 +f 352 1023 1026 +f 930 671 1028 +f 1025 1018 309 +f 937 1032 1038 +f 281 1016 1023 +f 367 1024 1029 +f 1029 1021 337 +f 1039 1033 945 +f 648 301 1044 +f 880 1040 1047 +f 337 283 1077 +f 295 1043 1063 +f 930 345 1068 +f 882 1045 1079 +f 1106 885 1048 +f 341 1075 1092 +f 325 1046 1052 +f 415 361 1050 +f 885 887 1049 +f 316 1071 1075 +f 886 1047 1066 +f 719 337 1074 +f 887 883 1051 +f 367 1076 1071 +f 410 1052 1061 +f 519 415 1053 +f 422 1055 1041 +f 286 430 1054 +f 1054 1056 440 +f 433 1072 1055 +f 1041 1057 491 +f 494 1058 1042 +f 1057 1059 503 +f 506 1060 1058 +f 884 1061 1045 +f 345 519 1073 +f 361 648 1062 +f 652 1063 1046 +f 958 671 1069 +f 879 1064 1083 +f 883 881 1066 +f 719 1070 1076 +f 299 303 1044 +f 299 1065 1043 +f 1060 1067 502 +f 503 1059 1067 +f 671 930 1078 +f 935 1079 1064 +f 937 1080 1072 +f 878 940 1081 +f 283 958 1082 +f 963 1083 1040 +f 986 977 1084 +f 966 1085 1086 +f 937 983 1086 +f 986 1087 1081 +f 1092 1107 976 +f 1094 1095 1036 +f 1096 1089 970 +f 1124 1130 1131 +f 973 1102 1105 +f 2661 2644 1090 +f 1107 1096 967 +f 974 1101 1106 +f 970 1089 1101 +f 969 1090 1088 +f 1095 1097 966 +f 977 1106 1093 +f 1139 1121 1122 +f 1098 1099 964 +f 971 1088 1091 +f 1091 1098 965 +f 1012 1105 1104 +f 1099 2670 2652 +f 1104 1100 975 +f 972 1103 1094 +f 2664 2649 1108 +f 2660 1129 1090 +f 1128 306 1090 +f 1128 1108 2649 +f 1113 1114 1115 +f 1125 1115 1114 +f 1127 1124 973 +f 1127 1084 1093 +f 1117 2672 2679 +f 2671 2670 1099 +f 1134 1135 320 +f 1132 2675 2672 +f 1123 1122 1121 +f 1138 1122 1123 +f 1139 1136 1120 +f 1136 966 1097 +f 973 1124 1125 +f 1102 1125 1126 +f 1113 1112 1124 +f 1113 1127 1126 +f 1125 1131 1109 +f 1112 1115 1109 +f 1100 319 1131 +f 1108 1128 1129 +f 2664 1110 1129 +f 306 1128 2658 +f 344 1132 1133 +f 2679 2671 1133 +f 1136 1134 1119 +f 344 2669 2675 +f 1085 1139 1138 +f 1135 1134 1136 +f 1085 966 1136 +f 1092 1138 1137 +f 1120 1119 1116 +f 1137 1123 1116 +f 768 449 356 +f 762 770 450 +f 725 451 450 +f 689 690 688 +f 369 366 314 +f 947 1145 437 +f 1147 413 1146 +f 663 1150 1152 +f 613 610 1152 +f 1150 663 776 +f 2438 613 1151 +f 1161 1156 1157 +f 2500 1159 1154 +f 1155 1150 1149 +f 1159 1160 1155 +f 2486 2493 1154 +f 1157 1156 1151 +f 1153 2494 2487 +f 1157 1152 1150 +f 1160 2543 1161 +f 1160 1159 2500 +f 2501 1158 1161 +f 2501 2494 1153 +f 1160 1162 1157 +f 1158 1153 1156 +f 1180 1163 1189 +f 1179 1188 1169 +f 1187 1164 1163 +f 1188 1182 1170 +f 1184 1171 1170 +f 1186 1177 1176 +f 1185 1172 1171 +f 1186 2541 2540 +f 380 1172 1173 +f 2394 1164 1165 +f 1167 1168 380 +f 1168 1169 1170 +f 1181 1178 1191 +f 1190 1189 1178 +f 1173 1174 1175 +f 1192 1191 1193 +f 2542 1194 1193 +f 1165 1166 1167 +f 2542 2426 747 +f 745 562 1181 +f 84 1175 1174 +f 1175 1176 2398 +f 1170 1171 1172 +f 1176 1177 2540 +f 1189 1163 1164 +f 1189 2394 1191 +f 1191 2394 2539 +f 4 2 1203 +f 4 1202 1204 +f 6 1204 1205 +f 10 8 1205 +f 1206 1207 12 +f 14 12 1207 +f 14 1208 1209 +f 16 1209 1201 +f 18 1201 1200 +f 1200 1199 22 +f 22 1199 1198 +f 26 24 1198 +f 26 1197 1196 +f 28 1196 1195 +f 30 1195 2544 +f 1212 1211 609 +f 603 1210 1211 +f 599 1210 1203 +f 610 800 1212 +f 1213 1214 1216 +f 2563 1213 1215 +f 1214 2564 2568 +f 1220 1219 1217 +f 1220 1218 2571 +f 1219 2576 2572 +f 1216 1218 1217 +f 2567 1215 1217 +f 1218 1216 2568 +f 1213 813 736 +f 1842 2001 1222 +f 2002 1224 1222 +f 2003 1226 1224 +f 2004 1228 1226 +f 2005 1230 1228 +f 2006 1232 1230 +f 2007 1234 1232 +f 2008 1236 1234 +f 2008 2009 1238 +f 2010 1240 1238 +f 2011 1242 1240 +f 2012 1244 1242 +f 2013 1246 1244 +f 2014 1248 1246 +f 2015 1250 1248 +f 2458 2361 1250 +f 1288 1289 1237 +f 2365 1280 1265 +f 1261 1276 1275 +f 1271 1270 1255 +f 1251 1266 2364 +f 1277 1276 1261 +f 1257 1272 1271 +f 1267 1266 1251 +f 1278 1277 1262 +f 1273 1272 1257 +f 1268 1267 1252 +f 1279 1278 1263 +f 1259 1274 1273 +f 1269 1268 1253 +f 1280 1279 1264 +f 1275 1274 1259 +f 1255 1270 1269 +f 1751 1299 1300 +f 1249 1295 2367 +f 1283 1284 1227 +f 1836 1837 1705 +f 1290 1291 1241 +f 1285 1286 1231 +f 1292 1293 1245 +f 1287 1288 1235 +f 1247 1294 1295 +f 1223 1282 1283 +f 1289 1290 1239 +f 1284 1285 1229 +f 1291 1292 1243 +f 1286 1287 1233 +f 1293 1294 1247 +f 1281 1282 1223 +f 1802 1302 1303 +f 1798 2529 2516 +f 1799 1786 2527 +f 1769 1303 1304 +f 1296 1297 1789 +f 1304 1305 1786 +f 2517 2518 1303 +f 1789 1297 1298 +f 1750 1300 2512 +f 1788 1298 1299 +f 1785 1801 2532 +f 1301 1302 1802 +f 1316 1261 1260 +f 1256 1255 1310 +f 1306 1251 2362 +f 1262 1261 1316 +f 1312 1257 1256 +f 1307 1252 1251 +f 1263 1262 1317 +f 1258 1257 1312 +f 1308 1253 1252 +f 1319 1264 1263 +f 1314 1259 1258 +f 1254 1253 1308 +f 1265 1264 1319 +f 1315 1260 1259 +f 1255 1254 1309 +f 2363 1265 1320 +f 1333 1318 1317 +f 1313 1312 1327 +f 1323 1308 1307 +f 1334 1319 1318 +f 1329 1314 1313 +f 1309 1308 1323 +f 1320 1319 1334 +f 1315 1314 1329 +f 1310 1309 1324 +f 2369 1320 1335 +f 1316 1315 1330 +f 1311 1310 1325 +f 1332 1317 1316 +f 1327 1312 1311 +f 1307 1306 1321 +f 2511 2512 1300 +f 1412 2421 1704 +f 1798 1787 2528 +f 1415 1414 1413 +f 1415 1704 1700 +f 2516 2517 1302 +f 1787 1785 2526 +f 2510 2511 1299 +f 1967 2538 2536 +f 1800 2531 2508 +f 2509 2510 1298 +f 1801 1750 2523 +f 1964 2534 2524 +f 1819 1829 1845 +f 2552 1322 1321 +f 2554 1323 1322 +f 2554 2555 1324 +f 1325 1324 2555 +f 2557 1326 1325 +f 2558 1327 1326 +f 2558 2559 1328 +f 2551 1329 1328 +f 1330 1329 2551 +f 2549 1331 1330 +f 2548 1332 1331 +f 2547 1333 1332 +f 1334 1333 2547 +f 2545 1335 1334 +f 2370 1335 2545 +f 1342 1341 1270 +f 1266 1337 2371 +f 1348 1347 1276 +f 1272 1343 1342 +f 1267 1338 1337 +f 1349 1348 1277 +f 1344 1343 1272 +f 1339 1338 1267 +f 1350 1349 1278 +f 1274 1345 1344 +f 1269 1340 1339 +f 1351 1350 1279 +f 1346 1345 1274 +f 1270 1341 1340 +f 2372 1351 1280 +f 1347 1346 1275 +f 2374 1366 1351 +f 1347 1362 1361 +f 1357 1356 1341 +f 1337 1352 2373 +f 1363 1362 1347 +f 1343 1358 1357 +f 1353 1352 1337 +f 1349 1364 1363 +f 1344 1359 1358 +f 1354 1353 1338 +f 1365 1364 1349 +f 1345 1360 1359 +f 1355 1354 1339 +f 1366 1365 1350 +f 1346 1361 1360 +f 1356 1355 1340 +f 1380 1379 1364 +f 1375 1374 1359 +f 1355 1370 1369 +f 1381 1380 1365 +f 1376 1375 1360 +f 1356 1371 1370 +f 2376 1381 1366 +f 1362 1377 1376 +f 1372 1371 1356 +f 1352 1367 2375 +f 1378 1377 1362 +f 1373 1372 1357 +f 1368 1367 1352 +f 1379 1378 1363 +f 1374 1373 1358 +f 1369 1368 1353 +f 1410 1411 1382 +f 1393 1392 1377 +f 1373 1388 1387 +f 1383 1382 1367 +f 1379 1394 1393 +f 1374 1389 1388 +f 1384 1383 1368 +f 1380 1395 1394 +f 1390 1389 1374 +f 1385 1384 1369 +f 1396 1395 1380 +f 1391 1390 1375 +f 1371 1386 1385 +f 2378 1396 1381 +f 1377 1392 1391 +f 1387 1386 1371 +f 1367 1382 2377 +f 1388 1405 1406 +f 1400 1401 1392 +f 1382 1411 2380 +f 1387 1406 1407 +f 1401 1402 1391 +f 2379 1397 1396 +f 1407 1408 1385 +f 1402 1403 1390 +f 1396 1397 1398 +f 1385 1408 1409 +f 1403 1404 1389 +f 1398 1399 1394 +f 1384 1409 1410 +f 1389 1404 1405 +f 1394 1399 1400 +f 1764 1421 1422 +f 1774 1414 1415 +f 1422 1423 1766 +f 1773 1415 1416 +f 1766 1423 2382 +f 1768 1416 1417 +f 2423 2381 1412 +f 1760 1417 1418 +f 1761 1412 1413 +f 1420 1421 1764 +f 1780 1418 1419 +f 1779 1413 1414 +f 2116 2117 1425 +f 2117 2118 1426 +f 2120 1429 1427 +f 2121 1430 1429 +f 2121 2122 1431 +f 2046 1451 1743 +f 1747 1436 1435 +f 1748 1437 1436 +f 1749 1438 1437 +f 1484 1474 1472 +f 1475 1441 1440 +f 1475 1480 1442 +f 1480 1479 1443 +f 1479 1481 1444 +f 1481 1478 1445 +f 2409 2383 1445 +f 1624 1619 1454 +f 1958 1625 1456 +f 1614 1615 1464 +f 1616 1617 1466 +f 1474 1452 1451 +f 1619 1616 1467 +f 1468 1458 1457 +f 2441 1446 1469 +f 1625 1624 1455 +f 2442 2393 1464 +f 1474 1473 1460 +f 1617 1614 1465 +f 1469 1446 1459 +f 1470 1459 1458 +f 2218 1569 1499 +f 1473 1471 1457 +f 1591 1881 1938 +f 1591 1593 1626 +f 2111 2109 1942 +f 1620 1621 1461 +f 1483 1468 1471 +f 2404 2401 1469 +f 1484 1486 1473 +f 1482 1469 1470 +f 1483 1485 1470 +f 1486 1488 1471 +f 1976 1456 1476 +f 1456 1455 1477 +f 1454 1475 1477 +f 1454 1467 1480 +f 1467 1466 1479 +f 1465 1481 1479 +f 1465 1464 1478 +f 2393 2409 1478 +f 1440 1441 1486 +f 1443 1483 1488 +f 1444 1485 1483 +f 1445 1482 1485 +f 2383 2404 1482 +f 1980 1476 1439 +f 1441 1442 1488 +f 1869 1868 1521 +f 2282 1866 1523 +f 1866 1876 1519 +f 1571 1495 2260 +f 2603 2592 1499 +f 1570 1493 1511 +f 1574 1491 1489 +f 1878 1576 2112 +f 1574 2444 1505 +f 1870 1514 1518 +f 1867 1865 1524 +f 1873 1867 1522 +f 2110 1505 2444 +f 2220 1594 1530 +f 1560 1573 1511 +f 2294 2094 2097 +f 2255 2178 1891 +f 1558 2580 2583 +f 1508 1510 1717 +f 1874 1513 1517 +f 1873 1516 1513 +f 1872 1515 1519 +f 1871 1518 2263 +f 1632 1555 1554 +f 2591 2603 1569 +f 2147 1551 1550 +f 2153 2152 1568 +f 2319 1564 1562 +f 1943 2582 2580 +f 2144 2150 1565 +f 2143 1543 1542 +f 2144 1885 2247 +f 2298 2154 2088 +f 2309 2321 1537 +f 2148 2153 1566 +f 1628 1547 1546 +f 2308 2311 1528 +f 2148 1552 1551 +f 2151 2146 1549 +f 2142 1541 1549 +f 2338 2337 2352 +f 2145 1542 2265 +f 2310 2308 1527 +f 2309 1525 1563 +f 2178 2255 2237 +f 1630 1545 1553 +f 2313 2322 1538 +f 2171 2230 2213 +f 1638 1637 1584 +f 2331 2332 2344 +f 2318 1562 1528 +f 2108 1534 2481 +f 1627 1635 1581 +f 1634 1638 1582 +f 2327 2095 2295 +f 1629 1546 2266 +f 1987 1942 1559 +f 2273 1636 1583 +f 1634 1556 1555 +f 2604 2579 1535 +f 1525 1537 1531 +f 1562 2481 1578 +f 1636 2484 1553 +f 2231 2225 1886 +f 1539 2596 2598 +f 2268 1538 1530 +f 1527 1528 1578 +f 1942 2109 2110 +f 1626 1570 1573 +f 2480 1580 2114 +f 1525 1577 1533 +f 1938 1881 1573 +f 2095 2091 2291 +f 2323 2314 2240 +f 2234 2228 2162 +f 1623 1571 2267 +f 2290 2090 2094 +f 1532 2598 2589 +f 2579 2585 1585 +f 2238 1529 1540 +f 2481 1589 2480 +f 1589 1592 1580 +f 2108 2111 1586 +f 1577 1531 1593 +f 1577 1591 1588 +f 2223 2219 1571 +f 2269 1530 1594 +f 2113 1592 1878 +f 2091 2096 2296 +f 2394 2395 1598 +f 2395 2396 1599 +f 1600 1597 1598 +f 1601 1598 1599 +f 1603 1600 1601 +f 1604 1601 1602 +f 2398 1603 1604 +f 2399 1604 1605 +f 1996 1897 1895 +f 1995 1997 1908 +f 1602 1599 2396 +f 2400 1605 1602 +f 1461 1453 1610 +f 1979 1462 1611 +f 1463 1608 1609 +f 1449 1448 1606 +f 1453 1449 1607 +f 1462 1461 1612 +f 2407 2408 1608 +f 1610 1607 1616 +f 1611 1612 1624 +f 1612 1610 1619 +f 2408 2442 1615 +f 1607 1606 1617 +f 1978 1611 1625 +f 1606 1609 1614 +f 1609 1608 1615 +f 1991 1586 1942 +f 2254 2247 1885 +f 1448 1447 1609 +f 2585 2582 1943 +f 1595 2589 2591 +f 1736 1632 1631 +f 1732 1628 1629 +f 2104 1630 2485 +f 1742 1741 1637 +f 1731 1739 1635 +f 1738 1742 1638 +f 2272 2281 1733 +f 2293 2093 1636 +f 1738 1634 1632 +f 1633 1737 1734 +f 1510 1508 1643 +f 1497 1506 1650 +f 1496 1641 1643 +f 2608 2611 1639 +f 1497 1646 1640 +f 1492 1639 1641 +f 1494 1640 2275 +f 1498 1642 1647 +f 1504 1502 1648 +f 2262 1504 1649 +f 1512 1510 1644 +f 2609 1512 1645 +f 1639 1651 1652 +f 1642 1653 1659 +f 1654 1646 1657 +f 1644 1643 1655 +f 2611 2607 1651 +f 1645 1644 1658 +f 1661 2483 1657 +f 2276 2098 1650 +f 1649 1648 1662 +f 2627 1645 1656 +f 1641 1652 1655 +f 1640 2092 2292 +f 1948 1664 1665 +f 1948 1947 1663 +f 1664 1663 1983 +f 1990 1589 1586 +f 1664 1985 1672 +f 1953 1670 1689 +f 1427 1677 1676 +f 2414 2415 1694 +f 2413 2414 1693 +f 1698 1693 1694 +f 1692 1693 1698 +f 1703 1699 1700 +f 1698 1699 1703 +f 1416 1700 1418 +f 1697 1698 1702 +f 1703 1704 2421 +f 1702 1703 2420 +f 2418 1701 1702 +f 1699 1694 1336 +f 1697 2417 2413 +f 2418 2417 1697 +f 1765 1336 1759 +f 2498 2491 2488 +f 1821 1281 1221 +f 2519 2520 1305 +f 1729 1717 1718 +f 1715 1506 1497 +f 2277 1708 1494 +f 1492 1707 2617 +f 1512 2609 2610 +f 1712 1711 1498 +f 2278 2262 1506 +f 1713 1502 1504 +f 1508 1716 1709 +f 1708 1710 1497 +f 1496 1709 1707 +f 1510 1512 1718 +f 1721 1719 1707 +f 1728 1716 1717 +f 1719 2612 2617 +f 1727 1715 1710 +f 1720 1722 1710 +f 1730 1718 2610 +f 2279 1720 1708 +f 2280 2278 1715 +f 1728 1721 1709 +f 1725 1713 1714 +f 1724 1723 1711 +f 1551 1736 1735 +f 1543 1732 1733 +f 1541 1734 1737 +f 2071 2055 2060 +f 1566 1568 1741 +f 1544 1565 1739 +f 1552 1566 1742 +f 1542 1733 2281 +f 2288 2088 2093 +f 1552 1738 1736 +f 1567 1549 1737 +f 2072 2058 2055 +f 2069 2060 2059 +f 2602 2588 1543 +f 2068 2059 2057 +f 2152 2584 2064 +f 2070 2056 1568 +f 2057 1741 1568 +f 2062 2063 2069 +f 1637 2059 2060 +f 1427 1426 2132 +f 1458 1747 1746 +f 1459 1748 1747 +f 1446 1749 1748 +f 1438 1772 1755 +f 2429 2423 1761 +f 1432 1433 1775 +f 1436 1756 1757 +f 1795 1759 1781 +f 1433 1434 1758 +f 1762 1768 1760 +f 1792 1767 1759 +f 1791 1780 1753 +f 1437 1755 1756 +f 1783 1760 1780 +f 1781 1764 1754 +f 1771 1753 1765 +f 1797 1761 1779 +f 1796 1779 1774 +f 1754 1764 1763 +f 1778 1766 2428 +f 1777 1773 1768 +f 1770 1774 1773 +f 1794 1765 1767 +f 1763 1766 1778 +f 1400 1777 1762 +f 1807 1787 1798 +f 1798 1802 1804 +f 2379 2429 1797 +f 1399 1770 1777 +f 1793 1778 1411 +f 1407 1795 1790 +f 1409 1754 1793 +f 1403 1791 1771 +f 1405 1794 1792 +f 1838 1964 1752 +f 1411 1778 2430 +f 1801 1785 1810 +f 1404 1771 1794 +f 1398 1796 1770 +f 1397 1797 1796 +f 1786 1799 1816 +f 1406 1792 1795 +f 1402 1783 1791 +f 1789 1788 1805 +f 1790 1754 1409 +f 1809 1784 1786 +f 1401 1762 1783 +f 1802 1769 1806 +f 1810 1785 1787 +f 1816 1799 2424 +f 1803 1751 1750 +f 1800 1789 1813 +f 1811 1752 1800 +f 1788 1751 1803 +f 1750 1801 1817 +f 1769 1784 1809 +f 1839 1965 1782 +f 1807 1815 1290 +f 1815 1804 1291 +f 1838 1811 1281 +f 1817 1810 1288 +f 1808 1816 1295 +f 1813 1805 1284 +f 1809 1808 1294 +f 1804 1806 1292 +f 1810 1807 1289 +f 1295 1816 2432 +f 1803 1812 1286 +f 1818 1813 1283 +f 1811 1818 1282 +f 1805 1803 1285 +f 1812 1817 1287 +f 1806 1809 1293 +f 1837 1839 1814 +f 1835 1827 1826 +f 1824 1832 1833 +f 1847 1846 1836 +f 1705 1821 1820 +f 1826 1827 1321 +f 1842 1819 1843 +f 1306 2368 2433 +f 2486 1897 1996 +f 2021 2459 2435 +f 2561 1831 2020 +f 1835 1834 2437 +f 1833 1832 2435 +f 1828 1883 1882 +f 1829 1819 2560 +f 2021 2018 1827 +f 1830 1822 1825 +f 1826 2433 2437 +f 1831 1823 2017 +f 2019 1828 1844 +f 1852 1861 1837 +f 1814 1838 1821 +f 1861 1966 1839 +f 1836 1706 1841 +f 1221 2001 1842 +f 1836 1846 1853 +f 1904 1848 1849 +f 1905 1900 1844 +f 1844 1900 1919 +f 1847 1848 1903 +f 1840 1841 1848 +f 1706 1820 1842 +f 1861 2054 2464 +f 1851 1853 1856 +f 1846 1857 1856 +f 1851 1858 1852 +f 2049 1432 1854 +f 1432 1776 1855 +f 2049 2040 2039 +f 1487 1439 1950 +f 2052 1850 1862 +f 2044 2046 2042 +f 1855 2427 2385 +f 2044 2043 1487 +f 2043 2038 1450 +f 2051 1864 1850 +f 1863 1864 2051 +f 1450 1863 2053 +f 1548 1581 1868 +f 2270 1583 1866 +f 1583 1553 1876 +f 1547 1870 1871 +f 1582 1584 1865 +f 1556 1582 1867 +f 1555 1874 1875 +f 1556 1873 1874 +f 1545 1872 1876 +f 1546 1871 2283 +f 2056 2070 2067 +f 1865 1584 2060 +f 1696 1420 1336 +f 2175 1888 1890 +f 2181 2180 1893 +f 2211 2259 2257 +f 2215 2217 1539 +f 2302 2182 2089 +f 2176 2181 1894 +f 2176 1889 1888 +f 2179 2174 1887 +f 2170 1860 1887 +f 2173 1886 2284 +f 2599 2601 1884 +f 2180 2586 2581 +f 1917 1906 1895 +f 1918 2453 2447 +f 1896 1857 1995 +f 1849 1843 1904 +f 1992 2000 1895 +f 1905 1928 1927 +f 1902 1903 1924 +f 1920 1904 1926 +f 1910 1914 2449 +f 1908 1997 1999 +f 1911 1906 1917 +f 1927 1929 1932 +f 1908 1923 1673 +f 1909 1910 2446 +f 1896 1898 1909 +f 1911 2447 2440 +f 2448 1913 1673 +f 1913 2448 2449 +f 1908 1913 1914 +f 1916 2450 2451 +f 2451 2452 1917 +f 1917 2452 2453 +f 2434 2450 1916 +f 1897 1916 1915 +f 2456 2439 1896 +f 1903 1920 1922 +f 1994 1934 1923 +f 1926 1899 1921 +f 1900 1927 1921 +f 1933 1922 1921 +f 1924 1935 1936 +f 1922 1933 1935 +f 1935 1933 1932 +f 1936 1935 1929 +f 1930 1998 1994 +f 1934 1931 1907 +f 1440 1951 1944 +f 1477 1944 1688 +f 1880 1955 1428 +f 1941 1428 1448 +f 1618 1941 1449 +f 1453 1461 1621 +f 1975 1620 1462 +f 2271 1594 1623 +f 2096 2090 2290 +f 2112 1576 2479 +f 1668 1667 1948 +f 1667 1666 1947 +f 1952 1671 1668 +f 1439 1476 1688 +f 1670 1953 1878 +f 1484 1945 1951 +f 2403 2455 1957 +f 1981 1946 1620 +f 1946 1940 1621 +f 1618 1621 1940 +f 1941 1618 1954 +f 1956 1879 2034 +f 2403 1877 2024 +f 2025 2032 2034 +f 1879 1955 2030 +f 1845 1901 1899 +f 1919 1921 1899 +f 1928 1930 1929 +f 1992 1906 1907 +f 1906 1911 1912 +f 1907 1931 1998 +f 2285 1963 1521 +f 1963 1962 1520 +f 1524 2074 2075 +f 1961 1960 1522 +f 1960 1959 1516 +f 2285 2263 1518 +f 1514 1962 1963 +f 2597 2073 1962 +f 1513 1960 1961 +f 1516 1959 1960 +f 2424 1799 2530 +f 1782 1964 1838 +f 1786 1305 2520 +f 2508 2509 1297 +f 1966 1967 1965 +f 2531 1800 1752 +f 2431 2426 1967 +f 2366 2431 1966 +f 2534 1964 1782 +f 1753 1419 1336 +f 1695 1421 1420 +f 1691 1422 1421 +f 1690 1423 1422 +f 1336 1419 1418 +f 1759 1336 1420 +f 2416 2382 1423 +f 2445 2456 1968 +f 1945 1671 1952 +f 1730 1974 1728 +f 2620 2614 1974 +f 1725 1726 1972 +f 2287 1972 1726 +f 1728 1974 1719 +f 1974 2614 2612 +f 1972 1723 1724 +f 2279 2287 1722 +f 1945 1484 1487 +f 2114 1580 1592 +f 1447 1448 1428 +f 1956 1428 1955 +f 2388 1976 1980 +f 2406 1958 1976 +f 1978 1958 2406 +f 1969 2384 2469 +f 2389 1979 1978 +f 2405 1975 1979 +f 2391 1980 1977 +f 2454 1981 1975 +f 2026 2030 1955 +f 1691 2457 2416 +f 2457 1691 1695 +f 2457 1696 1694 +f 1673 1923 1907 +f 1953 1669 1576 +f 1950 1688 1669 +f 2410 1673 1912 +f 1672 1944 1951 +f 1949 1665 1672 +f 1669 1688 1944 +f 1977 1439 1487 +f 2463 2392 1859 +f 1854 2385 2462 +f 1977 1859 2392 +f 2116 1424 1969 +f 2018 1824 1825 +f 2023 2017 1823 +f 1321 1823 2560 +f 677 2434 1897 +f 1592 1589 1990 +f 1947 1986 1983 +f 1666 1984 1986 +f 1985 1983 1989 +f 1667 1982 1984 +f 1982 1990 1991 +f 1984 1991 1987 +f 1667 1668 1671 +f 1986 1987 1989 +f 2444 1574 2479 +f 1988 1989 1559 +f 1985 1988 1669 +f 1936 1994 1999 +f 1905 1992 1993 +f 1993 1998 1930 +f 1857 1846 1847 +f 1992 1905 1882 +f 1883 1996 2000 +f 1847 1902 1997 +f 1997 1902 1925 +f 1998 1931 1934 +f 1221 1223 2002 +f 1225 2003 2002 +f 1227 2004 2003 +f 1229 2005 2004 +f 1229 1231 2006 +f 1231 1233 2007 +f 1235 2008 2007 +f 1235 1237 2009 +f 1239 2010 2009 +f 1241 2011 2010 +f 1243 2012 2011 +f 1243 1245 2013 +f 1245 1247 2014 +f 1249 2015 2014 +f 2360 2458 2015 +f 1842 1849 1848 +f 1904 1843 1899 +f 1903 1848 1904 +f 1835 2436 2459 +f 2019 2562 2492 +f 1832 1824 2018 +f 2020 2017 1822 +f 1829 2019 2022 +f 1827 2018 2023 +f 1825 1822 2017 +f 1845 2022 1919 +f 2029 2035 2030 +f 2029 2027 2028 +f 2030 2037 2032 +f 2461 2035 2028 +f 1946 2028 2027 +f 1981 2031 2028 +f 1880 1954 2029 +f 2031 1981 2454 +f 2029 1954 1940 +f 2035 2036 2037 +f 2460 2024 2032 +f 2033 2034 1877 +f 2032 2024 1877 +f 2035 2460 2037 +f 2566 1463 1447 +f 2033 1957 2563 +f 2407 1463 2566 +f 1850 1864 2042 +f 1862 1850 2039 +f 1864 1863 2041 +f 2041 1863 1450 +f 2042 2046 2047 +f 2082 2083 2049 +f 1432 2049 2047 +f 1451 2046 2044 +f 2041 2038 2043 +f 1487 2043 2048 +f 2443 2463 2048 +f 2080 1862 2040 +f 1857 2050 2053 +f 2051 2052 1852 +f 1862 2422 2464 +f 2439 2443 1450 +f 2053 2051 1858 +f 1857 1896 2439 +f 1861 1852 2052 +f 1732 1543 2588 +f 2587 2590 1628 +f 2590 2595 1547 +f 2595 2593 1870 +f 2593 2597 1514 +f 1548 2063 2062 +f 1520 2066 2065 +f 2064 1544 1731 +f 1869 2065 2063 +f 1627 2062 2061 +f 2071 2065 2066 +f 2064 2061 2067 +f 2055 2058 1524 +f 2074 1524 2058 +f 2069 2063 2065 +f 2061 2062 2068 +f 1741 2057 2059 +f 1962 2073 2066 +f 2079 2075 2074 +f 2077 2074 2076 +f 2066 2073 2079 +f 2079 2073 1961 +f 2078 2076 2058 +f 2072 2066 2077 +f 2468 2086 2082 +f 2080 2084 2467 +f 2083 2081 2040 +f 2422 1862 2080 +f 2462 2466 2082 +f 2085 2087 2086 +f 2086 2468 2467 +f 2080 2081 2085 +f 2086 2087 2083 +f 2087 2085 2081 +f 2094 1560 1507 +f 2316 1563 2095 +f 1740 1737 1633 +f 1563 1533 2091 +f 2090 1938 1560 +f 1646 1654 2092 +f 1533 1588 2096 +f 2182 2179 1892 +f 2154 2151 1567 +f 1588 1938 2090 +f 2088 1567 1740 +f 2321 2326 2105 +f 2183 2099 1860 +f 2102 2104 1734 +f 2155 2102 1541 +f 1531 2107 2103 +f 2093 1740 2484 +f 1646 1650 2098 +f 1537 2105 2107 +f 1593 2103 2101 +f 2101 2106 1570 +f 2106 2100 1493 +f 1505 2110 1558 +f 2109 1943 1558 +f 1535 2108 1562 +f 1535 1585 2111 +f 1585 1943 2109 +f 1590 2113 2115 +f 1575 2112 1489 +f 1527 2114 1579 +f 2115 2112 1575 +f 1579 2114 2113 +f 1776 1775 2117 +f 1775 1758 2118 +f 1756 2120 2119 +f 1755 2121 2120 +f 1772 2122 2121 +f 2123 2469 2427 +f 1776 2116 2123 +f 2130 2126 2127 +f 2124 2125 2130 +f 2126 2129 2128 +f 2124 1460 1457 +f 2129 2135 2134 +f 2135 2133 2132 +f 2141 2475 2471 +f 2139 2473 2470 +f 2138 2474 2473 +f 2472 2140 2137 +f 2140 2472 2475 +f 2474 2138 1446 +f 1888 2147 2149 +f 1894 1893 2152 +f 2144 2250 2251 +f 2227 2226 2143 +f 2289 2089 2154 +f 1889 1894 2153 +f 1889 2148 2147 +f 1892 1887 2146 +f 1860 2142 2146 +f 2284 1886 2145 +f 2601 2602 2143 +f 1893 2581 2584 +f 2089 1892 2151 +f 2099 2155 2142 +f 2483 1661 2163 +f 1651 2159 2158 +f 1660 1662 2162 +f 1652 2158 2169 +f 2092 2161 2300 +f 1654 2156 2161 +f 1656 1658 2166 +f 2626 1656 2168 +f 2607 2621 2159 +f 2276 1660 2164 +f 1658 1655 2169 +f 2156 1654 2482 +f 1661 2098 2160 +f 1653 2157 2165 +f 1489 2175 2177 +f 1505 1509 2180 +f 2244 2239 1536 +f 2143 2226 2224 +f 2297 2097 2182 +f 1491 1505 2181 +f 1491 2176 2175 +f 1507 1511 2174 +f 1493 2170 2174 +f 1495 2173 2303 +f 2592 2599 2171 +f 1509 2583 2586 +f 2097 1507 2179 +f 2100 2183 2170 +f 2205 2184 2185 +f 2203 2186 2256 +f 2199 2209 2194 +f 2198 2201 2188 +f 2616 2613 2184 +f 2200 2198 2191 +f 2199 2190 2187 +f 2307 2210 2193 +f 2320 1539 2217 +f 2628 2200 2189 +f 2204 2185 2188 +f 2207 2196 2305 +f 2202 2187 2196 +f 2209 2206 2197 +f 2158 2204 2201 +f 2239 2242 1561 +f 2159 2205 2204 +f 2625 2168 2200 +f 2300 2161 2207 +f 2156 2202 2207 +f 2164 2210 2307 +f 2163 2160 2206 +f 2621 2616 2205 +f 2166 2169 2201 +f 2167 2163 2209 +f 2214 1530 1538 +f 2167 2199 2202 +f 2168 2166 2198 +f 2220 2221 2222 +f 2218 2213 2212 +f 2325 2324 2217 +f 2216 2217 2215 +f 2222 2218 2219 +f 2214 2215 2221 +f 2230 2224 2225 +f 2224 2226 2227 +f 2213 2230 2231 +f 2235 2234 2233 +f 2228 2234 2235 +f 2229 2164 2162 +f 2222 1622 1569 +f 2145 1886 2225 +f 2221 2215 1532 +f 2322 2325 2216 +f 2208 2195 2233 +f 2222 2221 1595 +f 2173 1495 2212 +f 2210 2235 2232 +f 2235 2210 2164 +f 2230 2171 1884 +f 2219 2212 1495 +f 2223 1623 1594 +f 2243 2241 2237 +f 2315 2242 2240 +f 2246 2249 2241 +f 2242 2239 2238 +f 2239 2244 2245 +f 2244 2249 2246 +f 2254 2255 2248 +f 2247 2248 2251 +f 2236 2237 2255 +f 2258 2256 2257 +f 2252 2258 2259 +f 2317 1561 2242 +f 2246 1613 1596 +f 2172 1501 2236 +f 2241 1557 1503 +f 2253 2165 2157 +f 2246 2243 1572 +f 2150 2251 2248 +f 2245 1596 1529 +f 2258 2252 2157 +f 2243 2236 1501 +f 2249 2244 1587 +f 2249 1939 1557 +f 2259 2211 2165 +f 1868 2282 2264 +f 2267 2260 2100 +f 1557 2294 2297 +f 2283 2263 1515 +f 2150 2298 2288 +f 2299 2265 2102 +f 2326 2313 2268 +f 2312 2295 1561 +f 2272 2266 1545 +f 1635 2273 2270 +f 2105 2268 2269 +f 2295 2291 1536 +f 2286 2267 2106 +f 1939 2290 2294 +f 2107 2269 2271 +f 2291 2296 1587 +f 1630 2104 2281 +f 1739 2293 2273 +f 2261 2275 1642 +f 1506 2262 2274 +f 1660 2276 2274 +f 2275 2292 1653 +f 1711 2277 2261 +f 1714 1504 2262 +f 1723 2279 2277 +f 1726 1714 2278 +f 2265 2281 2104 +f 1565 2288 2293 +f 1581 2270 2282 +f 2266 2283 1872 +f 2178 2302 2289 +f 2303 2284 2099 +f 2103 2271 2286 +f 2296 2290 1939 +f 1519 2285 2264 +f 1519 1515 2263 +f 1722 2287 2280 +f 1723 1972 2287 +f 1891 2289 2298 +f 2284 2299 2155 +f 2292 2300 2157 +f 2098 2276 2301 +f 1503 2297 2302 +f 2260 2303 2183 +f 2206 2307 2304 +f 2306 2305 2186 +f 2157 2300 2306 +f 2301 2307 2206 +f 2196 2327 2312 +f 2256 2315 2314 +f 2190 2309 2316 +f 2344 2345 2351 +f 2193 2232 2325 +f 2622 2189 2310 +f 2187 2316 2327 +f 2194 2197 2326 +f 2190 2194 2321 +f 2189 2191 2308 +f 2186 2317 2315 +f 2197 2304 2313 +f 2342 2341 2359 +f 2184 2319 2318 +f 2191 2188 2311 +f 2185 2318 2311 +f 2232 2233 2324 +f 2613 2618 2319 +f 2195 2320 2324 +f 2192 2257 2314 +f 2331 2624 2594 +f 2630 2629 2310 +f 2310 1526 2348 +f 2594 2328 2348 +f 2333 2332 2335 +f 2334 2335 2345 +f 2347 2304 2193 +f 2313 2304 2347 +f 2615 2606 2337 +f 2319 2618 2619 +f 2354 2323 1540 +f 2352 2337 2606 +f 2341 2342 2343 +f 2343 2342 2358 +f 2359 2341 2340 +f 2317 2186 2356 +f 2345 2344 2193 +f 2346 2345 2322 +f 2333 2347 2344 +f 2346 2347 2333 +f 2345 2335 2329 +f 2329 2335 2332 +f 2320 2350 2351 +f 2349 2348 2328 +f 2624 2630 2349 +f 2351 2600 2596 +f 2353 2352 1564 +f 2353 2619 2615 +f 2356 2340 2339 +f 1564 2352 2605 +f 2358 2359 2305 +f 2356 2354 2355 +f 2305 2359 2356 +f 2357 2358 2312 +f 2340 2343 2336 +f 2336 2343 2357 +f 1988 2479 1576 +f 815 2460 2035 +f 192 2421 1412 +f 1982 1671 1670 +f 1670 1671 1945 +f 1908 1910 1909 +f 1589 2481 1534 +f 2167 2482 1657 +f 2484 1633 2485 +f 1883 1828 2492 +f 2492 1830 1833 +f 1996 1883 2490 +f 2438 2488 2491 +f 1148 2487 2488 +f 2499 2498 2505 +f 2500 2493 2496 +f 2489 2490 2497 +f 2503 2496 2497 +f 2486 2489 2496 +f 2499 2492 2491 +f 2495 2488 2487 +f 2490 2492 2499 +f 2504 2506 2505 +f 2500 2503 2504 +f 2505 2502 2501 +f 2495 2494 2501 +f 2504 2497 2499 +f 2498 2495 2502 +f 2533 2507 2524 +f 2523 2512 2513 +f 2507 2508 2531 +f 2532 2513 2514 +f 2514 2515 2528 +f 2520 2521 2530 +f 2515 2516 2529 +f 2530 2521 2540 +f 1600 1603 2517 +f 2394 1597 2509 +f 1600 2512 2511 +f 2514 2513 2512 +f 2535 2522 2525 +f 2522 2533 2534 +f 2519 2518 2517 +f 2537 2535 2536 +f 2542 2539 2537 +f 2511 2510 2509 +f 1967 2426 2542 +f 1965 2536 2525 +f 2518 2519 1304 +f 2398 2520 2519 +f 2516 2515 2514 +f 2540 2521 2520 +f 2508 2507 2533 +f 2533 2522 2535 +f 2539 2394 2535 +f 1224 2552 2553 +f 1224 1226 2554 +f 1228 2555 2554 +f 1230 2556 2555 +f 1232 2557 2556 +f 1234 2558 2557 +f 1234 1236 2559 +f 1238 2551 2559 +f 1240 2550 2551 +f 1242 2549 2550 +f 1242 1244 2548 +f 2547 2548 1244 +f 1248 2546 2547 +f 1248 1250 2545 +f 2544 2545 1250 +f 1829 2561 2562 +f 2561 2560 1823 +f 2553 2560 1819 +f 2562 2020 1830 +f 2565 2569 2570 +f 2563 2567 2569 +f 2566 2570 2568 +f 2578 2574 2573 +f 2571 2574 2578 +f 2577 2573 2572 +f 2570 2569 2573 +f 2573 2569 2567 +f 2574 2571 2568 +f 2565 2566 1956 +f 1957 2455 737 +f 2575 2578 1219 +f 2578 2577 2576 +f 844 2678 932 +f 1529 1596 2585 +f 1596 1613 2582 +f 2584 2144 1544 +f 2581 1885 2144 +f 2582 1613 1572 +f 2583 1501 2172 +f 2586 2172 1885 +f 2580 1572 1501 +f 2600 2351 2329 +f 1517 1961 2073 +f 2149 1550 2588 +f 2589 1590 1937 +f 1575 1490 2592 +f 2598 1579 1590 +f 2587 2588 1550 +f 2596 1526 1579 +f 1890 2149 2602 +f 2600 2348 1526 +f 2177 1890 2601 +f 1875 1517 2597 +f 1735 1631 2590 +f 1490 2177 2599 +f 1554 1875 2593 +f 1937 1575 2603 +f 1631 1554 2595 +f 1540 1529 2579 +f 2605 2606 2336 +f 2604 2605 2355 +f 2612 1724 1712 +f 1647 1659 2607 +f 2614 1973 1724 +f 1500 1647 2611 +f 2192 2323 2618 +f 2618 2323 2354 +f 2619 2354 2339 +f 2339 2336 2606 +f 2620 2610 1713 +f 1725 1973 2614 +f 2610 2609 1502 +f 1659 2165 2621 +f 2211 2192 2613 +f 2165 2211 2616 +f 2617 1712 1500 +f 2350 2320 2629 +f 2208 2628 2622 +f 2162 2625 2628 +f 1502 2609 2627 +f 1662 2626 2625 +f 2195 2622 2629 +f 1648 2627 2626 +f 2331 2350 2630 +f 2624 2330 2328 +f 742 853 2634 +f 2640 512 408 +f 512 2640 2641 +f 2643 664 923 +f 664 2643 2637 +f 2632 650 294 +f 349 2633 2639 +f 2638 923 323 +f 951 2637 2636 +f 375 402 2639 +f 279 2636 2633 +f 312 375 2635 +f 650 2632 2631 +f 2642 408 327 +f 2665 2658 1131 +f 319 312 2623 +f 2652 972 991 +f 1111 1109 2649 +f 2666 493 282 +f 2655 991 945 +f 1111 2664 2660 +f 280 492 2654 +f 282 428 2663 +f 988 975 2661 +f 2648 753 505 +f 492 504 2662 +f 2657 439 427 +f 2651 945 439 +f 2659 427 280 +f 428 442 2656 +f 442 942 2645 +f 2658 2649 1109 +f 975 1100 2644 +f 2648 2662 504 +f 2650 505 493 +f 1130 2660 2644 +f 942 988 2653 +f 2676 393 376 +f 2668 2678 924 +f 2675 1135 1116 +f 2669 320 1135 +f 2677 2668 665 +f 2670 1103 972 +f 1134 1103 2670 +f 2667 2677 952 +f 1119 1134 2671 +f 2674 376 309 +f 324 924 2678 +f 2672 1116 1119 +f 2680 309 320 +f 2676 2673 352 +f 338 289 2667 +f 781 622 2 +f 781 2 782 +f 782 4 783 +f 783 6 784 +f 784 8 785 +f 785 10 786 +f 786 12 787 +f 788 787 16 +f 788 16 789 +f 789 18 790 +f 790 20 791 +f 791 22 792 +f 792 24 793 +f 794 793 28 +f 794 28 795 +f 795 30 2458 +f 68 15 69 +f 2363 45 2365 +f 56 41 55 +f 36 35 51 +f 46 31 2364 +f 42 41 57 +f 37 36 52 +f 32 31 47 +f 43 42 58 +f 53 38 52 +f 33 32 48 +f 59 44 58 +f 54 39 53 +f 34 33 49 +f 45 44 60 +f 40 39 55 +f 50 35 49 +f 79 531 80 +f 75 29 2367 +f 5 7 63 +f 617 616 485 +f 70 19 71 +f 9 11 65 +f 23 25 72 +f 13 15 67 +f 74 27 75 +f 3 5 62 +f 17 19 69 +f 7 9 64 +f 71 21 72 +f 11 13 66 +f 25 27 73 +f 61 1 62 +f 82 582 83 +f 1185 578 1172 +f 1186 1183 579 +f 83 549 84 +f 580 569 76 +f 564 566 84 +f 82 83 1173 +f 77 569 78 +f 1179 1168 530 +f 78 568 79 +f 1182 1188 565 +f 578 582 81 +f 41 96 40 +f 91 90 36 +f 31 86 2362 +f 97 96 42 +f 37 92 36 +f 32 87 31 +f 98 97 43 +f 93 92 38 +f 33 88 32 +f 99 98 44 +f 39 94 38 +f 89 88 34 +f 100 99 45 +f 95 94 40 +f 90 89 35 +f 2369 100 2363 +f 98 113 97 +f 108 107 93 +f 88 103 87 +f 99 114 98 +f 109 108 94 +f 104 103 89 +f 115 114 100 +f 110 109 95 +f 105 104 90 +f 2370 115 2369 +f 111 110 96 +f 106 105 91 +f 97 112 96 +f 92 107 91 +f 86 87 101 +f 79 80 1167 +f 2421 192 484 +f 1185 1184 578 +f 194 195 193 +f 484 195 480 +f 81 82 1172 +f 1184 1182 567 +f 78 79 1166 +f 1194 747 1192 +f 1187 580 1164 +f 77 78 1165 +f 1188 1179 581 +f 1190 744 1180 +f 609 599 625 +f 102 1202 101 +f 1202 102 1204 +f 1204 103 1205 +f 105 1206 104 +f 1207 1206 106 +f 107 1208 106 +f 1209 1208 108 +f 109 1201 108 +f 1200 1201 110 +f 1200 110 1199 +f 1199 111 1198 +f 113 1197 112 +f 1196 1197 114 +f 1195 1196 115 +f 2544 1195 2370 +f 51 50 122 +f 117 46 2371 +f 57 56 128 +f 123 52 122 +f 118 47 117 +f 58 57 129 +f 53 52 124 +f 48 47 119 +f 59 58 130 +f 125 54 124 +f 120 49 119 +f 60 59 131 +f 55 54 126 +f 121 50 120 +f 2365 60 2372 +f 56 55 127 +f 2372 131 2374 +f 142 127 141 +f 137 122 136 +f 132 117 2373 +f 128 127 143 +f 138 123 137 +f 118 117 133 +f 144 129 143 +f 139 124 138 +f 119 118 134 +f 130 129 145 +f 140 125 139 +f 120 119 135 +f 131 130 146 +f 141 126 140 +f 121 120 136 +f 145 144 160 +f 140 139 155 +f 150 135 149 +f 161 146 160 +f 141 140 156 +f 151 136 150 +f 2374 146 2376 +f 142 141 157 +f 152 137 151 +f 147 132 2375 +f 158 143 157 +f 138 137 153 +f 133 132 148 +f 144 143 159 +f 139 138 154 +f 134 133 149 +f 163 162 190 +f 158 157 173 +f 168 153 167 +f 148 147 163 +f 174 159 173 +f 169 154 168 +f 149 148 164 +f 160 159 175 +f 155 154 170 +f 150 149 165 +f 161 160 176 +f 156 155 171 +f 151 150 166 +f 2376 161 2378 +f 157 156 172 +f 152 151 167 +f 162 147 2377 +f 185 168 186 +f 173 172 180 +f 191 162 2380 +f 186 167 187 +f 181 172 182 +f 2378 176 2379 +f 166 165 187 +f 171 170 182 +f 177 176 178 +f 188 165 189 +f 170 169 183 +f 178 175 179 +f 189 164 190 +f 184 169 185 +f 179 174 180 +f 201 544 202 +f 194 554 195 +f 543 546 202 +f 195 553 196 +f 203 546 2382 +f 196 548 197 +f 2381 2423 192 +f 197 540 198 +f 192 541 193 +f 561 544 200 +f 198 560 199 +f 193 559 194 +f 897 896 205 +f 898 897 206 +f 899 207 900 +f 900 209 901 +f 902 901 211 +f 827 523 826 +f 524 523 213 +f 525 524 214 +f 526 215 527 +f 527 216 528 +f 528 217 529 +f 267 252 264 +f 257 220 255 +f 260 255 222 +f 259 260 223 +f 261 259 224 +f 258 261 225 +f 258 225 2409 +f 399 404 234 +f 405 738 236 +f 395 394 244 +f 397 396 246 +f 252 231 254 +f 396 399 247 +f 251 237 248 +f 2401 249 2441 +f 404 405 235 +f 395 244 2442 +f 253 254 240 +f 394 397 245 +f 250 239 249 +f 248 238 250 +f 349 998 279 +f 251 253 237 +f 368 718 371 +f 373 371 406 +f 366 722 891 +f 401 400 241 +f 268 251 263 +f 262 249 2404 +f 266 264 253 +f 265 250 262 +f 265 263 250 +f 268 266 251 +f 236 756 256 +f 235 236 257 +f 235 257 234 +f 247 234 260 +f 246 247 259 +f 246 259 245 +f 244 245 258 +f 244 258 2393 +f 221 220 266 +f 222 268 223 +f 223 263 224 +f 224 265 225 +f 225 262 2383 +f 256 760 219 +f 222 221 268 +f 648 649 301 +f 646 1062 303 +f 656 646 299 +f 1047 1040 351 +f 2633 2636 355 +f 353 291 350 +f 1141 269 354 +f 356 658 892 +f 1140 354 285 +f 651 298 650 +f 645 647 304 +f 647 653 302 +f 339 1140 890 +f 374 1000 310 +f 353 340 291 +f 874 1074 877 +f 958 1035 671 +f 352 2673 281 +f 496 497 288 +f 655 297 654 +f 654 293 653 +f 656 299 652 +f 1063 1043 651 +f 411 334 412 +f 2639 2633 717 +f 929 330 927 +f 932 933 348 +f 1098 342 1099 +f 2676 723 2673 +f 930 924 345 +f 925 322 923 +f 1030 1027 924 +f 934 1078 868 +f 1101 1089 317 +f 933 928 346 +f 409 326 408 +f 1091 1088 308 +f 927 331 928 +f 926 931 329 +f 926 329 922 +f 1133 1132 1118 +f 1079 1045 925 +f 1088 1090 307 +f 1096 343 1089 +f 1035 958 1017 +f 1147 333 410 +f 1102 1093 318 +f 1010 951 993 +f 417 418 364 +f 1130 1124 1111 +f 1091 308 1098 +f 342 1143 888 +f 415 407 361 +f 418 414 362 +f 1092 1075 1107 +f 1052 1046 409 +f 722 767 339 +f 416 1053 363 +f 412 335 414 +f 344 315 2669 +f 317 305 311 +f 308 358 342 +f 1146 416 333 +f 953 666 1011 +f 306 2665 359 +f 318 1048 310 +f 308 307 358 +f 889 722 890 +f 661 353 406 +f 307 894 1142 +f 343 313 305 +f 661 718 353 +f 1075 1071 875 +f 1094 1103 1020 +f 988 942 1014 +f 1066 1047 403 +f 870 1070 874 +f 359 2623 370 +f 315 365 2680 +f 309 1018 320 +f 358 1142 1143 +f 1142 360 369 +f 314 366 888 +f 311 357 373 +f 313 368 357 +f 403 351 1003 +f 310 1049 374 +f 372 893 658 +f 1071 1076 871 +f 377 378 2394 +f 378 379 2395 +f 377 380 378 +f 378 381 379 +f 380 383 381 +f 381 384 382 +f 383 2398 384 +f 384 2399 385 +f 677 776 675 +f 777 775 688 +f 2397 2396 382 +f 2397 382 2400 +f 392 390 241 +f 242 759 391 +f 227 389 243 +f 228 229 386 +f 229 233 387 +f 241 242 392 +f 243 388 2407 +f 387 390 396 +f 392 391 404 +f 390 392 399 +f 388 395 2408 +f 386 387 397 +f 391 758 405 +f 389 386 394 +f 388 389 395 +f 366 771 722 +f 952 665 1034 +f 386 389 228 +f 365 723 2674 +f 370 2635 717 +f 515 411 516 +f 513 409 512 +f 514 1147 884 +f 521 522 417 +f 519 511 415 +f 522 518 418 +f 1061 1052 513 +f 873 1073 416 +f 516 412 518 +f 1147 514 413 +f 288 290 423 +f 286 277 430 +f 288 423 276 +f 272 419 2646 +f 274 420 277 +f 276 421 272 +f 1041 1055 274 +f 280 427 278 +f 282 284 428 +f 284 1042 429 +f 290 292 424 +f 292 2647 425 +f 421 432 419 +f 427 439 422 +f 1144 437 434 +f 423 424 435 +f 419 431 2659 +f 424 425 438 +f 426 437 441 +f 1054 430 1056 +f 428 429 442 +f 425 2663 436 +f 423 435 421 +f 1055 1072 420 +f 729 445 728 +f 727 728 443 +f 765 763 444 +f 369 770 366 +f 445 452 444 +f 450 733 469 +f 457 207 456 +f 209 207 458 +f 473 474 2414 +f 472 473 2413 +f 473 478 474 +f 477 478 472 +f 483 484 479 +f 482 483 478 +f 480 196 198 +f 481 482 477 +f 2420 2421 483 +f 2419 2420 482 +f 481 2418 482 +f 474 479 116 +f 2417 477 2413 +f 2417 2418 477 +f 547 539 545 +f 1151 1156 1148 +f 600 1 601 +f 84 85 1175 +f 497 509 498 +f 286 495 277 +f 1041 274 1057 +f 487 272 2654 +f 498 2666 292 +f 280 278 492 +f 1042 1058 286 +f 282 493 284 +f 496 288 489 +f 274 277 488 +f 489 276 487 +f 497 498 290 +f 489 487 501 +f 496 508 497 +f 487 2654 499 +f 495 507 490 +f 488 490 500 +f 498 510 2666 +f 1057 488 1059 +f 1058 1060 495 +f 496 489 508 +f 493 505 494 +f 492 491 504 +f 330 515 331 +f 322 513 323 +f 329 517 321 +f 849 840 851 +f 348 346 521 +f 345 324 519 +f 346 332 522 +f 1045 1061 322 +f 868 1068 873 +f 331 516 332 +f 329 347 517 +f 851 835 852 +f 848 839 849 +f 330 929 2641 +f 847 837 848 +f 844 348 850 +f 521 837 348 +f 848 849 842 +f 839 417 840 +f 232 231 524 +f 240 232 525 +f 913 912 207 +f 237 526 238 +f 238 527 239 +f 239 528 226 +f 217 535 218 +f 2423 2429 541 +f 213 212 555 +f 215 537 216 +f 539 575 561 +f 214 213 538 +f 548 542 540 +f 547 572 539 +f 560 571 533 +f 216 536 217 +f 540 563 560 +f 570 534 561 +f 533 551 545 +f 541 577 559 +f 559 576 554 +f 544 534 543 +f 546 558 2428 +f 553 557 548 +f 554 550 553 +f 545 574 547 +f 573 558 543 +f 557 180 542 +f 567 587 578 +f 595 584 578 +f 2429 2379 577 +f 550 179 557 +f 190 191 573 +f 575 187 570 +f 534 189 573 +f 571 183 551 +f 574 185 572 +f 744 618 532 +f 558 191 2430 +f 597 590 581 +f 551 184 574 +f 576 178 550 +f 577 177 576 +f 588 596 566 +f 572 186 575 +f 563 182 571 +f 593 585 569 +f 188 189 570 +f 564 589 566 +f 542 181 563 +f 584 586 582 +f 565 590 567 +f 579 596 2424 +f 531 583 530 +f 598 593 580 +f 532 591 580 +f 585 583 568 +f 592 597 530 +f 586 589 549 +f 745 619 562 +f 69 70 587 +f 70 71 595 +f 601 61 618 +f 67 68 597 +f 74 75 588 +f 63 64 593 +f 73 74 589 +f 71 72 584 +f 68 69 590 +f 596 75 2432 +f 65 66 583 +f 62 63 598 +f 61 62 591 +f 64 65 585 +f 66 67 592 +f 72 73 586 +f 619 617 594 +f 607 615 606 +f 605 613 604 +f 620 616 627 +f 486 600 485 +f 86 101 606 +f 629 623 622 +f 2368 86 2433 +f 677 2486 776 +f 2459 801 2435 +f 1212 800 1211 +f 614 615 2437 +f 2438 2435 613 +f 663 608 662 +f 1211 1210 609 +f 798 801 607 +f 613 605 610 +f 614 2437 606 +f 800 797 611 +f 608 799 624 +f 641 632 617 +f 485 601 594 +f 746 641 619 +f 486 616 621 +f 600 622 1 +f 631 633 616 +f 796 629 684 +f 680 685 624 +f 680 624 699 +f 682 683 627 +f 627 628 620 +f 621 622 486 +f 834 641 2464 +f 633 631 636 +f 633 636 626 +f 616 632 631 +f 825 634 829 +f 634 635 212 +f 827 819 829 +f 469 730 267 +f 834 642 832 +f 826 824 822 +f 634 2385 635 +f 823 824 267 +f 828 230 823 +f 644 831 630 +f 833 831 643 +f 830 833 230 +f 361 328 648 +f 363 1050 646 +f 333 363 656 +f 326 651 327 +f 364 362 645 +f 362 336 647 +f 334 655 335 +f 335 654 336 +f 333 656 325 +f 1046 1063 326 +f 837 847 836 +f 835 840 645 +f 200 476 116 +f 957 670 955 +f 960 961 673 +f 1039 991 1037 +f 312 319 995 +f 962 1082 869 +f 961 956 674 +f 955 668 956 +f 954 959 667 +f 954 667 950 +f 1083 1064 953 +f 2637 2643 957 +f 2677 960 2668 +f 695 675 697 +f 2453 698 2447 +f 637 676 775 +f 623 629 684 +f 686 675 772 +f 680 707 685 +f 683 682 704 +f 684 700 706 +f 694 690 2449 +f 777 688 779 +f 686 691 697 +f 701 712 707 +f 693 453 688 +f 690 689 2446 +f 678 676 689 +f 2447 691 2440 +f 693 2448 453 +f 694 2449 693 +f 693 688 694 +f 2450 696 2451 +f 695 697 2451 +f 2452 697 2453 +f 677 696 2434 +f 675 695 677 +f 2439 2456 676 +f 700 683 702 +f 779 703 774 +f 702 701 706 +f 699 701 680 +f 702 713 701 +f 715 704 716 +f 713 702 715 +f 713 715 712 +f 715 716 709 +f 716 774 710 +f 703 687 714 +f 257 724 220 +f 256 468 257 +f 721 208 660 +f 208 721 228 +f 721 398 229 +f 398 401 233 +f 400 755 242 +f 374 1051 403 +f 1076 1070 876 +f 356 892 1141 +f 447 448 728 +f 446 447 727 +f 451 732 448 +f 730 468 219 +f 372 658 450 +f 220 731 264 +f 2455 2403 737 +f 755 400 761 +f 400 401 726 +f 734 720 398 +f 660 734 721 +f 659 736 814 +f 2460 804 2403 +f 659 814 805 +f 805 810 659 +f 623 679 625 +f 681 679 699 +f 707 709 708 +f 686 772 687 +f 687 692 686 +f 773 778 687 +f 743 1065 301 +f 742 743 300 +f 854 304 855 +f 740 741 302 +f 739 740 296 +f 1043 1065 298 +f 298 743 294 +f 2634 853 297 +f 297 741 293 +f 293 740 296 +f 2541 1186 2424 +f 594 618 562 +f 1183 1176 566 +f 76 77 1164 +f 747 746 745 +f 580 1187 532 +f 2426 2431 747 +f 2431 2366 746 +f 744 1190 562 +f 199 533 116 +f 476 200 475 +f 475 201 471 +f 471 202 470 +f 480 198 116 +f 116 539 200 +f 470 203 2416 +f 2456 2445 748 +f 451 725 732 +f 509 508 510 +f 510 754 2650 +f 506 505 752 +f 1060 506 1067 +f 754 508 499 +f 2648 754 2662 +f 753 504 752 +f 1067 1059 502 +f 469 267 725 +f 893 372 894 +f 736 208 227 +f 659 735 736 +f 756 2388 760 +f 738 2406 756 +f 2402 2406 758 +f 903 2469 749 +f 759 2389 758 +f 755 2405 759 +f 760 2391 757 +f 2405 755 2454 +f 660 735 806 +f 2457 471 2416 +f 476 475 2457 +f 476 2457 474 +f 703 453 687 +f 658 356 733 +f 733 449 730 +f 453 2410 692 +f 724 452 731 +f 445 729 452 +f 468 449 724 +f 219 757 267 +f 2392 2463 639 +f 2385 634 2462 +f 2386 2392 757 +f 204 896 749 +f 803 605 798 +f 797 803 603 +f 1203 1210 101 +f 369 372 770 +f 766 727 763 +f 764 446 766 +f 768 769 765 +f 762 447 764 +f 770 762 771 +f 771 764 767 +f 762 451 447 +f 767 766 769 +f 768 1141 1140 +f 769 768 339 +f 452 449 765 +f 705 779 716 +f 772 685 773 +f 708 710 773 +f 626 637 627 +f 685 772 662 +f 776 663 780 +f 682 627 777 +f 682 777 705 +f 774 714 778 +f 1 781 3 +f 5 3 783 +f 5 783 7 +f 7 784 9 +f 11 9 786 +f 13 11 787 +f 13 787 15 +f 15 788 17 +f 17 789 19 +f 19 790 21 +f 21 791 23 +f 23 792 25 +f 27 25 794 +f 29 27 795 +f 29 795 2360 +f 629 622 628 +f 706 679 684 +f 628 683 684 +f 2436 615 2459 +f 608 1152 799 +f 604 612 798 +f 610 602 800 +f 799 609 802 +f 101 803 607 +f 602 605 797 +f 681 699 625 +f 806 810 809 +f 807 809 808 +f 817 810 812 +f 815 2461 808 +f 808 726 807 +f 811 761 808 +f 806 809 660 +f 761 811 2454 +f 734 809 720 +f 810 817 815 +f 817 812 2460 +f 814 813 657 +f 814 657 812 +f 2460 815 817 +f 736 227 1214 +f 737 813 2563 +f 243 2407 1214 +f 819 822 630 +f 820 819 642 +f 822 821 644 +f 643 821 230 +f 819 827 822 +f 825 829 862 +f 523 827 212 +f 252 824 231 +f 818 821 823 +f 639 828 267 +f 2463 2443 828 +f 642 860 820 +f 830 637 833 +f 638 632 831 +f 834 2464 642 +f 830 230 2439 +f 636 638 833 +f 830 2439 637 +f 834 832 641 +f 2641 2640 330 +f 411 515 2642 +f 334 411 2631 +f 2631 2632 334 +f 297 655 2634 +f 407 842 328 +f 649 845 300 +f 841 511 844 +f 328 843 649 +f 511 841 407 +f 845 851 846 +f 850 847 844 +f 645 304 835 +f 304 854 838 +f 843 849 845 +f 847 848 841 +f 837 521 839 +f 853 742 846 +f 855 859 854 +f 858 856 857 +f 857 859 846 +f 853 859 741 +f 852 838 858 +f 858 857 852 +f 2466 862 2468 +f 2465 2467 860 +f 829 820 863 +f 2465 860 2422 +f 2466 2462 862 +f 864 866 865 +f 864 2467 866 +f 864 865 860 +f 862 863 866 +f 863 861 867 +f 340 874 287 +f 1107 875 1096 +f 517 520 413 +f 875 871 343 +f 718 870 340 +f 420 872 426 +f 871 876 313 +f 959 962 672 +f 931 934 347 +f 876 870 368 +f 347 868 520 +f 1106 1101 885 +f 950 640 963 +f 321 514 882 +f 922 321 935 +f 887 311 883 +f 416 1146 873 +f 430 426 878 +f 885 317 887 +f 883 373 881 +f 406 350 881 +f 350 273 886 +f 890 285 338 +f 723 889 338 +f 344 342 315 +f 888 891 315 +f 891 889 365 +f 893 370 895 +f 892 355 269 +f 306 359 307 +f 892 895 355 +f 370 893 359 +f 555 556 897 +f 538 555 898 +f 537 899 536 +f 536 900 535 +f 535 901 552 +f 635 2427 903 +f 896 556 903 +f 911 907 910 +f 905 904 910 +f 907 908 906 +f 240 904 237 +f 908 914 909 +f 914 912 915 +f 2475 921 2471 +f 2473 919 2470 +f 2474 918 2473 +f 920 2472 917 +f 2472 920 2475 +f 2441 226 2474 +f 670 929 668 +f 673 674 932 +f 1030 924 1031 +f 925 923 1007 +f 869 1069 934 +f 674 669 933 +f 668 927 669 +f 667 672 926 +f 667 926 640 +f 666 1064 925 +f 929 670 2638 +f 2668 673 2678 +f 672 869 931 +f 640 922 879 +f 441 1145 943 +f 432 938 431 +f 442 440 942 +f 435 949 432 +f 1072 1080 872 +f 872 941 434 +f 438 436 946 +f 436 2656 948 +f 431 939 2657 +f 440 1056 944 +f 435 438 949 +f 947 1144 936 +f 878 441 940 +f 439 945 433 +f 270 957 269 +f 289 285 960 +f 367 316 1024 +f 1006 923 1004 +f 877 1077 962 +f 285 271 961 +f 269 955 271 +f 291 287 954 +f 291 954 273 +f 1040 1083 275 +f 2636 2637 270 +f 2667 289 2677 +f 287 877 959 +f 273 950 880 +f 984 965 985 +f 1038 1036 983 +f 989 979 974 +f 981 978 968 +f 985 964 2655 +f 978 980 971 +f 982 967 979 +f 990 1087 973 +f 1104 997 1100 +f 980 2653 969 +f 981 968 984 +f 1086 1085 987 +f 987 976 982 +f 986 989 977 +f 949 981 938 +f 316 341 1019 +f 938 984 939 +f 948 2645 980 +f 941 1080 987 +f 941 987 936 +f 1081 1087 944 +f 940 943 986 +f 939 985 2651 +f 949 946 981 +f 943 947 989 +f 310 994 318 +f 936 982 947 +f 946 948 978 +f 1001 1000 1002 +f 999 992 998 +f 1104 1105 997 +f 997 996 995 +f 1003 999 1002 +f 995 994 1001 +f 1011 1005 1010 +f 1005 1007 1004 +f 992 1011 993 +f 1014 1015 1013 +f 1009 1015 1008 +f 944 1009 942 +f 402 1002 349 +f 1007 1005 925 +f 375 312 1001 +f 1105 1102 996 +f 1014 1013 988 +f 402 375 1002 +f 1011 992 953 +f 1015 990 1012 +f 990 1015 944 +f 951 1010 664 +f 351 275 999 +f 403 1003 374 +f 1021 1023 1017 +f 1094 1020 1095 +f 1029 1026 1021 +f 1020 1018 1022 +f 1018 1025 1019 +f 1025 1026 1024 +f 1035 1034 1028 +f 1028 1027 1031 +f 1017 1016 1035 +f 1039 1037 1038 +f 1033 1039 1032 +f 1095 1022 1097 +f 393 1026 376 +f 1034 1016 952 +f 337 1021 283 +f 945 1033 937 +f 393 352 1026 +f 1031 930 1028 +f 376 1025 309 +f 983 937 1038 +f 352 281 1023 +f 719 367 1029 +f 719 1029 337 +f 991 1039 945 +f 1062 648 1044 +f 886 880 1047 +f 1074 337 1077 +f 652 295 1063 +f 1078 930 1068 +f 935 882 1079 +f 1093 1106 1048 +f 1097 341 1092 +f 410 325 1052 +f 1053 415 1050 +f 1048 885 1049 +f 341 316 1075 +f 881 886 1066 +f 1070 719 1074 +f 1049 887 1051 +f 316 367 1071 +f 884 410 1061 +f 1073 519 1053 +f 278 422 1041 +f 1042 286 1054 +f 429 1054 440 +f 422 433 1055 +f 278 1041 491 +f 284 494 1042 +f 491 1057 503 +f 494 506 1058 +f 882 884 1045 +f 1068 345 1073 +f 1050 361 1062 +f 325 652 1046 +f 1082 958 1069 +f 963 879 1083 +f 1051 883 1066 +f 367 719 1076 +f 1065 299 1044 +f 295 299 1043 +f 507 1060 502 +f 752 503 1067 +f 1069 671 1078 +f 879 935 1064 +f 433 937 1072 +f 1056 878 1081 +f 1077 283 1082 +f 880 963 1040 +f 1087 986 1084 +f 983 966 1086 +f 1080 937 1086 +f 940 986 1081 +f 1085 1092 976 +f 1037 1094 1036 +f 967 1096 970 +f 1125 1124 1131 +f 1012 973 1105 +f 969 2661 1090 +f 976 1107 967 +f 977 974 1106 +f 974 970 1101 +f 971 969 1088 +f 1036 1095 966 +f 1084 977 1093 +f 1138 1139 1122 +f 965 1098 964 +f 968 971 1091 +f 968 1091 965 +f 1013 1012 1104 +f 964 1099 2652 +f 1013 1104 975 +f 1037 972 1094 +f 1110 2664 1108 +f 2644 2660 1090 +f 1129 1128 1090 +f 2658 1128 2649 +f 1112 1113 1115 +f 1126 1125 1114 +f 1084 1127 973 +f 1126 1127 1093 +f 1118 1117 2679 +f 1133 2671 1099 +f 1103 1134 320 +f 1117 1132 2672 +f 1120 1123 1121 +f 1137 1138 1123 +f 1121 1139 1120 +f 1137 1136 1097 +f 1102 973 1125 +f 1093 1102 1126 +f 1127 1113 1124 +f 1114 1113 1126 +f 1115 1125 1109 +f 1111 1112 1109 +f 1130 1100 1131 +f 1110 1108 1129 +f 2660 2664 1129 +f 2665 306 2658 +f 1099 344 1133 +f 1118 2679 1133 +f 1120 1136 1119 +f 1132 344 2675 +f 1092 1085 1138 +f 1137 1135 1136 +f 1139 1085 1136 +f 1097 1092 1137 +f 1123 1120 1116 +f 1135 1137 1116 +f 1141 768 356 +f 451 762 450 +f 469 725 450 +f 678 689 688 +f 1143 369 314 +f 1144 947 437 +f 333 1147 1146 +f 608 663 1152 +f 1151 613 1152 +f 1149 1150 776 +f 1148 2438 1151 +f 1162 1161 1157 +f 2493 2500 1154 +f 1154 1155 1149 +f 1154 1159 1155 +f 1149 2486 1154 +f 1152 1157 1151 +f 1148 1153 2487 +f 1155 1157 1150 +f 1162 1160 1161 +f 2543 1160 2500 +f 2543 2501 1161 +f 1158 2501 1153 +f 1155 1160 1157 +f 1161 1158 1156 +f 1190 1180 1189 +f 1168 1179 1169 +f 1180 1187 1163 +f 1169 1188 1170 +f 1182 1184 1170 +f 1183 1186 1176 +f 1184 1185 1171 +f 1177 1186 2540 +f 383 380 1173 +f 377 2394 1165 +f 377 1167 380 +f 380 1168 1170 +f 1192 1181 1191 +f 1181 1190 1178 +f 383 1173 1175 +f 1194 1192 1193 +f 2539 2542 1193 +f 377 1165 1167 +f 1194 2542 747 +f 1192 745 1181 +f 83 84 1174 +f 383 1175 2398 +f 380 1170 1172 +f 2398 1176 2540 +f 2394 1189 1164 +f 1178 1189 1191 +f 1193 1191 2539 +f 1202 4 1203 +f 6 4 1204 +f 8 6 1205 +f 1206 10 1205 +f 10 1206 12 +f 1208 14 1207 +f 16 14 1209 +f 18 16 1201 +f 20 18 1200 +f 20 1200 22 +f 24 22 1198 +f 1197 26 1198 +f 28 26 1196 +f 30 28 1195 +f 2361 30 2544 +f 799 1212 609 +f 611 603 1211 +f 2 599 1203 +f 1152 610 1212 +f 1215 1213 1216 +f 2567 2563 1215 +f 1216 1214 2568 +f 1218 1220 1217 +f 2575 1220 2571 +f 1217 1219 2572 +f 1215 1216 1217 +f 2572 2567 1217 +f 2571 1218 2568 +f 1214 1213 736 +f 1819 1842 1222 +f 2001 2002 1222 +f 2002 2003 1224 +f 2003 2004 1226 +f 2004 2005 1228 +f 2005 2006 1230 +f 2006 2007 1232 +f 2007 2008 1234 +f 1236 2008 1238 +f 2009 2010 1238 +f 2010 2011 1240 +f 2011 2012 1242 +f 2012 2013 1244 +f 2013 2014 1246 +f 2014 2015 1248 +f 2015 2458 1250 +f 1235 1288 1237 +f 2363 2365 1265 +f 1260 1261 1275 +f 1256 1271 1255 +f 2362 1251 2364 +f 1262 1277 1261 +f 1256 1257 1271 +f 1252 1267 1251 +f 1263 1278 1262 +f 1258 1273 1257 +f 1253 1268 1252 +f 1264 1279 1263 +f 1258 1259 1273 +f 1254 1269 1253 +f 1265 1280 1264 +f 1260 1275 1259 +f 1254 1255 1269 +f 1750 1751 1300 +f 2360 1249 2367 +f 1225 1283 1227 +f 1706 1836 1705 +f 1239 1290 1241 +f 1229 1285 1231 +f 1243 1292 1245 +f 1233 1287 1235 +f 1249 1247 1295 +f 1225 1223 1283 +f 1237 1289 1239 +f 1227 1284 1229 +f 1241 1291 1243 +f 1231 1286 1233 +f 1245 1293 1247 +f 1221 1281 1223 +f 1769 1802 1303 +f 1301 1798 2516 +f 2530 1799 2527 +f 1784 1769 1304 +f 1800 1296 1789 +f 1784 1304 1786 +f 1302 2517 1303 +f 1788 1789 1298 +f 2523 1750 2512 +f 1751 1788 1299 +f 2526 1785 2532 +f 1798 1301 1802 +f 1315 1316 1260 +f 1311 1256 1310 +f 2368 1306 2362 +f 1317 1262 1316 +f 1311 1312 1256 +f 1306 1307 1251 +f 1318 1263 1317 +f 1313 1258 1312 +f 1307 1308 1252 +f 1318 1319 1263 +f 1313 1314 1258 +f 1309 1254 1308 +f 1320 1265 1319 +f 1314 1315 1259 +f 1310 1255 1309 +f 2369 2363 1320 +f 1332 1333 1317 +f 1328 1313 1327 +f 1322 1323 1307 +f 1333 1334 1318 +f 1328 1329 1313 +f 1324 1309 1323 +f 1335 1320 1334 +f 1330 1315 1329 +f 1325 1310 1324 +f 2370 2369 1335 +f 1331 1316 1330 +f 1326 1311 1325 +f 1331 1332 1316 +f 1326 1327 1311 +f 1322 1307 1321 +f 1299 2511 1300 +f 1413 1412 1704 +f 2529 1798 2528 +f 1704 1415 1413 +f 1416 1415 1700 +f 1301 2516 1302 +f 2528 1787 2526 +f 1298 2510 1299 +f 1965 1967 2536 +f 1296 1800 2508 +f 1297 2509 1298 +f 2532 1801 2523 +f 1752 1964 2524 +f 1843 1819 1845 +f 2553 2552 1321 +f 2552 2554 1322 +f 1323 2554 1324 +f 2556 1325 2555 +f 2556 2557 1325 +f 2557 2558 1326 +f 1327 2558 1328 +f 2559 2551 1328 +f 2550 1330 2551 +f 2550 2549 1330 +f 2549 2548 1331 +f 2548 2547 1332 +f 2546 1334 2547 +f 2546 2545 1334 +f 2544 2370 2545 +f 1271 1342 1270 +f 2364 1266 2371 +f 1277 1348 1276 +f 1271 1272 1342 +f 1266 1267 1337 +f 1278 1349 1277 +f 1273 1344 1272 +f 1268 1339 1267 +f 1279 1350 1278 +f 1273 1274 1344 +f 1268 1269 1339 +f 1280 1351 1279 +f 1275 1346 1274 +f 1269 1270 1340 +f 2365 2372 1280 +f 1276 1347 1275 +f 2372 2374 1351 +f 1346 1347 1361 +f 1342 1357 1341 +f 2371 1337 2373 +f 1348 1363 1347 +f 1342 1343 1357 +f 1338 1353 1337 +f 1348 1349 1363 +f 1343 1344 1358 +f 1339 1354 1338 +f 1350 1365 1349 +f 1344 1345 1359 +f 1340 1355 1339 +f 1351 1366 1350 +f 1345 1346 1360 +f 1341 1356 1340 +f 1365 1380 1364 +f 1360 1375 1359 +f 1354 1355 1369 +f 1366 1381 1365 +f 1361 1376 1360 +f 1355 1356 1370 +f 2374 2376 1366 +f 1361 1362 1376 +f 1357 1372 1356 +f 2373 1352 2375 +f 1363 1378 1362 +f 1358 1373 1357 +f 1353 1368 1352 +f 1364 1379 1363 +f 1359 1374 1358 +f 1354 1369 1353 +f 1383 1410 1382 +f 1378 1393 1377 +f 1372 1373 1387 +f 1368 1383 1367 +f 1378 1379 1393 +f 1373 1374 1388 +f 1369 1384 1368 +f 1379 1380 1394 +f 1375 1390 1374 +f 1370 1385 1369 +f 1381 1396 1380 +f 1376 1391 1375 +f 1370 1371 1385 +f 2376 2378 1381 +f 1376 1377 1391 +f 1372 1387 1371 +f 2375 1367 2377 +f 1387 1388 1406 +f 1393 1400 1392 +f 2377 1382 2380 +f 1386 1387 1407 +f 1392 1401 1391 +f 2378 2379 1396 +f 1386 1407 1385 +f 1391 1402 1390 +f 1395 1396 1398 +f 1384 1385 1409 +f 1390 1403 1389 +f 1395 1398 1394 +f 1383 1384 1410 +f 1388 1389 1405 +f 1393 1394 1400 +f 1763 1764 1422 +f 1773 1774 1415 +f 1763 1422 1766 +f 1768 1773 1416 +f 2428 1766 2382 +f 1760 1768 1417 +f 1761 2423 1412 +f 1780 1760 1418 +f 1779 1761 1413 +f 1781 1420 1764 +f 1753 1780 1419 +f 1774 1779 1414 +f 1424 2116 1425 +f 1425 2117 1426 +f 2119 2120 1427 +f 2120 2121 1429 +f 1430 2121 1431 +f 2047 2046 1743 +f 1746 1747 1435 +f 1747 1748 1436 +f 1748 1749 1437 +f 1487 1484 1472 +f 1477 1475 1440 +f 1441 1475 1442 +f 1442 1480 1443 +f 1443 1479 1444 +f 1444 1481 1445 +f 1478 2409 1445 +f 1455 1624 1454 +f 1976 1958 1456 +f 1465 1614 1464 +f 1467 1616 1466 +f 1472 1474 1451 +f 1454 1619 1467 +f 1471 1468 1457 +f 2401 2441 1469 +f 1456 1625 1455 +f 1615 2442 1464 +f 1452 1474 1460 +f 1466 1617 1465 +f 1470 1469 1459 +f 1468 1470 1458 +f 2213 2218 1499 +f 1460 1473 1457 +f 1588 1591 1938 +f 1881 1591 1626 +f 1586 2111 1942 +f 1462 1620 1461 +f 1488 1483 1471 +f 1482 2404 1469 +f 1474 1484 1473 +f 1485 1482 1470 +f 1468 1483 1470 +f 1473 1486 1471 +f 1980 1976 1476 +f 1476 1456 1477 +f 1455 1454 1477 +f 1475 1454 1480 +f 1480 1467 1479 +f 1466 1465 1479 +f 1481 1465 1478 +f 1464 2393 1478 +f 1484 1440 1486 +f 1442 1443 1488 +f 1443 1444 1483 +f 1444 1445 1485 +f 1445 2383 1482 +f 1977 1980 1439 +f 1486 1441 1488 +f 1520 1869 1521 +f 2264 2282 1523 +f 1523 1866 1519 +f 2267 1571 2260 +f 1569 2603 1499 +f 1573 1570 1511 +f 2479 1574 1489 +f 2115 1878 2112 +f 1491 1574 1505 +f 1871 1870 1518 +f 1522 1867 1524 +f 1516 1873 1522 +f 1559 2110 2444 +f 2214 2220 1530 +f 1507 1560 1511 +f 2297 2294 2097 +f 2248 2255 1891 +f 1509 1558 2583 +f 1716 1508 1717 +f 1875 1874 1517 +f 1874 1873 1513 +f 1876 1872 1519 +f 2283 1871 2263 +f 1631 1632 1554 +f 1622 2591 1569 +f 2149 2147 1550 +f 1566 2153 1568 +f 2318 2319 1562 +f 1558 1943 2580 +f 1544 2144 1565 +f 2145 2143 1542 +f 2250 2144 2247 +f 2288 2298 2088 +f 1525 2309 1537 +f 1552 2148 1566 +f 1629 1628 1546 +f 1527 2308 1528 +f 2147 2148 1551 +f 1567 2151 1549 +f 2146 2142 1549 +f 2353 2338 2352 +f 2299 2145 2265 +f 1526 2310 1527 +f 2316 2309 1563 +f 1503 2178 2237 +f 2485 1630 1553 +f 2268 2313 1538 +f 1499 2171 2213 +f 1582 1638 1584 +f 2350 2331 2344 +f 2311 2318 1528 +f 1562 2108 2481 +f 1548 1627 1581 +f 1556 1634 1582 +f 2312 2327 2295 +f 2272 1629 2266 +f 1989 1987 1559 +f 2270 2273 1583 +f 1632 1634 1555 +f 1564 2604 1535 +f 1577 1525 1531 +f 1528 1562 1578 +f 1583 1636 1553 +f 2173 2231 1886 +f 1532 1539 2598 +f 2269 2268 1530 +f 2480 1527 1578 +f 1559 1942 2110 +f 1881 1626 1573 +f 1527 2480 2114 +f 1563 1525 1533 +f 1560 1938 1573 +f 2295 2095 2291 +f 1540 2323 2240 +f 2208 2234 2162 +f 2286 1623 2267 +f 2294 2290 2094 +f 1595 1532 2589 +f 1535 2579 1585 +f 2240 2238 1540 +f 1578 2481 2480 +f 2480 1589 1580 +f 1534 2108 1586 +f 1591 1577 1593 +f 1533 1577 1588 +f 1623 2223 1571 +f 2271 2269 1594 +f 2115 2113 1878 +f 2291 2091 2296 +f 1597 2394 1598 +f 1598 2395 1599 +f 1601 1600 1598 +f 1602 1601 1599 +f 1604 1603 1601 +f 1605 1604 1602 +f 2399 2398 1604 +f 2400 2399 1605 +f 2000 1996 1895 +f 1898 1995 1908 +f 2397 1602 2396 +f 2397 2400 1602 +f 1612 1461 1610 +f 1978 1979 1611 +f 1447 1463 1609 +f 1607 1449 1606 +f 1610 1453 1607 +f 1611 1462 1612 +f 1463 2407 1608 +f 1619 1610 1616 +f 1625 1611 1624 +f 1624 1612 1619 +f 1608 2408 1615 +f 1616 1607 1617 +f 1958 1978 1625 +f 1617 1606 1614 +f 1614 1609 1615 +f 1987 1991 1942 +f 2172 2254 1885 +f 1606 1448 1609 +f 1585 2585 1943 +f 1622 1595 2591 +f 1735 1736 1631 +f 1733 1732 1629 +f 1734 2104 2485 +f 1638 1742 1637 +f 1627 1731 1635 +f 1634 1738 1638 +f 1629 2272 1733 +f 2273 2293 1636 +f 1736 1738 1632 +f 2485 1633 1734 +f 1644 1510 1643 +f 1646 1497 1650 +f 1508 1496 1643 +f 1492 2608 1639 +f 1494 1497 1640 +f 1496 1492 1641 +f 2261 1494 2275 +f 1500 1498 1647 +f 1649 1504 1648 +f 2274 2262 1649 +f 1645 1512 1644 +f 2627 2609 1645 +f 1641 1639 1652 +f 1647 1642 1659 +f 2482 1654 1657 +f 1658 1644 1655 +f 1639 2611 1651 +f 1656 1645 1658 +f 1646 1661 1657 +f 2274 2276 1650 +f 1660 1649 1662 +f 2626 2627 1656 +f 1643 1641 1655 +f 2275 1640 2292 +f 1949 1948 1665 +f 1664 1948 1663 +f 1985 1664 1983 +f 1991 1990 1586 +f 1665 1664 1672 +f 1950 1953 1689 +f 1426 1427 1676 +f 1693 2414 1694 +f 1692 2413 1693 +f 1699 1698 1694 +f 1697 1692 1698 +f 1704 1703 1700 +f 1702 1698 1703 +f 1417 1416 1418 +f 1701 1697 1702 +f 2420 1703 2421 +f 2419 1702 2420 +f 2419 2418 1702 +f 1700 1699 1336 +f 1692 1697 2413 +f 1701 2418 1697 +f 1767 1765 1759 +f 2495 2498 2488 +f 1820 1821 1221 +f 1304 2519 1305 +f 1730 1729 1718 +f 1710 1715 1497 +f 2261 2277 1494 +f 2608 1492 2617 +f 1718 1512 2610 +f 1500 1712 1498 +f 1715 2278 1506 +f 1714 1713 1504 +f 1496 1508 1709 +f 1494 1708 1497 +f 1492 1496 1707 +f 1717 1510 1718 +f 1709 1721 1707 +f 1729 1728 1717 +f 1707 1719 2617 +f 1722 1727 1710 +f 1708 1720 1710 +f 2620 1730 2610 +f 2277 2279 1708 +f 1727 2280 1715 +f 1716 1728 1709 +f 1726 1725 1714 +f 1712 1724 1711 +f 1550 1551 1735 +f 1542 1543 1733 +f 1549 1541 1737 +f 2069 2071 2060 +f 1742 1566 1741 +f 1731 1544 1739 +f 1738 1552 1742 +f 2265 1542 2281 +f 2293 2288 2093 +f 1551 1552 1736 +f 1740 1567 1737 +f 2071 2072 2055 +f 2068 2069 2059 +f 2143 2602 1543 +f 2067 2068 2057 +f 1568 2152 2064 +f 2064 2070 1568 +f 2056 2057 1568 +f 2068 2062 2069 +f 1584 1637 2060 +f 2133 1427 2132 +f 1457 1458 1746 +f 1458 1459 1747 +f 1459 1446 1748 +f 1437 1438 1755 +f 1797 2429 1761 +f 1776 1432 1775 +f 1435 1436 1757 +f 1790 1795 1781 +f 1775 1433 1758 +f 1783 1762 1760 +f 1795 1792 1759 +f 1771 1791 1753 +f 1436 1437 1756 +f 1791 1783 1780 +f 1790 1781 1754 +f 1794 1771 1765 +f 1796 1797 1779 +f 1770 1796 1774 +f 1793 1754 1763 +f 2430 1778 2428 +f 1762 1777 1768 +f 1777 1770 1773 +f 1792 1794 1767 +f 1793 1763 1778 +f 1401 1400 1762 +f 1815 1807 1798 +f 1815 1798 1804 +f 1397 2379 1797 +f 1400 1399 1777 +f 1410 1793 1411 +f 1408 1407 1790 +f 1410 1409 1793 +f 1404 1403 1771 +f 1406 1405 1792 +f 1811 1838 1752 +f 2380 1411 2430 +f 1817 1801 1810 +f 1405 1404 1794 +f 1399 1398 1770 +f 1398 1397 1796 +f 1808 1786 1816 +f 1407 1406 1795 +f 1403 1402 1791 +f 1813 1789 1805 +f 1408 1790 1409 +f 1808 1809 1786 +f 1402 1401 1783 +f 1804 1802 1806 +f 1807 1810 1787 +f 2432 1816 2424 +f 1812 1803 1750 +f 1818 1800 1813 +f 1818 1811 1800 +f 1805 1788 1803 +f 1812 1750 1817 +f 1806 1769 1809 +f 1814 1839 1782 +f 1289 1807 1290 +f 1290 1815 1291 +f 1821 1838 1281 +f 1287 1817 1288 +f 1294 1808 1295 +f 1283 1813 1284 +f 1293 1809 1294 +f 1291 1804 1292 +f 1288 1810 1289 +f 2367 1295 2432 +f 1285 1803 1286 +f 1282 1818 1283 +f 1281 1811 1282 +f 1284 1805 1285 +f 1286 1812 1287 +f 1292 1806 1293 +f 1705 1837 1814 +f 1834 1835 1826 +f 1825 1824 1833 +f 1840 1847 1836 +f 1706 1705 1820 +f 1306 1826 1321 +f 1849 1842 1843 +f 1826 1306 2433 +f 2489 2486 1996 +f 1832 2021 2435 +f 2562 2561 2020 +f 2436 1835 2437 +f 2438 1833 2435 +f 1844 1828 1882 +f 2561 1829 2560 +f 1835 2021 1827 +f 1833 1830 1825 +f 1834 1826 2437 +f 2020 1831 2017 +f 2022 2019 1844 +f 1836 1852 1837 +f 1705 1814 1821 +f 1837 1861 1839 +f 1840 1836 1841 +f 1820 1221 1842 +f 1851 1836 1853 +f 2016 1904 1849 +f 1882 1905 1844 +f 2022 1844 1919 +f 1902 1847 1903 +f 1847 1840 1848 +f 1841 1706 1842 +f 2366 1861 2464 +f 1858 1851 1856 +f 1853 1846 1856 +f 1836 1851 1852 +f 2045 2049 1854 +f 1854 1432 1855 +f 2047 2049 2039 +f 1689 1487 1950 +f 2054 2052 1862 +f 2041 2044 2042 +f 1854 1855 2385 +f 1472 2044 1487 +f 2048 2043 1450 +f 2052 2051 1850 +f 2053 1863 2051 +f 2050 1450 2053 +f 1869 1548 1868 +f 2282 2270 1866 +f 1866 1583 1876 +f 1546 1547 1871 +f 1867 1582 1865 +f 1873 1556 1867 +f 1554 1555 1875 +f 1555 1556 1874 +f 1553 1545 1876 +f 2266 1546 2283 +f 2057 2056 2067 +f 2055 1865 2060 +f 1694 1696 1336 +f 2177 2175 1890 +f 1894 2181 1893 +f 2192 2211 2257 +f 1532 2215 1539 +f 2289 2302 2089 +f 1889 2176 1894 +f 2175 2176 1888 +f 1892 2179 1887 +f 2174 2170 1887 +f 2303 2173 2284 +f 2171 2599 1884 +f 1893 2180 2581 +f 1915 1917 1895 +f 1911 1918 2447 +f 1898 1896 1995 +f 2016 1849 1904 +f 1906 1992 1895 +f 1900 1905 1927 +f 1925 1902 1924 +f 1922 1920 1926 +f 2446 1910 2449 +f 1923 1908 1999 +f 1918 1911 1917 +f 1921 1927 1932 +f 1913 1908 1673 +f 2445 1909 2446 +f 1968 1896 1909 +f 1912 1911 2440 +f 2410 2448 1673 +f 1914 1913 2449 +f 1910 1908 1914 +f 1915 1916 2451 +f 1915 2451 1917 +f 1918 1917 2453 +f 1897 2434 1916 +f 1895 1897 1915 +f 1968 2456 1896 +f 1924 1903 1922 +f 1999 1994 1923 +f 1922 1926 1921 +f 1919 1900 1921 +f 1932 1933 1921 +f 1925 1924 1936 +f 1924 1922 1935 +f 1929 1935 1932 +f 1930 1936 1929 +f 1936 1930 1994 +f 1923 1934 1907 +f 1477 1440 1944 +f 1476 1477 1688 +f 1941 1880 1428 +f 1449 1941 1448 +f 1453 1618 1449 +f 1618 1453 1621 +f 1979 1975 1462 +f 2286 2271 1623 +f 2296 2096 2290 +f 1489 2112 2479 +f 1949 1668 1948 +f 1948 1667 1947 +f 1949 1952 1668 +f 1950 1439 1688 +f 1592 1670 1878 +f 1440 1484 1951 +f 1877 2403 1957 +f 1975 1981 1620 +f 1620 1946 1621 +f 1954 1618 1940 +f 1880 1941 1954 +f 2033 1956 2034 +f 2460 2403 2024 +f 1879 2025 2034 +f 2025 1879 2030 +f 1843 1845 1899 +f 1901 1919 1899 +f 1927 1928 1929 +f 1993 1992 1907 +f 1907 1906 1912 +f 1993 1907 1998 +f 2264 2285 1521 +f 1521 1963 1520 +f 1961 1524 2075 +f 1524 1961 1522 +f 1522 1960 1516 +f 1963 2285 1518 +f 1518 1514 1963 +f 1514 2597 1962 +f 1517 1513 1961 +f 1513 1516 1960 +f 2541 2424 2530 +f 1814 1782 1838 +f 2527 1786 2520 +f 1296 2508 1297 +f 1839 1966 1965 +f 2524 2531 1752 +f 1966 2431 1967 +f 1861 2366 1966 +f 2525 2534 1782 +f 1765 1753 1336 +f 1696 1695 1420 +f 1695 1691 1421 +f 1691 1690 1422 +f 1700 1336 1418 +f 1781 1759 1420 +f 1690 2416 1423 +f 1909 2445 1968 +f 1951 1945 1952 +f 1729 1730 1728 +f 1730 2620 1974 +f 1973 1725 1972 +f 2280 2287 1726 +f 1721 1728 1719 +f 1719 1974 2612 +f 1973 1972 1724 +f 1720 2279 1722 +f 1689 1945 1487 +f 2113 2114 1592 +f 1956 1447 1428 +f 1879 1956 1955 +f 2391 2388 1980 +f 2388 2406 1976 +f 2402 1978 2406 +f 2123 1969 2469 +f 2402 2389 1978 +f 2389 2405 1979 +f 2386 2391 1977 +f 2405 2454 1975 +f 1880 2026 1955 +f 1690 1691 2416 +f 1696 2457 1695 +f 2415 2457 1694 +f 1912 1673 1907 +f 1878 1953 1576 +f 1953 1950 1669 +f 2440 2410 1912 +f 1952 1672 1951 +f 1952 1949 1672 +f 1672 1669 1944 +f 1859 1977 1487 +f 2048 2463 1859 +f 2045 1854 2462 +f 2386 1977 2392 +f 2123 2116 1969 +f 2023 2018 1825 +f 1321 2023 1823 +f 2553 1321 2560 +f 2486 677 1897 +f 1670 1592 1990 +f 1663 1947 1983 +f 1947 1666 1986 +f 1988 1985 1989 +f 1666 1667 1984 +f 1984 1982 1991 +f 1986 1984 1987 +f 1982 1667 1671 +f 1983 1986 1989 +f 1988 2444 2479 +f 2444 1988 1559 +f 1672 1985 1669 +f 1925 1936 1999 +f 1928 1905 1993 +f 1928 1993 1930 +f 1995 1857 1847 +f 2000 1992 1882 +f 1882 1883 2000 +f 1995 1847 1997 +f 1999 1997 1925 +f 1994 1998 1934 +f 2001 1221 2002 +f 1223 1225 2002 +f 1225 1227 2003 +f 1227 1229 2004 +f 2005 1229 2006 +f 2006 1231 2007 +f 1233 1235 2007 +f 2008 1235 2009 +f 1237 1239 2009 +f 1239 1241 2010 +f 1241 1243 2011 +f 2012 1243 2013 +f 2013 1245 2014 +f 1247 1249 2014 +f 1249 2360 2015 +f 1841 1842 1848 +f 1926 1904 1899 +f 1920 1903 1904 +f 2021 1835 2459 +f 1828 2019 2492 +f 2021 1832 2018 +f 1830 2020 1822 +f 1845 1829 2022 +f 1321 1827 2023 +f 2023 1825 2017 +f 1901 1845 1919 +f 2026 2029 2030 +f 2035 2029 2028 +f 2025 2030 2032 +f 2031 2461 2028 +f 1940 1946 2027 +f 1946 1981 2028 +f 2026 1880 2029 +f 2461 2031 2454 +f 2027 2029 1940 +f 2030 2035 2037 +f 2037 2460 2032 +f 1957 2033 1877 +f 2034 2032 1877 +f 2036 2035 2037 +f 1956 2566 1447 +f 2565 2033 2563 +f 2564 2407 2566 +f 2039 1850 2042 +f 2040 1862 2039 +f 2042 1864 2041 +f 2038 2041 1450 +f 2039 2042 2047 +f 2045 2082 2049 +f 1743 1432 2047 +f 1472 1451 2044 +f 2044 2041 2043 +f 1859 1487 2048 +f 1450 2443 2048 +f 2081 2080 2040 +f 1856 1857 2053 +f 1858 2051 1852 +f 2054 1862 2464 +f 2050 2439 1450 +f 1856 2053 1858 +f 2050 1857 2439 +f 2054 1861 2052 +f 2587 1732 2588 +f 1732 2587 1628 +f 1628 2590 1547 +f 1547 2595 1870 +f 1870 2593 1514 +f 1627 1548 2062 +f 1869 1520 2065 +f 2061 2064 1731 +f 1548 1869 2063 +f 1731 1627 2061 +f 2072 2071 2066 +f 2070 2064 2067 +f 1865 2055 1524 +f 2076 2074 2058 +f 2071 2069 2065 +f 2067 2061 2068 +f 1637 1741 2059 +f 1520 1962 2066 +f 2077 2079 2074 +f 2078 2077 2076 +f 2077 2066 2079 +f 2075 2079 1961 +f 2072 2078 2058 +f 2078 2072 2077 +f 2466 2468 2082 +f 2465 2080 2467 +f 2049 2083 2040 +f 2465 2422 2080 +f 2045 2462 2082 +f 2084 2085 2086 +f 2084 2086 2467 +f 2084 2080 2085 +f 2082 2086 2083 +f 2083 2087 2081 +f 2097 2094 1507 +f 2327 2316 2095 +f 2484 1740 1633 +f 2095 1563 2091 +f 2094 2090 1560 +f 1640 1646 2092 +f 2091 1533 2096 +f 2089 2182 1892 +f 2088 2154 1567 +f 2096 1588 2090 +f 2093 2088 1740 +f 1537 2321 2105 +f 2170 2183 1860 +f 1541 2102 1734 +f 2142 2155 1541 +f 1593 1531 2103 +f 1636 2093 2484 +f 1661 1646 2098 +f 1531 1537 2107 +f 1626 1593 2101 +f 1626 2101 1570 +f 1570 2106 1493 +f 1509 1505 1558 +f 2110 2109 1558 +f 1564 1535 1562 +f 2108 1535 2111 +f 2111 1585 2109 +f 1937 1590 2115 +f 1490 1575 1489 +f 1526 1527 1579 +f 1937 2115 1575 +f 1590 1579 2113 +f 2116 1776 2117 +f 2117 1775 2118 +f 1757 1756 2119 +f 1756 1755 2120 +f 1755 1772 2121 +f 1855 2123 2427 +f 1855 1776 2123 +f 2131 2130 2127 +f 2131 2124 2130 +f 2127 2126 2128 +f 2125 2124 1457 +f 2128 2129 2134 +f 2134 2135 2132 +f 2136 2141 2471 +f 2137 2139 2470 +f 2139 2138 2473 +f 2470 2472 2137 +f 2141 2140 2475 +f 2441 2474 1446 +f 1890 1888 2149 +f 2153 1894 2152 +f 2150 2144 2251 +f 2145 2227 2143 +f 2298 2289 2154 +f 2148 1889 2153 +f 1888 1889 2147 +f 2151 1892 2146 +f 1887 1860 2146 +f 2299 2284 2145 +f 1884 2601 2143 +f 2152 1893 2584 +f 2154 2089 2151 +f 1860 2099 2142 +f 2167 2483 2163 +f 1652 1651 2158 +f 2164 1660 2162 +f 1655 1652 2169 +f 2292 2092 2300 +f 2092 1654 2161 +f 2168 1656 2166 +f 2625 2626 2168 +f 1651 2607 2159 +f 2301 2276 2164 +f 2166 1658 2169 +f 2167 2156 2482 +f 2163 1661 2160 +f 1659 1653 2165 +f 1490 1489 2177 +f 2181 1505 2180 +f 1587 2244 1536 +f 1884 2143 2224 +f 2302 2297 2182 +f 2176 1491 2181 +f 1489 1491 2175 +f 2179 1507 2174 +f 1511 1493 2174 +f 2260 1495 2303 +f 1499 2592 2171 +f 2180 1509 2586 +f 2182 2097 2179 +f 1493 2100 2170 +f 2204 2205 2185 +f 2258 2203 2256 +f 2190 2199 2194 +f 2191 2198 2188 +f 2205 2616 2184 +f 2189 2200 2191 +f 2202 2199 2187 +f 2304 2307 2193 +f 2324 2320 2217 +f 2622 2628 2189 +f 2201 2204 2188 +f 2306 2207 2305 +f 2207 2202 2196 +f 2194 2209 2197 +f 2169 2158 2201 +f 1536 2239 1561 +f 2158 2159 2204 +f 2628 2625 2200 +f 2306 2300 2207 +f 2161 2156 2207 +f 2301 2164 2307 +f 2209 2163 2206 +f 2159 2621 2205 +f 2198 2166 2201 +f 2199 2167 2209 +f 2216 2214 1538 +f 2156 2167 2202 +f 2200 2168 2198 +f 2223 2220 2222 +f 2219 2218 2212 +f 2216 2325 2217 +f 2214 2216 2215 +f 2223 2222 2219 +f 2220 2214 2221 +f 2231 2230 2225 +f 2225 2224 2227 +f 2212 2213 2231 +f 2232 2235 2233 +f 2229 2228 2235 +f 2228 2229 2162 +f 2218 2222 1569 +f 2227 2145 2225 +f 1595 2221 1532 +f 1538 2322 2216 +f 2234 2208 2233 +f 1622 2222 1595 +f 2231 2173 2212 +f 2193 2210 2232 +f 2229 2235 2164 +f 2224 2230 1884 +f 1571 2219 1495 +f 2220 2223 1594 +f 2236 2243 2237 +f 2314 2315 2240 +f 2243 2246 2241 +f 2240 2242 2238 +f 2238 2239 2245 +f 2245 2244 2246 +f 2247 2254 2248 +f 2250 2247 2251 +f 2254 2236 2255 +f 2259 2258 2257 +f 2253 2252 2259 +f 2315 2317 2242 +f 2245 2246 1596 +f 2254 2172 2236 +f 2237 2241 1503 +f 2252 2253 2157 +f 1613 2246 1572 +f 1891 2150 2248 +f 2238 2245 1529 +f 2203 2258 2157 +f 1572 2243 1501 +f 1939 2249 1587 +f 2241 2249 1557 +f 2253 2259 2165 +f 1521 1868 2264 +f 2106 2267 2100 +f 1503 1557 2297 +f 1872 2283 1515 +f 1565 2150 2288 +f 2155 2299 2102 +f 2105 2326 2268 +f 2317 2312 1561 +f 1630 2272 1545 +f 1581 1635 2270 +f 2107 2105 2269 +f 1561 2295 1536 +f 2101 2286 2106 +f 1557 1939 2294 +f 2103 2107 2271 +f 1536 2291 1587 +f 2272 1630 2281 +f 1635 1739 2273 +f 1498 2261 1642 +f 1650 1506 2274 +f 1649 1660 2274 +f 1642 2275 1653 +f 1498 1711 2261 +f 2278 1714 2262 +f 1711 1723 2277 +f 2280 1726 2278 +f 2102 2265 2104 +f 1739 1565 2293 +f 1868 1581 2282 +f 1545 2266 1872 +f 1891 2178 2289 +f 2183 2303 2099 +f 2101 2103 2286 +f 1587 2296 1939 +f 1523 1519 2264 +f 2285 1519 2263 +f 1727 1722 2280 +f 2279 1723 2287 +f 2150 1891 2298 +f 2099 2284 2155 +f 1653 2292 2157 +f 2160 2098 2301 +f 2178 1503 2302 +f 2100 2260 2183 +f 2197 2206 2304 +f 2203 2306 2186 +f 2203 2157 2306 +f 2160 2301 2206 +f 2305 2196 2312 +f 2257 2256 2314 +f 2187 2190 2316 +f 2350 2344 2351 +f 2322 2193 2325 +f 2629 2622 2310 +f 2196 2187 2327 +f 2321 2194 2326 +f 2309 2190 2321 +f 2310 2189 2308 +f 2256 2186 2315 +f 2326 2197 2313 +f 2358 2342 2359 +f 2185 2184 2318 +f 2308 2191 2311 +f 2188 2185 2311 +f 2325 2232 2324 +f 2184 2613 2319 +f 2233 2195 2324 +f 2323 2192 2314 +f 2329 2331 2594 +f 2349 2630 2310 +f 2349 2310 2348 +f 2600 2594 2348 +f 2334 2333 2335 +f 2346 2334 2345 +f 2344 2347 2193 +f 2346 2313 2347 +f 2338 2615 2337 +f 2353 2319 2619 +f 2355 2354 1540 +f 2605 2352 2606 +f 2340 2341 2343 +f 2357 2343 2358 +f 2356 2359 2340 +f 2357 2317 2356 +f 2322 2345 2193 +f 2313 2346 2322 +f 2332 2333 2344 +f 2334 2346 2333 +f 2351 2345 2329 +f 2331 2329 2332 +f 1539 2320 2351 +f 2330 2349 2328 +f 2330 2624 2349 +f 1539 2351 2596 +f 2319 2353 1564 +f 2338 2353 2615 +f 2354 2356 2339 +f 2604 1564 2605 +f 2312 2358 2305 +f 2357 2356 2355 +f 2186 2305 2356 +f 2317 2357 2312 +f 2339 2340 2336 +f 2355 2336 2357 +f 1669 1988 1576 +f 2461 815 2035 +f 2381 192 1412 +f 1990 1982 1670 +f 1689 1670 1945 +f 1898 1908 1909 +f 1586 1589 1534 +f 2483 2167 1657 +f 1553 2484 2485 +f 2490 1883 2492 +f 2491 2492 1833 +f 2489 1996 2490 +f 1833 2438 2491 +f 2438 1148 2488 +f 2506 2499 2505 +f 2503 2500 2496 +f 2496 2489 2497 +f 2504 2503 2497 +f 2493 2486 2496 +f 2498 2499 2491 +f 2494 2495 2487 +f 2497 2490 2499 +f 2543 2504 2505 +f 2543 2500 2504 +f 2543 2505 2501 +f 2502 2495 2501 +f 2506 2504 2499 +f 2505 2498 2502 +f 2534 2533 2524 +f 2532 2523 2513 +f 2524 2507 2531 +f 2526 2532 2514 +f 2526 2514 2528 +f 2527 2520 2530 +f 2528 2515 2529 +f 2541 2530 2540 +f 2516 1600 2517 +f 2508 2394 2509 +f 1597 1600 2511 +f 1600 2514 2512 +f 2536 2535 2525 +f 2525 2522 2534 +f 1603 2519 2517 +f 2538 2537 2536 +f 2538 2542 2537 +f 1597 2511 2509 +f 2538 1967 2542 +f 1782 1965 2525 +f 1303 2518 1304 +f 1603 2398 2519 +f 1600 2516 2514 +f 2398 2540 2520 +f 2394 2508 2533 +f 2394 2533 2535 +f 2537 2539 2535 +f 1222 1224 2553 +f 2552 1224 2554 +f 1226 1228 2554 +f 1228 1230 2555 +f 1230 1232 2556 +f 1232 1234 2557 +f 2558 1234 2559 +f 1236 1238 2559 +f 1238 1240 2551 +f 1240 1242 2550 +f 2549 1242 2548 +f 1246 2547 1244 +f 1246 1248 2547 +f 2546 1248 2545 +f 2361 2544 1250 +f 2019 1829 2562 +f 1831 2561 1823 +f 1222 2553 1819 +f 2492 2562 1830 +f 2566 2565 2570 +f 2565 2563 2569 +f 2564 2566 2568 +f 2577 2578 2573 +f 2575 2571 2578 +f 2576 2577 2572 +f 2574 2570 2573 +f 2572 2573 2567 +f 2570 2574 2568 +f 2033 2565 1956 +f 2563 1957 737 +f 1220 2575 1219 +f 1219 2578 2576 +f 348 844 932 +f 2579 1529 2585 +f 2585 1596 2582 +f 2064 2584 1544 +f 2584 2581 2144 +f 2580 2582 1572 +f 2586 2583 2172 +f 2581 2586 1885 +f 2583 2580 1501 +f 2594 2600 2329 +f 2597 1517 2073 +f 2602 2149 2588 +f 2591 2589 1937 +f 2603 1575 2592 +f 2589 2598 1590 +f 1735 2587 1550 +f 2598 2596 1579 +f 2601 1890 2602 +f 2596 2600 1526 +f 2599 2177 2601 +f 2593 1875 2597 +f 2587 1735 2590 +f 2592 1490 2599 +f 2595 1554 2593 +f 2591 1937 2603 +f 2590 1631 2595 +f 2604 1540 2579 +f 2355 2605 2336 +f 1540 2604 2355 +f 2617 2612 1712 +f 2611 1647 2607 +f 2612 2614 1724 +f 2608 1500 2611 +f 2613 2192 2618 +f 2619 2618 2354 +f 2615 2619 2339 +f 2615 2339 2606 +f 1725 2620 1713 +f 2620 1725 2614 +f 1713 2610 1502 +f 2607 1659 2621 +f 2616 2211 2613 +f 2621 2165 2616 +f 2608 2617 1500 +f 2630 2350 2629 +f 2195 2208 2622 +f 2208 2162 2628 +f 1648 1502 2627 +f 2162 1662 2625 +f 2320 2195 2629 +f 1662 1648 2626 +f 2624 2331 2630 +f 2594 2624 2328 +f 294 742 2634 +f 2642 2640 408 +f 323 512 2641 +f 2638 2643 923 +f 951 664 2637 +f 2634 2632 294 +f 402 349 2639 +f 2641 2638 323 +f 279 951 2636 +f 2635 375 2639 +f 349 279 2633 +f 2623 312 2635 +f 327 650 2631 +f 2631 2642 327 +f 319 2665 1131 +f 2665 319 2623 +f 2655 2652 991 +f 2664 1111 2649 +f 2647 2666 282 +f 2651 2655 945 +f 1130 1111 2660 +f 2646 280 2654 +f 2647 282 2663 +f 2653 988 2661 +f 2650 2648 505 +f 2654 492 2662 +f 2659 2657 427 +f 2657 2651 439 +f 2646 2659 280 +f 2663 428 2656 +f 2656 442 2645 +f 1131 2658 1109 +f 2661 975 2644 +f 753 2648 504 +f 2666 2650 493 +f 1100 1130 2644 +f 2645 942 2653 +f 2674 2676 376 +f 665 2668 924 +f 2672 2675 1116 +f 2675 2669 1135 +f 952 2677 665 +f 2652 2670 972 +f 2671 1134 2670 +f 281 2667 952 +f 2679 1119 2671 +f 2680 2674 309 +f 844 324 2678 +f 2679 2672 1119 +f 2669 2680 320 +f 393 2676 352 +f 2673 338 2667 diff --git a/scenes/blockCar.txt b/scenes/blockCar.txt new file mode 100644 index 0000000..6f1ad54 --- /dev/null +++ b/scenes/blockCar.txt @@ -0,0 +1,109 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 1 + +// Diffuse light grey +MATERIAL 1 +RGB .78 .78 .78 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse dark grey +MATERIAL 2 +RGB .35 .35 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse blue +MATERIAL 3 +RGB .35 .35 .85 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE car +EYE 5.0 5 10.5 +VIEW -1 -0.5 -1 +UP 0 1 0 +CAMERATIME 0 +SHUTTERDURATION 70 + +// road +OBJECT 0 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 1000 .01 1000 + +// Ceiling +OBJECT 1 +cube +material 0 +TRANS 0 100 0 +ROTAT 0 0 90 +SCALE .01 1000 1000 + +// Front wall +OBJECT 2 +cube +material 0 +TRANS 0 500 500 +ROTAT 0 90 0 +SCALE .01 1000 1000 + +// Back wall +OBJECT 3 +cube +material 0 +TRANS 0 500 -500 +ROTAT 0 90 0 +SCALE .01 1000 1000 + +// Left wall +OBJECT 4 +cube +material 0 +TRANS -500 500 0 +ROTAT 0 0 0 +SCALE .01 1000 1000 + +// Right wall +OBJECT 5 +cube +material 0 +TRANS 500 500 0 +ROTAT 0 0 0 +SCALE .01 1000 1000 + +// car body +OBJECT 6 +cube +material 3 +SPEED 0 0 -0.5 +TRANS -5 1.5 10 +ROTAT 0 0 0 +SCALE 4 2 10 \ No newline at end of file diff --git a/scenes/cornell_cmyk.txt b/scenes/cornell_cmyk.txt new file mode 100644 index 0000000..6f645ed --- /dev/null +++ b/scenes/cornell_cmyk.txt @@ -0,0 +1,161 @@ +// lens material +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 1 +REFRIOR 1.5 +EMITTANCE 0 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Emissive material (light) +MATERIAL 4 +RGB 1 0.3 0.3 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 15 + +// Emissive material (light) +MATERIAL 5 +RGB 0.3 1 0.3 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 15 + +// Emissive material (light) +MATERIAL 6 +RGB 0.3 0.3 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 15 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE cornell +EYE 0.0 5 10.5 +VIEW 0 0 -1 +UP 0 1 0 + + +// lens +OBJECT 0 +sphere +material 1 +TRANS 0 4 0 +ROTAT 0 0 0 +SCALE 2 2 2 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 1 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// red light +OBJECT 6 +sphere +material 4 +TRANS -3 10 0 +ROTAT 0 0 0 +SCALE 2 0.5 2 + +// green light +OBJECT 7 +sphere +material 5 +TRANS 0 10 0 +ROTAT 0 0 0 +SCALE 2 0.5 2 + +// blue light +OBJECT 8 +sphere +material 6 +TRANS 3 10 0 +ROTAT 0 0 0 +SCALE 2 0.5 2 + +// front wall +OBJECT 9 +cube +material 1 +TRANS 0 5 11 +ROTAT 0 90 0 +SCALE .01 10 10 \ No newline at end of file diff --git a/scenes/cornell_cmyk_lens.txt b/scenes/cornell_cmyk_lens.txt new file mode 100644 index 0000000..899b10e --- /dev/null +++ b/scenes/cornell_cmyk_lens.txt @@ -0,0 +1,161 @@ +// lens material +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 1 +REFRIOR 1.5 +EMITTANCE 0 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Emissive material (light) +MATERIAL 4 +RGB 1 0.2 0.2 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 8 + +// Emissive material (light) +MATERIAL 5 +RGB 0.2 1 0.2 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 8 + +// Emissive material (light) +MATERIAL 6 +RGB 0.2 0.2 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 8 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE cornell +EYE 0.0 5 10.5 +VIEW 0 0 -1 +UP 0 1 0 + + +// lens +OBJECT 0 +sphere +material 0 +TRANS 0 3 0 +ROTAT 0 0 0 +SCALE 5 1 5 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 1 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// red light +OBJECT 6 +sphere +material 4 +TRANS -3 10 0 +ROTAT 0 0 0 +SCALE 2 0.5 2 + +// green light +OBJECT 7 +sphere +material 5 +TRANS 0 10 0 +ROTAT 0 0 0 +SCALE 2 0.5 2 + +// blue light +OBJECT 8 +sphere +material 6 +TRANS 3 10 0 +ROTAT 0 0 0 +SCALE 2 0.5 2 + +// front wall +OBJECT 9 +cube +material 1 +TRANS 0 5 11 +ROTAT 0 90 0 +SCALE .01 10 10 \ No newline at end of file diff --git a/scenes/cornell_reflect.txt b/scenes/cornell_reflect.txt new file mode 100644 index 0000000..ac725c5 --- /dev/null +++ b/scenes/cornell_reflect.txt @@ -0,0 +1,143 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 5 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Reflective white +MATERIAL 4 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Reflective blue +MATERIAL 5 +RGB .1 .1 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE cornell +EYE 0.0 5 10.5 +VIEW 0 0 -1 +UP 0 1 0 + + +// Ceiling light +OBJECT 0 +cube +material 0 +TRANS 0 10 0 +ROTAT 0 0 0 +SCALE 3 .3 3 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 1 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Sphere +OBJECT 6 +sphere +material 1 +TRANS -1 4 -1 +ROTAT 0 0 0 +SCALE 3 3 3 + +// Sphere +OBJECT 7 +sphere +material 4 +TRANS 2 2 2 +ROTAT 0 0 0 +SCALE 3 3 3 + +// Sphere +OBJECT 8 +sphere +material 5 +TRANS -2 6 -2 +ROTAT 0 0 0 +SCALE 3 3 3 diff --git a/scenes/cornell_refract.txt b/scenes/cornell_refract.txt new file mode 100644 index 0000000..ee289e1 --- /dev/null +++ b/scenes/cornell_refract.txt @@ -0,0 +1,161 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 5 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Reflective white +MATERIAL 4 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Reflective blue +MATERIAL 5 +RGB .1 .1 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Refractive white +MATERIAL 6 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 1 +REFRIOR 1.5 +EMITTANCE 0 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE cornell +EYE 0.0 5 10.5 +VIEW 0 0 -1 +UP 0 1 0 + + +// Ceiling light +OBJECT 0 +cube +material 0 +TRANS 0 10 0 +ROTAT 0 0 0 +SCALE 3 .3 3 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 1 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Sphere +OBJECT 6 +sphere +material 1 +TRANS -1 4 -1 +ROTAT 0 0 0 +SCALE 3 3 3 + +// Sphere +OBJECT 7 +sphere +material 4 +TRANS 1 0.5 1 +ROTAT 0 0 0 +SCALE 2.5 2.5 2.5 + +// Sphere +OBJECT 8 +sphere +material 5 +TRANS -2 6 -2 +ROTAT 0 0 0 +SCALE 2.5 2.5 2.5 + +// Sphere +OBJECT 9 +sphere +material 6 +TRANS 0 5 5 +ROTAT 0 0 0 +SCALE 3 3 3 \ No newline at end of file diff --git a/scenes/cornell_teapot.txt b/scenes/cornell_teapot.txt new file mode 100644 index 0000000..6622925 --- /dev/null +++ b/scenes/cornell_teapot.txt @@ -0,0 +1,128 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 5 + +// Diffuse white +MATERIAL 1 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse red +MATERIAL 2 +RGB .85 .35 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse green +MATERIAL 3 +RGB .35 .85 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Reflective white +MATERIAL 4 +RGB .98 .98 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 1 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// nice blue +MATERIAL 5 +RGB .5 .5 .98 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE cornell +EYE 0.0 5 10.5 +VIEW 0 0 -1 +UP 0 1 0 + + +// Ceiling light +OBJECT 0 +cube +material 0 +TRANS 0 10 0 +ROTAT 0 0 0 +SCALE 3 .3 3 + +// Floor +OBJECT 1 +cube +material 1 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 10 .01 10 + +// Ceiling +OBJECT 2 +cube +material 1 +TRANS 0 10 0 +ROTAT 0 0 90 +SCALE .01 10 10 + +// Back wall +OBJECT 3 +cube +material 1 +TRANS 0 5 -5 +ROTAT 0 90 0 +SCALE .01 10 10 + +// Left wall +OBJECT 4 +cube +material 2 +TRANS -5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// Right wall +OBJECT 5 +cube +material 3 +TRANS 5 5 0 +ROTAT 0 0 0 +SCALE .01 10 10 + +// teapot +OBJECT 6 +mesh +material 5 +TRANS 0 3 0 +ROTAT 20 20 20 +SCALE 2.5 2.5 2.5 +FILE ../scenes/teapot.obj diff --git a/scenes/cube.obj b/scenes/cube.obj new file mode 100644 index 0000000..c3cf93e --- /dev/null +++ b/scenes/cube.obj @@ -0,0 +1,36 @@ +# This file uses centimeters as units for non-parametric coordinates. + +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.875000 0.000000 +vt 0.875000 0.250000 +vt 0.125000 0.000000 +vt 0.125000 0.250000 +f 1/1 2/2 3/3 +f 3/3 2/2 4/4 +f 3/3 4/4 5/5 +f 5/5 4/4 6/6 +f 5/5 6/6 7/7 +f 7/7 6/6 8/8 +f 7/7 8/8 1/9 +f 1/9 8/8 2/10 +f 2/2 8/11 4/4 +f 4/4 8/11 6/12 +f 7/13 1/1 5/14 +f 5/14 1/1 3/3 diff --git a/scenes/teapot.obj b/scenes/teapot.obj new file mode 100644 index 0000000..7a0360b --- /dev/null +++ b/scenes/teapot.obj @@ -0,0 +1,2086 @@ +# This file uses centimeters as units for non-parametric coordinates. + +v 0.734292 0.512325 -0.020027 +v 0.724257 0.550256 -0.020027 +v 0.735899 0.562898 -0.020027 +v 0.759580 0.550256 -0.020027 +v 0.785670 0.512325 -0.020027 +v 0.678550 0.512325 0.262287 +v 0.669292 0.550256 0.258349 +v 0.680030 0.562898 0.262918 +v 0.701876 0.550256 0.272213 +v 0.725944 0.512325 0.282452 +v 0.525704 0.512325 0.490656 +v 0.518579 0.550256 0.483533 +v 0.526844 0.562898 0.491796 +v 0.543657 0.550256 0.508611 +v 0.562181 0.512325 0.527133 +v 0.297335 0.512325 0.643502 +v 0.293396 0.550256 0.634244 +v 0.297965 0.562898 0.644982 +v 0.307259 0.550256 0.666829 +v 0.317500 0.512325 0.690896 +v 0.015020 0.512325 0.699246 +v 0.015020 0.550256 0.689212 +v 0.015020 0.562898 0.700851 +v 0.015020 0.550256 0.724532 +v 0.015020 0.512325 0.750622 +v -0.286801 0.512325 0.643502 +v -0.271586 0.550256 0.634244 +v -0.270363 0.562898 0.644982 +v -0.277523 0.550256 0.666829 +v -0.287459 0.512325 0.690896 +v -0.513003 0.512325 0.490656 +v -0.495854 0.550256 0.483533 +v -0.498970 0.562898 0.491796 +v -0.513888 0.550256 0.508611 +v -0.532142 0.512325 0.527133 +v -0.655012 0.512325 0.262287 +v -0.641995 0.550256 0.258349 +v -0.650802 0.562898 0.262918 +v -0.671938 0.550256 0.272213 +v -0.695904 0.512325 0.282452 +v -0.704253 0.512325 -0.020027 +v -0.694218 0.550256 -0.020027 +v -0.705858 0.562898 -0.020027 +v -0.729539 0.550256 -0.020027 +v -0.755629 0.512325 -0.020027 +v -0.648509 0.512325 -0.302341 +v -0.639253 0.550256 -0.298403 +v -0.649991 0.562898 -0.302972 +v -0.671837 0.550256 -0.312266 +v -0.695904 0.512325 -0.322506 +v -0.495662 0.512325 -0.530710 +v -0.488539 0.550256 -0.523585 +v -0.496803 0.562898 -0.531851 +v -0.513617 0.550256 -0.548663 +v -0.532142 0.512325 -0.567187 +v -0.267294 0.512325 -0.683556 +v -0.263355 0.550256 -0.674299 +v -0.267924 0.562898 -0.685036 +v -0.277220 0.550256 -0.706883 +v -0.287459 0.512325 -0.730950 +v 0.015020 0.512325 -0.739299 +v 0.015020 0.550256 -0.729264 +v 0.015020 0.562898 -0.740906 +v 0.015020 0.550256 -0.764586 +v 0.015020 0.512325 -0.790676 +v 0.297335 0.512325 -0.683556 +v 0.293396 0.550256 -0.674299 +v 0.297965 0.562898 -0.685036 +v 0.307259 0.550256 -0.706883 +v 0.317500 0.512325 -0.730950 +v 0.525704 0.512325 -0.530710 +v 0.518579 0.550256 -0.523585 +v 0.526844 0.562898 -0.531851 +v 0.543657 0.550256 -0.548663 +v 0.562181 0.512325 -0.567187 +v 0.678550 0.512325 -0.302341 +v 0.669292 0.550256 -0.298403 +v 0.680030 0.562898 -0.302972 +v 0.701876 0.550256 -0.312266 +v 0.725944 0.512325 -0.322506 +v 0.879994 0.310632 -0.020027 +v 0.962276 0.112550 -0.020027 +v 1.020477 -0.078306 -0.020027 +v 1.042553 -0.258325 -0.020027 +v 0.812958 0.310632 0.319475 +v 0.888864 0.112550 0.351770 +v 0.942554 -0.078306 0.374614 +v 0.962918 -0.258325 0.383279 +v 0.629151 0.310632 0.594103 +v 0.687572 0.112550 0.652525 +v 0.728893 -0.078306 0.693848 +v 0.744567 -0.258325 0.709522 +v 0.354521 0.310632 0.777911 +v 0.386818 0.112550 0.853817 +v 0.409662 -0.078306 0.907506 +v 0.418327 -0.258325 0.927872 +v 0.015020 0.310632 0.844946 +v 0.015020 0.112550 0.927229 +v 0.015020 -0.078306 0.985429 +v 0.015020 -0.258325 1.007505 +v -0.324482 0.310632 0.777911 +v -0.356779 0.112550 0.853817 +v -0.379621 -0.078306 0.907506 +v -0.388286 -0.258325 0.927872 +v -0.599112 0.310632 0.594103 +v -0.657531 0.112550 0.652525 +v -0.698854 -0.078306 0.693848 +v -0.714528 -0.258325 0.709522 +v -0.782917 0.310632 0.319475 +v -0.858823 0.112550 0.351770 +v -0.912513 -0.078306 0.374614 +v -0.932879 -0.258325 0.383279 +v -0.849952 0.310632 -0.020027 +v -0.932237 0.112550 -0.020027 +v -0.990436 -0.078306 -0.020027 +v -1.012511 -0.258325 -0.020027 +v -0.782917 0.310632 -0.359530 +v -0.858823 0.112550 -0.391825 +v -0.912513 -0.078306 -0.414669 +v -0.932879 -0.258325 -0.423333 +v -0.599112 0.310632 -0.634158 +v -0.657531 0.112550 -0.692579 +v -0.698854 -0.078306 -0.733900 +v -0.714528 -0.258325 -0.749574 +v -0.324482 0.310632 -0.817965 +v -0.356779 0.112550 -0.893871 +v -0.379621 -0.078306 -0.947560 +v -0.388286 -0.258325 -0.967924 +v 0.015020 0.310632 -0.885000 +v 0.015020 0.112550 -0.967283 +v 0.015020 -0.078306 -1.025483 +v 0.015020 -0.258325 -1.047559 +v 0.354521 0.310632 -0.817965 +v 0.386818 0.112550 -0.893871 +v 0.409662 -0.078306 -0.947560 +v 0.418327 -0.258325 -0.967924 +v 0.629151 0.310632 -0.634158 +v 0.687572 0.112550 -0.692579 +v 0.728893 -0.078306 -0.733900 +v 0.744567 -0.258325 -0.749574 +v 0.812958 0.310632 -0.359530 +v 0.888864 0.112550 -0.391825 +v 0.942554 -0.078306 -0.414669 +v 0.962918 -0.258325 -0.423333 +v 1.002414 -0.410649 -0.020027 +v 0.914110 -0.523235 -0.020027 +v 0.825807 -0.599697 -0.020027 +v 0.785670 -0.643648 -0.020027 +v 0.925891 -0.410649 0.367526 +v 0.844431 -0.523235 0.332867 +v 0.762970 -0.599697 0.298208 +v 0.725944 -0.643648 0.282452 +v 0.716070 -0.410649 0.681022 +v 0.653374 -0.523235 0.618328 +v 0.590678 -0.599697 0.555633 +v 0.562181 -0.643648 0.527133 +v 0.402571 -0.410649 0.890843 +v 0.367912 -0.523235 0.809385 +v 0.333253 -0.599697 0.727925 +v 0.317500 -0.643648 0.690896 +v 0.015020 -0.410649 0.967368 +v 0.015020 -0.523235 0.879065 +v 0.015020 -0.599697 0.790760 +v 0.015020 -0.643648 0.750622 +v -0.372532 -0.410649 0.890843 +v -0.337873 -0.523235 0.809385 +v -0.303214 -0.599697 0.727925 +v -0.287459 -0.643648 0.690896 +v -0.686031 -0.410649 0.681022 +v -0.623335 -0.523235 0.618328 +v -0.560639 -0.599697 0.555633 +v -0.532142 -0.643648 0.527133 +v -0.895852 -0.410649 0.367526 +v -0.814391 -0.523235 0.332867 +v -0.732931 -0.599697 0.298208 +v -0.695904 -0.643648 0.282452 +v -0.972374 -0.410649 -0.020027 +v -0.884071 -0.523235 -0.020027 +v -0.795768 -0.599697 -0.020027 +v -0.755629 -0.643648 -0.020027 +v -0.895852 -0.410649 -0.407580 +v -0.814391 -0.523235 -0.372919 +v -0.732931 -0.599697 -0.338260 +v -0.695904 -0.643648 -0.322506 +v -0.686031 -0.410649 -0.721076 +v -0.623335 -0.523235 -0.658381 +v -0.560639 -0.599697 -0.595685 +v -0.532142 -0.643648 -0.567187 +v -0.372532 -0.410649 -0.930898 +v -0.337873 -0.523235 -0.849437 +v -0.303214 -0.599697 -0.767977 +v -0.287459 -0.643648 -0.730950 +v 0.015020 -0.410649 -1.007422 +v 0.015020 -0.523235 -0.919117 +v 0.015020 -0.599697 -0.830814 +v 0.015020 -0.643648 -0.790676 +v 0.402571 -0.410649 -0.930898 +v 0.367912 -0.523235 -0.849437 +v 0.333253 -0.599697 -0.767977 +v 0.317500 -0.643648 -0.730950 +v 0.716070 -0.410649 -0.721076 +v 0.653374 -0.523235 -0.658381 +v 0.590678 -0.599697 -0.595685 +v 0.562181 -0.643648 -0.567187 +v 0.925891 -0.410649 -0.407580 +v 0.844431 -0.523235 -0.372919 +v 0.762970 -0.599697 -0.338260 +v 0.725944 -0.643648 -0.322506 +v 0.768208 -0.671947 -0.020027 +v 0.674888 -0.696631 -0.020027 +v 0.444296 -0.714091 -0.020027 +v 0.015020 -0.720715 -0.020027 +v 0.709838 -0.671947 0.275600 +v 0.623749 -0.696631 0.238971 +v 0.411027 -0.714091 0.148464 +v 0.549784 -0.671947 0.514738 +v 0.483526 -0.696631 0.448480 +v 0.319806 -0.714091 0.284759 +v 0.310646 -0.671947 0.674790 +v 0.274019 -0.696631 0.588701 +v 0.183511 -0.714091 0.375981 +v 0.015020 -0.671947 0.733163 +v 0.015020 -0.696631 0.639842 +v 0.015020 -0.714091 0.409248 +v -0.280607 -0.671947 0.674790 +v -0.243978 -0.696631 0.588701 +v -0.153471 -0.714091 0.375981 +v -0.519745 -0.671947 0.514738 +v -0.453486 -0.696631 0.448480 +v -0.289765 -0.714091 0.284759 +v -0.679797 -0.671947 0.275600 +v -0.593708 -0.696631 0.238971 +v -0.380987 -0.714091 0.148464 +v -0.738169 -0.671947 -0.020027 +v -0.644848 -0.696631 -0.020027 +v -0.414256 -0.714091 -0.020027 +v -0.679797 -0.671947 -0.315653 +v -0.593708 -0.696631 -0.279025 +v -0.380987 -0.714091 -0.188517 +v -0.519745 -0.671947 -0.554790 +v -0.453486 -0.696631 -0.488534 +v -0.289765 -0.714091 -0.324813 +v -0.280607 -0.671947 -0.714844 +v -0.243978 -0.696631 -0.628755 +v -0.153471 -0.714091 -0.416033 +v 0.015020 -0.671947 -0.773217 +v 0.015020 -0.696631 -0.679894 +v 0.015020 -0.714091 -0.449302 +v 0.310646 -0.671947 -0.714844 +v 0.274019 -0.696631 -0.628755 +v 0.183511 -0.714091 -0.416033 +v 0.549784 -0.671947 -0.554790 +v 0.483526 -0.696631 -0.488534 +v 0.319806 -0.714091 -0.324813 +v 0.709838 -0.671947 -0.315653 +v 0.623749 -0.696631 -0.279025 +v 0.411027 -0.714091 -0.188517 +v -0.807006 0.319662 -0.020027 +v -1.047031 0.317856 -0.020027 +v -1.224440 0.305213 -0.020027 +v -1.334418 0.270894 -0.020027 +v -1.372148 0.204065 -0.020027 +v -0.798978 0.337725 0.066671 +v -1.054180 0.335636 0.066671 +v -1.241499 0.321017 0.066671 +v -1.356872 0.281337 0.066671 +v -1.396232 0.204065 0.066671 +v -0.781318 0.377461 0.095571 +v -1.069910 0.374752 0.095571 +v -1.279028 0.355786 0.095571 +v -1.406266 0.304309 0.095571 +v -1.449212 0.204065 0.095571 +v -0.763657 0.417197 0.066671 +v -1.085638 0.413868 0.066671 +v -1.316557 0.390556 0.066671 +v -1.455660 0.327282 0.066671 +v -1.502195 0.204065 0.066671 +v -0.755629 0.435260 -0.020027 +v -1.092788 0.431647 -0.020027 +v -1.333615 0.406360 -0.020027 +v -1.478113 0.337725 -0.020027 +v -1.526279 0.204065 -0.020027 +v -0.763657 0.417197 -0.106725 +v -1.085638 0.413868 -0.106725 +v -1.316557 0.390556 -0.106725 +v -1.455660 0.327282 -0.106725 +v -1.502195 0.204065 -0.106725 +v -0.781318 0.377461 -0.135624 +v -1.069910 0.374752 -0.135624 +v -1.279028 0.355786 -0.135624 +v -1.406266 0.304309 -0.135624 +v -1.449212 0.204065 -0.135624 +v -0.798978 0.337725 -0.106725 +v -1.054180 0.335636 -0.106725 +v -1.241499 0.321017 -0.106725 +v -1.356872 0.281337 -0.106725 +v -1.396232 0.204065 -0.106725 +v -1.352080 0.099305 -0.020027 +v -1.288661 -0.027130 -0.020027 +v -1.177077 -0.153564 -0.020027 +v -1.012511 -0.258325 -0.020027 +v -1.373968 0.089192 0.066671 +v -1.304214 -0.042558 0.066671 +v -1.182533 -0.172614 0.066671 +v -1.004485 -0.282407 0.066671 +v -1.422119 0.066944 0.095571 +v -1.338432 -0.076499 0.095571 +v -1.194538 -0.214524 0.095571 +v -0.986824 -0.335390 0.095571 +v -1.470273 0.044695 0.066671 +v -1.372650 -0.110441 0.066671 +v -1.206541 -0.256433 0.066671 +v -0.969162 -0.388372 0.066671 +v -1.492160 0.034582 -0.020027 +v -1.388203 -0.125869 -0.020027 +v -1.211998 -0.275483 -0.020027 +v -0.961136 -0.412454 -0.020027 +v -1.470273 0.044695 -0.106725 +v -1.372650 -0.110441 -0.106725 +v -1.206541 -0.256433 -0.106725 +v -0.969162 -0.388372 -0.106725 +v -1.422119 0.066944 -0.135624 +v -1.338432 -0.076499 -0.135624 +v -1.194538 -0.214524 -0.135624 +v -0.986824 -0.335390 -0.135624 +v -1.373968 0.089192 -0.106725 +v -1.304214 -0.042558 -0.106725 +v -1.182533 -0.172614 -0.106725 +v -1.004485 -0.282407 -0.106725 +v 0.888423 0.011403 -0.020027 +v 1.134870 0.067997 -0.020027 +v 1.241636 0.204065 -0.020027 +v 1.300238 0.369031 -0.020027 +v 1.402189 0.512325 -0.020027 +v 0.888423 -0.054825 0.170709 +v 1.153683 0.018891 0.152195 +v 1.265720 0.175467 0.111465 +v 1.329588 0.358684 0.070735 +v 1.450355 0.512325 0.052222 +v 0.888423 -0.200526 0.234288 +v 1.195077 -0.089143 0.209603 +v 1.318701 0.112550 0.155296 +v 1.394160 0.335918 0.100989 +v 1.556318 0.512325 0.076304 +v 0.888423 -0.346227 0.170709 +v 1.236469 -0.197177 0.152195 +v 1.371683 0.049634 0.111465 +v 1.458732 0.313153 0.070735 +v 1.662282 0.512325 0.052222 +v 0.888423 -0.412454 -0.020027 +v 1.255284 -0.246282 -0.020027 +v 1.395767 0.021036 -0.020027 +v 1.488085 0.302804 -0.020027 +v 1.710448 0.512325 -0.020027 +v 0.888423 -0.346227 -0.210763 +v 1.236469 -0.197177 -0.192250 +v 1.371683 0.049634 -0.151519 +v 1.458732 0.313153 -0.110789 +v 1.662282 0.512325 -0.092275 +v 0.888423 -0.200526 -0.274341 +v 1.195077 -0.089143 -0.249657 +v 1.318701 0.112550 -0.195349 +v 1.394160 0.335918 -0.141043 +v 1.556318 0.512325 -0.116358 +v 0.888423 -0.054825 -0.210763 +v 1.153683 0.018891 -0.192250 +v 1.265720 0.175467 -0.151519 +v 1.329588 0.358684 -0.110789 +v 1.450355 0.512325 -0.092275 +v 1.439114 0.534000 -0.020027 +v 1.466410 0.541224 -0.020027 +v 1.474437 0.534000 -0.020027 +v 1.453565 0.512325 -0.020027 +v 1.490698 0.535057 0.047706 +v 1.514825 0.542917 0.037772 +v 1.515546 0.535480 0.027838 +v 1.485675 0.512325 0.023322 +v 1.604182 0.537385 0.070284 +v 1.621342 0.546642 0.057038 +v 1.605990 0.538740 0.043793 +v 1.556318 0.512325 0.037772 +v 1.717666 0.539715 0.047706 +v 1.727858 0.550368 0.037772 +v 1.696431 0.541999 0.027838 +v 1.626961 0.512325 0.023322 +v 1.769250 0.540772 -0.020027 +v 1.776274 0.552061 -0.020027 +v 1.737541 0.543481 -0.020027 +v 1.659072 0.512325 -0.020027 +v 1.717666 0.539715 -0.087760 +v 1.727858 0.550368 -0.077826 +v 1.696431 0.541999 -0.067891 +v 1.626961 0.512325 -0.063376 +v 1.604182 0.537385 -0.110337 +v 1.621342 0.546642 -0.097092 +v 1.605990 0.538740 -0.083846 +v 1.556318 0.512325 -0.077826 +v 1.490698 0.535057 -0.087760 +v 1.514825 0.542917 -0.077826 +v 1.515546 0.535480 -0.067891 +v 1.485675 0.512325 -0.063376 +v 0.015020 0.897648 -0.020027 +v 0.190021 0.872363 -0.020027 +v 0.181994 0.810952 -0.020027 +v 0.116168 0.735091 -0.020027 +v 0.117773 0.666454 -0.020027 +v 0.176520 0.872363 0.048844 +v 0.169108 0.810952 0.045673 +v 0.108349 0.735091 0.019735 +v 0.109810 0.666454 0.020304 +v 0.139434 0.872363 0.104387 +v 0.133716 0.810952 0.098669 +v 0.086889 0.735091 0.051842 +v 0.087975 0.666454 0.052928 +v 0.083891 0.872363 0.141473 +v 0.080720 0.810952 0.134061 +v 0.054782 0.735091 0.073302 +v 0.055351 0.666454 0.074763 +v 0.015020 0.872363 0.154975 +v 0.015020 0.810952 0.146947 +v 0.015020 0.735091 0.081121 +v 0.015020 0.666454 0.082726 +v -0.053851 0.872363 0.141473 +v -0.050680 0.810952 0.134061 +v -0.024741 0.735091 0.073302 +v -0.025311 0.666454 0.074763 +v -0.109394 0.872363 0.104387 +v -0.103676 0.810952 0.098669 +v -0.056849 0.735091 0.051842 +v -0.057935 0.666454 0.052928 +v -0.146480 0.872363 0.048844 +v -0.139068 0.810952 0.045673 +v -0.078309 0.735091 0.019735 +v -0.079770 0.666454 0.020304 +v -0.159982 0.872363 -0.020027 +v -0.151954 0.810952 -0.020027 +v -0.086128 0.735091 -0.020027 +v -0.087733 0.666454 -0.020027 +v -0.146480 0.872363 -0.088898 +v -0.139068 0.810952 -0.085727 +v -0.078309 0.735091 -0.059788 +v -0.079770 0.666454 -0.060357 +v -0.109394 0.872363 -0.144440 +v -0.103676 0.810952 -0.138723 +v -0.056849 0.735091 -0.091896 +v -0.057935 0.666454 -0.092982 +v -0.053851 0.872363 -0.181526 +v -0.050680 0.810952 -0.174114 +v -0.024741 0.735091 -0.113356 +v -0.025311 0.666454 -0.114817 +v 0.015020 0.872363 -0.195028 +v 0.015020 0.810952 -0.187001 +v 0.015020 0.735091 -0.121174 +v 0.015020 0.666454 -0.122780 +v 0.083891 0.872363 -0.181526 +v 0.080720 0.810952 -0.174114 +v 0.054782 0.735091 -0.113356 +v 0.055351 0.666454 -0.114817 +v 0.139434 0.872363 -0.144440 +v 0.133716 0.810952 -0.138723 +v 0.086889 0.735091 -0.091896 +v 0.087975 0.666454 -0.092982 +v 0.176520 0.872363 -0.088898 +v 0.169108 0.810952 -0.085727 +v 0.108349 0.735091 -0.059788 +v 0.109810 0.666454 -0.060357 +v 0.249425 0.620698 -0.020027 +v 0.438877 0.589390 -0.020027 +v 0.609062 0.558082 -0.020027 +v 0.682916 0.512325 -0.020027 +v 0.231259 0.620698 0.071978 +v 0.406029 0.589390 0.146337 +v 0.563023 0.558082 0.213134 +v 0.631154 0.512325 0.242122 +v 0.181448 0.620698 0.146401 +v 0.315958 0.589390 0.280912 +v 0.436789 0.558082 0.401744 +v 0.489226 0.512325 0.454179 +v 0.107024 0.620698 0.196213 +v 0.181383 0.589390 0.370981 +v 0.248182 0.558082 0.527977 +v 0.277169 0.512325 0.596108 +v 0.015020 0.620698 0.214380 +v 0.015020 0.589390 0.403829 +v 0.015020 0.558082 0.574016 +v 0.015020 0.512325 0.647869 +v -0.076984 0.620698 0.196213 +v -0.151344 0.589390 0.370981 +v -0.218141 0.558082 0.527977 +v -0.247128 0.512325 0.596108 +v -0.151408 0.620698 0.146401 +v -0.285919 0.589390 0.280912 +v -0.406750 0.558082 0.401744 +v -0.459185 0.512325 0.454179 +v -0.201220 0.620698 0.071978 +v -0.375988 0.589390 0.146337 +v -0.532984 0.558082 0.213134 +v -0.601114 0.512325 0.242122 +v -0.219386 0.620698 -0.020027 +v -0.408838 0.589390 -0.020027 +v -0.579022 0.558082 -0.020027 +v -0.652875 0.512325 -0.020027 +v -0.201220 0.620698 -0.112031 +v -0.375988 0.589390 -0.186390 +v -0.532984 0.558082 -0.253188 +v -0.601114 0.512325 -0.282176 +v -0.151408 0.620698 -0.186455 +v -0.285919 0.589390 -0.320965 +v -0.406750 0.558082 -0.441796 +v -0.459185 0.512325 -0.494233 +v -0.076984 0.620698 -0.236266 +v -0.151344 0.589390 -0.411036 +v -0.218141 0.558082 -0.568030 +v -0.247128 0.512325 -0.636160 +v 0.015020 0.620698 -0.254432 +v 0.015020 0.589390 -0.443884 +v 0.015020 0.558082 -0.614068 +v 0.015020 0.512325 -0.687923 +v 0.107024 0.620698 -0.236266 +v 0.181383 0.589390 -0.411036 +v 0.248182 0.558082 -0.568030 +v 0.277169 0.512325 -0.636160 +v 0.181448 0.620698 -0.186455 +v 0.315958 0.589390 -0.320965 +v 0.436789 0.558082 -0.441796 +v 0.489226 0.512325 -0.494233 +v 0.231259 0.620698 -0.112031 +v 0.406029 0.589390 -0.186390 +v 0.563023 0.558082 -0.253188 +v 0.631154 0.512325 -0.282176 +vt 0.664810 0.665504 +vt 0.667614 0.653195 +vt 0.684492 0.653195 +vt 0.681453 0.665504 +vt 0.668062 0.669606 +vt 0.684979 0.669606 +vt 0.674677 0.665504 +vt 0.692149 0.665504 +vt 0.681964 0.653195 +vt 0.700049 0.653195 +vt 0.619175 0.665504 +vt 0.621332 0.653195 +vt 0.621678 0.669606 +vt 0.626769 0.665504 +vt 0.632378 0.653195 +vt 0.550990 0.665504 +vt 0.552183 0.653195 +vt 0.552374 0.669606 +vt 0.555188 0.665504 +vt 0.558289 0.653195 +vt 0.466699 0.665504 +vt 0.466699 0.653195 +vt 0.466699 0.669606 +vt 0.466699 0.665504 +vt 0.466699 0.653195 +vt 0.379916 0.665504 +vt 0.375309 0.653195 +vt 0.380287 0.669606 +vt 0.378118 0.665504 +vt 0.375110 0.653195 +vt 0.312009 0.665504 +vt 0.306816 0.653195 +vt 0.311065 0.669606 +vt 0.306548 0.665504 +vt 0.301021 0.653195 +vt 0.267758 0.665504 +vt 0.263816 0.653195 +vt 0.265091 0.669606 +vt 0.258691 0.665504 +vt 0.251434 0.653195 +vt 0.251945 0.665504 +vt 0.248906 0.653195 +vt 0.248420 0.669606 +vt 0.241250 0.665504 +vt 0.233350 0.653195 +vt 0.268588 0.665504 +vt 0.265785 0.653195 +vt 0.265337 0.669606 +vt 0.258722 0.665504 +vt 0.251434 0.653195 +vt 0.314224 0.665504 +vt 0.312067 0.653195 +vt 0.311721 0.669606 +vt 0.306630 0.665504 +vt 0.301021 0.653195 +vt 0.382408 0.665504 +vt 0.381216 0.653195 +vt 0.381025 0.669606 +vt 0.378210 0.665504 +vt 0.375110 0.653195 +vt 0.466699 0.665504 +vt 0.466699 0.653195 +vt 0.466699 0.669606 +vt 0.466699 0.665504 +vt 0.466699 0.653195 +vt 0.550990 0.665504 +vt 0.552183 0.653195 +vt 0.552374 0.669606 +vt 0.555188 0.665504 +vt 0.558289 0.653195 +vt 0.619175 0.665504 +vt 0.621332 0.653195 +vt 0.621678 0.669606 +vt 0.626769 0.665504 +vt 0.632378 0.653195 +vt 0.664810 0.665504 +vt 0.667614 0.653195 +vt 0.668062 0.669606 +vt 0.674677 0.665504 +vt 0.681964 0.653195 +vt 0.708312 0.587746 +vt 0.728610 0.587746 +vt 0.731296 0.523469 +vt 0.753525 0.523469 +vt 0.747553 0.461537 +vt 0.771148 0.461537 +vt 0.753719 0.403122 +vt 0.777832 0.403122 +vt 0.652656 0.587746 +vt 0.670345 0.523469 +vt 0.682857 0.461537 +vt 0.687603 0.403122 +vt 0.569499 0.587746 +vt 0.579278 0.523469 +vt 0.586195 0.461537 +vt 0.588819 0.403122 +vt 0.466699 0.587746 +vt 0.466699 0.523469 +vt 0.466699 0.461537 +vt 0.466699 0.403122 +vt 0.363899 0.587746 +vt 0.354120 0.523469 +vt 0.347204 0.461537 +vt 0.344580 0.403122 +vt 0.280743 0.587746 +vt 0.263054 0.523469 +vt 0.250541 0.461537 +vt 0.245795 0.403122 +vt 0.225087 0.587746 +vt 0.202103 0.523469 +vt 0.185846 0.461537 +vt 0.179679 0.403122 +vt 0.204789 0.587746 +vt 0.179874 0.523469 +vt 0.162251 0.461537 +vt 0.155567 0.403122 +vt 0.225087 0.587746 +vt 0.202103 0.523469 +vt 0.185846 0.461537 +vt 0.179679 0.403122 +vt 0.280743 0.587746 +vt 0.263054 0.523469 +vt 0.250541 0.461537 +vt 0.245795 0.403122 +vt 0.363899 0.587746 +vt 0.354120 0.523469 +vt 0.347204 0.461537 +vt 0.344580 0.403122 +vt 0.466699 0.587746 +vt 0.466699 0.523469 +vt 0.466699 0.461537 +vt 0.466699 0.403122 +vt 0.569499 0.587746 +vt 0.579278 0.523469 +vt 0.586195 0.461537 +vt 0.588819 0.403122 +vt 0.652656 0.587746 +vt 0.670345 0.523469 +vt 0.682857 0.461537 +vt 0.687603 0.403122 +vt 0.708312 0.587746 +vt 0.731296 0.523469 +vt 0.747553 0.461537 +vt 0.753719 0.403122 +vt 0.742507 0.353693 +vt 0.765678 0.353693 +vt 0.717842 0.317159 +vt 0.738940 0.317159 +vt 0.693176 0.292347 +vt 0.712202 0.292347 +vt 0.681964 0.278085 +vt 0.700049 0.278085 +vt 0.678975 0.353693 +vt 0.659990 0.317159 +vt 0.641006 0.292347 +vt 0.632378 0.278085 +vt 0.584048 0.353693 +vt 0.573554 0.317159 +vt 0.563059 0.292347 +vt 0.558289 0.278085 +vt 0.466699 0.353693 +vt 0.466699 0.317159 +vt 0.466699 0.292347 +vt 0.466699 0.278085 +vt 0.349350 0.353693 +vt 0.359845 0.317159 +vt 0.370339 0.292347 +vt 0.375110 0.278085 +vt 0.254424 0.353693 +vt 0.273408 0.317159 +vt 0.292392 0.292347 +vt 0.301021 0.278085 +vt 0.190891 0.353693 +vt 0.215557 0.317159 +vt 0.240223 0.292347 +vt 0.251434 0.278085 +vt 0.167720 0.353693 +vt 0.194458 0.317159 +vt 0.221196 0.292347 +vt 0.233350 0.278085 +vt 0.190891 0.353693 +vt 0.215557 0.317159 +vt 0.240223 0.292347 +vt 0.251434 0.278085 +vt 0.254424 0.353693 +vt 0.273408 0.317159 +vt 0.292392 0.292347 +vt 0.301021 0.278085 +vt 0.349350 0.353693 +vt 0.359845 0.317159 +vt 0.370339 0.292347 +vt 0.375110 0.278085 +vt 0.466699 0.353693 +vt 0.466699 0.317159 +vt 0.466699 0.292347 +vt 0.466699 0.278085 +vt 0.584048 0.353693 +vt 0.573554 0.317159 +vt 0.563059 0.292347 +vt 0.558289 0.278085 +vt 0.678975 0.353693 +vt 0.659990 0.317159 +vt 0.641006 0.292347 +vt 0.632378 0.278085 +vt 0.742507 0.353693 +vt 0.717842 0.317159 +vt 0.693176 0.292347 +vt 0.681964 0.278085 +vt 0.677088 0.268902 +vt 0.694762 0.268902 +vt 0.651020 0.260893 +vt 0.666505 0.260893 +vt 0.586609 0.255227 +vt 0.596682 0.255227 +vt 0.466699 0.253077 +vt 0.628624 0.268902 +vt 0.608561 0.260893 +vt 0.558987 0.255227 +vt 0.556214 0.268902 +vt 0.545123 0.260893 +vt 0.517718 0.255227 +vt 0.466699 0.268902 +vt 0.466699 0.260893 +vt 0.466699 0.255227 +vt 0.377185 0.268902 +vt 0.388276 0.260893 +vt 0.415681 0.255227 +vt 0.304775 0.268902 +vt 0.324838 0.260893 +vt 0.374412 0.255227 +vt 0.256311 0.268902 +vt 0.282379 0.260893 +vt 0.346790 0.255227 +vt 0.238637 0.268902 +vt 0.266894 0.260893 +vt 0.336716 0.255227 +vt 0.256311 0.268902 +vt 0.282379 0.260893 +vt 0.346790 0.255227 +vt 0.304775 0.268902 +vt 0.324838 0.260893 +vt 0.374412 0.255227 +vt 0.377185 0.268902 +vt 0.388276 0.260893 +vt 0.415681 0.255227 +vt 0.466699 0.268902 +vt 0.466699 0.260893 +vt 0.466699 0.255227 +vt 0.556214 0.268902 +vt 0.545123 0.260893 +vt 0.517718 0.255227 +vt 0.628624 0.268902 +vt 0.608561 0.260893 +vt 0.558987 0.255227 +vt 0.677088 0.268902 +vt 0.651020 0.260893 +vt 0.586609 0.255227 +vt 0.142950 0.595860 +vt 0.220224 0.596538 +vt 0.217793 0.590677 +vt 0.145114 0.590091 +vt 0.086230 0.591116 +vt 0.091396 0.585988 +vt 0.051296 0.578240 +vt 0.058095 0.574852 +vt 0.039378 0.553166 +vt 0.046670 0.553166 +vt 0.138187 0.608553 +vt 0.225571 0.609432 +vt 0.074867 0.602399 +vt 0.036340 0.585695 +vt 0.023336 0.553166 +vt 0.133424 0.621246 +vt 0.230919 0.622326 +vt 0.063503 0.613681 +vt 0.021383 0.593149 +vt 0.007293 0.553166 +vt 0.131259 0.627015 +vt 0.233350 0.628188 +vt 0.058338 0.618810 +vt 0.014585 0.596538 +vt 0.000000 0.553166 +vt 0.133424 0.621246 +vt 0.230919 0.622326 +vt 0.063503 0.613681 +vt 0.021383 0.593149 +vt 0.007293 0.553166 +vt 0.138187 0.608553 +vt 0.225571 0.609432 +vt 0.074867 0.602399 +vt 0.036340 0.585695 +vt 0.023336 0.553166 +vt 0.142950 0.595860 +vt 0.220224 0.596538 +vt 0.086230 0.591116 +vt 0.051296 0.578240 +vt 0.039378 0.553166 +vt 0.046119 0.515890 +vt 0.052747 0.519171 +vt 0.067240 0.473137 +vt 0.071950 0.478144 +vt 0.104085 0.430934 +vt 0.105737 0.437116 +vt 0.157997 0.395307 +vt 0.155567 0.403122 +vt 0.031539 0.508670 +vt 0.056879 0.462123 +vt 0.100450 0.417335 +vt 0.163345 0.378114 +vt 0.016958 0.501451 +vt 0.046518 0.451109 +vt 0.096815 0.403735 +vt 0.168693 0.360922 +vt 0.010331 0.498169 +vt 0.041809 0.446103 +vt 0.095163 0.397554 +vt 0.171123 0.353107 +vt 0.016958 0.501451 +vt 0.046518 0.451109 +vt 0.096815 0.403735 +vt 0.168693 0.360922 +vt 0.031539 0.508670 +vt 0.056879 0.462123 +vt 0.100450 0.417335 +vt 0.163345 0.378114 +vt 0.046119 0.515890 +vt 0.067240 0.473137 +vt 0.104085 0.430934 +vt 0.157997 0.395307 +vt 0.811482 0.493077 +vt 0.731162 0.469157 +vt 0.731162 0.490647 +vt 0.805786 0.509012 +vt 0.845406 0.543886 +vt 0.838114 0.553166 +vt 0.864745 0.603339 +vt 0.855858 0.606697 +vt 0.901313 0.653195 +vt 0.886729 0.653195 +vt 0.824016 0.458021 +vt 0.731162 0.421877 +vt 0.861449 0.523469 +vt 0.884297 0.595951 +vt 0.933398 0.653195 +vt 0.836549 0.422964 +vt 0.731162 0.374598 +vt 0.877492 0.503053 +vt 0.903850 0.588564 +vt 0.965484 0.653195 +vt 0.842246 0.407029 +vt 0.731162 0.353107 +vt 0.884784 0.493773 +vt 0.912738 0.585206 +vt 0.980068 0.653195 +vt 0.836549 0.422964 +vt 0.731162 0.374598 +vt 0.877492 0.503053 +vt 0.903850 0.588564 +vt 0.965484 0.653195 +vt 0.824016 0.458021 +vt 0.731162 0.421877 +vt 0.861449 0.523469 +vt 0.884297 0.595951 +vt 0.933398 0.653195 +vt 0.811482 0.493077 +vt 0.731162 0.469157 +vt 0.845406 0.543886 +vt 0.864745 0.603339 +vt 0.901313 0.653195 +vt 0.913529 0.660572 +vt 0.897909 0.660229 +vt 0.920834 0.663122 +vt 0.906175 0.662573 +vt 0.921053 0.660709 +vt 0.908605 0.660229 +vt 0.912008 0.653195 +vt 0.902285 0.653195 +vt 0.947891 0.661327 +vt 0.953087 0.664331 +vt 0.948439 0.661767 +vt 0.933398 0.653195 +vt 0.982254 0.662083 +vt 0.985340 0.665540 +vt 0.975824 0.662824 +vt 0.954789 0.653195 +vt 0.997873 0.662426 +vt 1.000000 0.666089 +vt 0.988272 0.663305 +vt 0.964512 0.653195 +vt 0.982254 0.662083 +vt 0.985340 0.665540 +vt 0.975824 0.662824 +vt 0.954789 0.653195 +vt 0.947891 0.661327 +vt 0.953087 0.664331 +vt 0.948439 0.661767 +vt 0.933398 0.653195 +vt 0.913529 0.660572 +vt 0.920834 0.663122 +vt 0.921053 0.660709 +vt 0.912008 0.653195 +vt 0.515601 0.770026 +vt 0.466699 0.778231 +vt 0.519689 0.770026 +vt 0.513357 0.750099 +vt 0.517258 0.750099 +vt 0.494959 0.725482 +vt 0.497327 0.725482 +vt 0.495401 0.703209 +vt 0.497813 0.703209 +vt 0.504371 0.770026 +vt 0.502640 0.750099 +vt 0.488461 0.725482 +vt 0.488790 0.703209 +vt 0.487553 0.770026 +vt 0.486593 0.750099 +vt 0.478739 0.725482 +vt 0.478911 0.703209 +vt 0.466699 0.770026 +vt 0.466699 0.750099 +vt 0.466699 0.725482 +vt 0.466699 0.703209 +vt 0.445845 0.770026 +vt 0.446806 0.750099 +vt 0.454660 0.725482 +vt 0.454487 0.703209 +vt 0.429027 0.770026 +vt 0.430759 0.750099 +vt 0.444938 0.725482 +vt 0.444609 0.703209 +vt 0.417798 0.770026 +vt 0.420042 0.750099 +vt 0.438440 0.725482 +vt 0.437997 0.703209 +vt 0.413709 0.770026 +vt 0.416140 0.750099 +vt 0.436072 0.725482 +vt 0.435586 0.703209 +vt 0.417798 0.770026 +vt 0.420042 0.750099 +vt 0.438440 0.725482 +vt 0.437997 0.703209 +vt 0.429027 0.770026 +vt 0.430759 0.750099 +vt 0.444938 0.725482 +vt 0.444609 0.703209 +vt 0.445845 0.770026 +vt 0.446806 0.750099 +vt 0.454660 0.725482 +vt 0.454487 0.703209 +vt 0.466699 0.770026 +vt 0.466699 0.750099 +vt 0.466699 0.725482 +vt 0.466699 0.703209 +vt 0.487553 0.770026 +vt 0.486593 0.750099 +vt 0.478739 0.725482 +vt 0.478911 0.703209 +vt 0.504371 0.770026 +vt 0.502640 0.750099 +vt 0.488461 0.725482 +vt 0.488790 0.703209 +vt 0.515601 0.770026 +vt 0.513357 0.750099 +vt 0.494959 0.725482 +vt 0.495401 0.703209 +vt 0.532176 0.688362 +vt 0.537676 0.688362 +vt 0.585095 0.678202 +vt 0.595042 0.678202 +vt 0.632632 0.668043 +vt 0.646573 0.668043 +vt 0.653262 0.653195 +vt 0.668936 0.653195 +vt 0.517093 0.688362 +vt 0.557822 0.678202 +vt 0.594409 0.668043 +vt 0.610287 0.653195 +vt 0.494558 0.688362 +vt 0.517073 0.678202 +vt 0.537300 0.668043 +vt 0.546077 0.653195 +vt 0.466699 0.688362 +vt 0.466699 0.678202 +vt 0.466699 0.668043 +vt 0.466699 0.653195 +vt 0.438841 0.688362 +vt 0.416325 0.678202 +vt 0.396099 0.668043 +vt 0.387322 0.653195 +vt 0.416306 0.688362 +vt 0.375576 0.678202 +vt 0.338989 0.668043 +vt 0.323112 0.653195 +vt 0.401223 0.688362 +vt 0.348304 0.678202 +vt 0.300766 0.668043 +vt 0.280136 0.653195 +vt 0.395722 0.688362 +vt 0.338357 0.678202 +vt 0.286826 0.668043 +vt 0.264463 0.653195 +vt 0.401223 0.688362 +vt 0.348304 0.678202 +vt 0.300766 0.668043 +vt 0.280136 0.653195 +vt 0.416306 0.688362 +vt 0.375576 0.678202 +vt 0.338989 0.668043 +vt 0.323112 0.653195 +vt 0.438841 0.688362 +vt 0.416325 0.678202 +vt 0.396099 0.668043 +vt 0.387322 0.653195 +vt 0.466699 0.688362 +vt 0.466699 0.678202 +vt 0.466699 0.668043 +vt 0.466699 0.653195 +vt 0.494558 0.688362 +vt 0.517073 0.678202 +vt 0.537300 0.668043 +vt 0.546077 0.653195 +vt 0.517093 0.688362 +vt 0.557822 0.678202 +vt 0.594409 0.668043 +vt 0.610287 0.653195 +vt 0.532176 0.688362 +vt 0.585095 0.678202 +vt 0.632632 0.668043 +vt 0.653262 0.653195 +f 7/1 1/3 6/2 +f 1/3 7/1 2/4 +f 8/5 2/4 7/1 +f 2/4 8/5 3/6 +f 9/7 3/6 8/5 +f 3/6 9/7 4/8 +f 10/9 4/8 9/7 +f 4/8 10/9 5/10 +f 12/11 6/2 11/12 +f 6/2 12/11 7/1 +f 13/13 7/1 12/11 +f 7/1 13/13 8/5 +f 14/14 8/5 13/13 +f 8/5 14/14 9/7 +f 15/15 9/7 14/14 +f 9/7 15/15 10/9 +f 17/16 11/12 16/17 +f 11/12 17/16 12/11 +f 18/18 12/11 17/16 +f 12/11 18/18 13/13 +f 19/19 13/13 18/18 +f 13/13 19/19 14/14 +f 20/20 14/14 19/19 +f 14/14 20/20 15/15 +f 22/21 16/17 21/22 +f 16/17 22/21 17/16 +f 23/23 17/16 22/21 +f 17/16 23/23 18/18 +f 24/24 18/18 23/23 +f 18/18 24/24 19/19 +f 25/25 19/19 24/24 +f 19/19 25/25 20/20 +f 27/26 21/22 26/27 +f 21/22 27/26 22/21 +f 28/28 22/21 27/26 +f 22/21 28/28 23/23 +f 29/29 23/23 28/28 +f 23/23 29/29 24/24 +f 30/30 24/24 29/29 +f 24/24 30/30 25/25 +f 32/31 26/27 31/32 +f 26/27 32/31 27/26 +f 33/33 27/26 32/31 +f 27/26 33/33 28/28 +f 34/34 28/28 33/33 +f 28/28 34/34 29/29 +f 35/35 29/29 34/34 +f 29/29 35/35 30/30 +f 37/36 31/32 36/37 +f 31/32 37/36 32/31 +f 38/38 32/31 37/36 +f 32/31 38/38 33/33 +f 39/39 33/33 38/38 +f 33/33 39/39 34/34 +f 40/40 34/34 39/39 +f 34/34 40/40 35/35 +f 42/41 36/37 41/42 +f 36/37 42/41 37/36 +f 43/43 37/36 42/41 +f 37/36 43/43 38/38 +f 44/44 38/38 43/43 +f 38/38 44/44 39/39 +f 45/45 39/39 44/44 +f 39/39 45/45 40/40 +f 47/46 41/42 46/47 +f 41/42 47/46 42/41 +f 48/48 42/41 47/46 +f 42/41 48/48 43/43 +f 49/49 43/43 48/48 +f 43/43 49/49 44/44 +f 50/50 44/44 49/49 +f 44/44 50/50 45/45 +f 52/51 46/47 51/52 +f 46/47 52/51 47/46 +f 53/53 47/46 52/51 +f 47/46 53/53 48/48 +f 54/54 48/48 53/53 +f 48/48 54/54 49/49 +f 55/55 49/49 54/54 +f 49/49 55/55 50/50 +f 57/56 51/52 56/57 +f 51/52 57/56 52/51 +f 58/58 52/51 57/56 +f 52/51 58/58 53/53 +f 59/59 53/53 58/58 +f 53/53 59/59 54/54 +f 60/60 54/54 59/59 +f 54/54 60/60 55/55 +f 62/61 56/57 61/62 +f 56/57 62/61 57/56 +f 63/63 57/56 62/61 +f 57/56 63/63 58/58 +f 64/64 58/58 63/63 +f 58/58 64/64 59/59 +f 65/65 59/59 64/64 +f 59/59 65/65 60/60 +f 67/66 61/62 66/67 +f 61/62 67/66 62/61 +f 68/68 62/61 67/66 +f 62/61 68/68 63/63 +f 69/69 63/63 68/68 +f 63/63 69/69 64/64 +f 70/70 64/64 69/69 +f 64/64 70/70 65/65 +f 72/71 66/67 71/72 +f 66/67 72/71 67/66 +f 73/73 67/66 72/71 +f 67/66 73/73 68/68 +f 74/74 68/68 73/73 +f 68/68 74/74 69/69 +f 75/75 69/69 74/74 +f 69/69 75/75 70/70 +f 77/76 71/72 76/77 +f 71/72 77/76 72/71 +f 78/78 72/71 77/76 +f 72/71 78/78 73/73 +f 79/79 73/73 78/78 +f 73/73 79/79 74/74 +f 80/80 74/74 79/79 +f 74/74 80/80 75/75 +f 2/4 76/77 1/3 +f 76/77 2/4 77/76 +f 3/6 77/76 2/4 +f 77/76 3/6 78/78 +f 4/8 78/78 3/6 +f 78/78 4/8 79/79 +f 5/10 79/79 4/8 +f 79/79 5/10 80/80 +f 85/81 5/10 10/9 +f 5/10 85/81 81/82 +f 86/83 81/82 85/81 +f 81/82 86/83 82/84 +f 87/85 82/84 86/83 +f 82/84 87/85 83/86 +f 88/87 83/86 87/85 +f 83/86 88/87 84/88 +f 89/89 10/9 15/15 +f 10/9 89/89 85/81 +f 90/90 85/81 89/89 +f 85/81 90/90 86/83 +f 91/91 86/83 90/90 +f 86/83 91/91 87/85 +f 92/92 87/85 91/91 +f 87/85 92/92 88/87 +f 93/93 15/15 20/20 +f 15/15 93/93 89/89 +f 94/94 89/89 93/93 +f 89/89 94/94 90/90 +f 95/95 90/90 94/94 +f 90/90 95/95 91/91 +f 96/96 91/91 95/95 +f 91/91 96/96 92/92 +f 97/97 20/20 25/25 +f 20/20 97/97 93/93 +f 98/98 93/93 97/97 +f 93/93 98/98 94/94 +f 99/99 94/94 98/98 +f 94/94 99/99 95/95 +f 100/100 95/95 99/99 +f 95/95 100/100 96/96 +f 101/101 25/25 30/30 +f 25/25 101/101 97/97 +f 102/102 97/97 101/101 +f 97/97 102/102 98/98 +f 103/103 98/98 102/102 +f 98/98 103/103 99/99 +f 104/104 99/99 103/103 +f 99/99 104/104 100/100 +f 105/105 30/30 35/35 +f 30/30 105/105 101/101 +f 106/106 101/101 105/105 +f 101/101 106/106 102/102 +f 107/107 102/102 106/106 +f 102/102 107/107 103/103 +f 108/108 103/103 107/107 +f 103/103 108/108 104/104 +f 109/109 35/35 40/40 +f 35/35 109/109 105/105 +f 110/110 105/105 109/109 +f 105/105 110/110 106/106 +f 111/111 106/106 110/110 +f 106/106 111/111 107/107 +f 112/112 107/107 111/111 +f 107/107 112/112 108/108 +f 113/113 40/40 45/45 +f 40/40 113/113 109/109 +f 114/114 109/109 113/113 +f 109/109 114/114 110/110 +f 115/115 110/110 114/114 +f 110/110 115/115 111/111 +f 116/116 111/111 115/115 +f 111/111 116/116 112/112 +f 117/117 45/45 50/50 +f 45/45 117/117 113/113 +f 118/118 113/113 117/117 +f 113/113 118/118 114/114 +f 119/119 114/114 118/118 +f 114/114 119/119 115/115 +f 120/120 115/115 119/119 +f 115/115 120/120 116/116 +f 121/121 50/50 55/55 +f 50/50 121/121 117/117 +f 122/122 117/117 121/121 +f 117/117 122/122 118/118 +f 123/123 118/118 122/122 +f 118/118 123/123 119/119 +f 124/124 119/119 123/123 +f 119/119 124/124 120/120 +f 125/125 55/55 60/60 +f 55/55 125/125 121/121 +f 126/126 121/121 125/125 +f 121/121 126/126 122/122 +f 127/127 122/122 126/126 +f 122/122 127/127 123/123 +f 128/128 123/123 127/127 +f 123/123 128/128 124/124 +f 129/129 60/60 65/65 +f 60/60 129/129 125/125 +f 130/130 125/125 129/129 +f 125/125 130/130 126/126 +f 131/131 126/126 130/130 +f 126/126 131/131 127/127 +f 132/132 127/127 131/131 +f 127/127 132/132 128/128 +f 133/133 65/65 70/70 +f 65/65 133/133 129/129 +f 134/134 129/129 133/133 +f 129/129 134/134 130/130 +f 135/135 130/130 134/134 +f 130/130 135/135 131/131 +f 136/136 131/131 135/135 +f 131/131 136/136 132/132 +f 137/137 70/70 75/75 +f 70/70 137/137 133/133 +f 138/138 133/133 137/137 +f 133/133 138/138 134/134 +f 139/139 134/134 138/138 +f 134/134 139/139 135/135 +f 140/140 135/135 139/139 +f 135/135 140/140 136/136 +f 141/141 75/75 80/80 +f 75/75 141/141 137/137 +f 142/142 137/137 141/141 +f 137/137 142/142 138/138 +f 143/143 138/138 142/142 +f 138/138 143/143 139/139 +f 144/144 139/139 143/143 +f 139/139 144/144 140/140 +f 81/82 80/80 5/10 +f 80/80 81/82 141/141 +f 82/84 141/141 81/82 +f 141/141 82/84 142/142 +f 83/86 142/142 82/84 +f 142/142 83/86 143/143 +f 84/88 143/143 83/86 +f 143/143 84/88 144/144 +f 149/145 84/88 88/87 +f 84/88 149/145 145/146 +f 150/147 145/146 149/145 +f 145/146 150/147 146/148 +f 151/149 146/148 150/147 +f 146/148 151/149 147/150 +f 152/151 147/150 151/149 +f 147/150 152/151 148/152 +f 153/153 88/87 92/92 +f 88/87 153/153 149/145 +f 154/154 149/145 153/153 +f 149/145 154/154 150/147 +f 155/155 150/147 154/154 +f 150/147 155/155 151/149 +f 156/156 151/149 155/155 +f 151/149 156/156 152/151 +f 157/157 92/92 96/96 +f 92/92 157/157 153/153 +f 158/158 153/153 157/157 +f 153/153 158/158 154/154 +f 159/159 154/154 158/158 +f 154/154 159/159 155/155 +f 160/160 155/155 159/159 +f 155/155 160/160 156/156 +f 161/161 96/96 100/100 +f 96/96 161/161 157/157 +f 162/162 157/157 161/161 +f 157/157 162/162 158/158 +f 163/163 158/158 162/162 +f 158/158 163/163 159/159 +f 164/164 159/159 163/163 +f 159/159 164/164 160/160 +f 165/165 100/100 104/104 +f 100/100 165/165 161/161 +f 166/166 161/161 165/165 +f 161/161 166/166 162/162 +f 167/167 162/162 166/166 +f 162/162 167/167 163/163 +f 168/168 163/163 167/167 +f 163/163 168/168 164/164 +f 169/169 104/104 108/108 +f 104/104 169/169 165/165 +f 170/170 165/165 169/169 +f 165/165 170/170 166/166 +f 171/171 166/166 170/170 +f 166/166 171/171 167/167 +f 172/172 167/167 171/171 +f 167/167 172/172 168/168 +f 173/173 108/108 112/112 +f 108/108 173/173 169/169 +f 174/174 169/169 173/173 +f 169/169 174/174 170/170 +f 175/175 170/170 174/174 +f 170/170 175/175 171/171 +f 176/176 171/171 175/175 +f 171/171 176/176 172/172 +f 177/177 112/112 116/116 +f 112/112 177/177 173/173 +f 178/178 173/173 177/177 +f 173/173 178/178 174/174 +f 179/179 174/174 178/178 +f 174/174 179/179 175/175 +f 180/180 175/175 179/179 +f 175/175 180/180 176/176 +f 181/181 116/116 120/120 +f 116/116 181/181 177/177 +f 182/182 177/177 181/181 +f 177/177 182/182 178/178 +f 183/183 178/178 182/182 +f 178/178 183/183 179/179 +f 184/184 179/179 183/183 +f 179/179 184/184 180/180 +f 185/185 120/120 124/124 +f 120/120 185/185 181/181 +f 186/186 181/181 185/185 +f 181/181 186/186 182/182 +f 187/187 182/182 186/186 +f 182/182 187/187 183/183 +f 188/188 183/183 187/187 +f 183/183 188/188 184/184 +f 189/189 124/124 128/128 +f 124/124 189/189 185/185 +f 190/190 185/185 189/189 +f 185/185 190/190 186/186 +f 191/191 186/186 190/190 +f 186/186 191/191 187/187 +f 192/192 187/187 191/191 +f 187/187 192/192 188/188 +f 193/193 128/128 132/132 +f 128/128 193/193 189/189 +f 194/194 189/189 193/193 +f 189/189 194/194 190/190 +f 195/195 190/190 194/194 +f 190/190 195/195 191/191 +f 196/196 191/191 195/195 +f 191/191 196/196 192/192 +f 197/197 132/132 136/136 +f 132/132 197/197 193/193 +f 198/198 193/193 197/197 +f 193/193 198/198 194/194 +f 199/199 194/194 198/198 +f 194/194 199/199 195/195 +f 200/200 195/195 199/199 +f 195/195 200/200 196/196 +f 201/201 136/136 140/140 +f 136/136 201/201 197/197 +f 202/202 197/197 201/201 +f 197/197 202/202 198/198 +f 203/203 198/198 202/202 +f 198/198 203/203 199/199 +f 204/204 199/199 203/203 +f 199/199 204/204 200/200 +f 205/205 140/140 144/144 +f 140/140 205/205 201/201 +f 206/206 201/201 205/205 +f 201/201 206/206 202/202 +f 207/207 202/202 206/206 +f 202/202 207/207 203/203 +f 208/208 203/203 207/207 +f 203/203 208/208 204/204 +f 145/146 144/144 84/88 +f 144/144 145/146 205/205 +f 146/148 205/205 145/146 +f 205/205 146/148 206/206 +f 147/150 206/206 146/148 +f 206/206 147/150 207/207 +f 148/152 207/207 147/150 +f 207/207 148/152 208/208 +f 213/209 148/152 152/151 +f 148/152 213/209 209/210 +f 214/211 209/210 213/209 +f 209/210 214/211 210/212 +f 215/213 210/212 214/211 +f 210/212 215/213 211/214 +f 212/215 211/214 215/213 +f 211/214 212/215 212/215 +f 216/216 152/151 156/156 +f 152/151 216/216 213/209 +f 217/217 213/209 216/216 +f 213/209 217/217 214/211 +f 218/218 214/211 217/217 +f 214/211 218/218 215/213 +f 212/215 215/213 218/218 +f 215/213 212/215 212/215 +f 219/219 156/156 160/160 +f 156/156 219/219 216/216 +f 220/220 216/216 219/219 +f 216/216 220/220 217/217 +f 221/221 217/217 220/220 +f 217/217 221/221 218/218 +f 212/215 218/218 221/221 +f 218/218 212/215 212/215 +f 222/222 160/160 164/164 +f 160/160 222/222 219/219 +f 223/223 219/219 222/222 +f 219/219 223/223 220/220 +f 224/224 220/220 223/223 +f 220/220 224/224 221/221 +f 212/215 221/221 224/224 +f 221/221 212/215 212/215 +f 225/225 164/164 168/168 +f 164/164 225/225 222/222 +f 226/226 222/222 225/225 +f 222/222 226/226 223/223 +f 227/227 223/223 226/226 +f 223/223 227/227 224/224 +f 212/215 224/224 227/227 +f 224/224 212/215 212/215 +f 228/228 168/168 172/172 +f 168/168 228/228 225/225 +f 229/229 225/225 228/228 +f 225/225 229/229 226/226 +f 230/230 226/226 229/229 +f 226/226 230/230 227/227 +f 212/215 227/227 230/230 +f 227/227 212/215 212/215 +f 231/231 172/172 176/176 +f 172/172 231/231 228/228 +f 232/232 228/228 231/231 +f 228/228 232/232 229/229 +f 233/233 229/229 232/232 +f 229/229 233/233 230/230 +f 212/215 230/230 233/233 +f 230/230 212/215 212/215 +f 234/234 176/176 180/180 +f 176/176 234/234 231/231 +f 235/235 231/231 234/234 +f 231/231 235/235 232/232 +f 236/236 232/232 235/235 +f 232/232 236/236 233/233 +f 212/215 233/233 236/236 +f 233/233 212/215 212/215 +f 237/237 180/180 184/184 +f 180/180 237/237 234/234 +f 238/238 234/234 237/237 +f 234/234 238/238 235/235 +f 239/239 235/235 238/238 +f 235/235 239/239 236/236 +f 212/215 236/236 239/239 +f 236/236 212/215 212/215 +f 240/240 184/184 188/188 +f 184/184 240/240 237/237 +f 241/241 237/237 240/240 +f 237/237 241/241 238/238 +f 242/242 238/238 241/241 +f 238/238 242/242 239/239 +f 212/215 239/239 242/242 +f 239/239 212/215 212/215 +f 243/243 188/188 192/192 +f 188/188 243/243 240/240 +f 244/244 240/240 243/243 +f 240/240 244/244 241/241 +f 245/245 241/241 244/244 +f 241/241 245/245 242/242 +f 212/215 242/242 245/245 +f 242/242 212/215 212/215 +f 246/246 192/192 196/196 +f 192/192 246/246 243/243 +f 247/247 243/243 246/246 +f 243/243 247/247 244/244 +f 248/248 244/244 247/247 +f 244/244 248/248 245/245 +f 212/215 245/245 248/248 +f 245/245 212/215 212/215 +f 249/249 196/196 200/200 +f 196/196 249/249 246/246 +f 250/250 246/246 249/249 +f 246/246 250/250 247/247 +f 251/251 247/247 250/250 +f 247/247 251/251 248/248 +f 212/215 248/248 251/251 +f 248/248 212/215 212/215 +f 252/252 200/200 204/204 +f 200/200 252/252 249/249 +f 253/253 249/249 252/252 +f 249/249 253/253 250/250 +f 254/254 250/250 253/253 +f 250/250 254/254 251/251 +f 212/215 251/251 254/254 +f 251/251 212/215 212/215 +f 255/255 204/204 208/208 +f 204/204 255/255 252/252 +f 256/256 252/252 255/255 +f 252/252 256/256 253/253 +f 257/257 253/253 256/256 +f 253/253 257/257 254/254 +f 212/215 254/254 257/257 +f 254/254 212/215 212/215 +f 209/210 208/208 148/152 +f 208/208 209/210 255/255 +f 210/212 255/255 209/210 +f 255/255 210/212 256/256 +f 211/214 256/256 210/212 +f 256/256 211/214 257/257 +f 212/215 257/257 211/214 +f 257/257 212/215 212/215 +f 264/258 258/260 263/259 +f 258/260 264/258 259/261 +f 265/262 259/261 264/258 +f 259/261 265/262 260/263 +f 266/264 260/263 265/262 +f 260/263 266/264 261/265 +f 267/266 261/265 266/264 +f 261/265 267/266 262/267 +f 269/268 263/259 268/269 +f 263/259 269/268 264/258 +f 270/270 264/258 269/268 +f 264/258 270/270 265/262 +f 271/271 265/262 270/270 +f 265/262 271/271 266/264 +f 272/272 266/264 271/271 +f 266/264 272/272 267/266 +f 274/273 268/269 273/274 +f 268/269 274/273 269/268 +f 275/275 269/268 274/273 +f 269/268 275/275 270/270 +f 276/276 270/270 275/275 +f 270/270 276/276 271/271 +f 277/277 271/271 276/276 +f 271/271 277/277 272/272 +f 279/278 273/274 278/279 +f 273/274 279/278 274/273 +f 280/280 274/273 279/278 +f 274/273 280/280 275/275 +f 281/281 275/275 280/280 +f 275/275 281/281 276/276 +f 282/282 276/276 281/281 +f 276/276 282/282 277/277 +f 284/283 278/279 283/284 +f 278/279 284/283 279/278 +f 285/285 279/278 284/283 +f 279/278 285/285 280/280 +f 286/286 280/280 285/285 +f 280/280 286/286 281/281 +f 287/287 281/281 286/286 +f 281/281 287/287 282/282 +f 289/288 283/284 288/289 +f 283/284 289/288 284/283 +f 290/290 284/283 289/288 +f 284/283 290/290 285/285 +f 291/291 285/285 290/290 +f 285/285 291/291 286/286 +f 292/292 286/286 291/291 +f 286/286 292/292 287/287 +f 294/293 288/289 293/294 +f 288/289 294/293 289/288 +f 295/295 289/288 294/293 +f 289/288 295/295 290/290 +f 296/296 290/290 295/295 +f 290/290 296/296 291/291 +f 297/297 291/291 296/296 +f 291/291 297/297 292/292 +f 259/261 293/294 258/260 +f 293/294 259/261 294/293 +f 260/263 294/293 259/261 +f 294/293 260/263 295/295 +f 261/265 295/295 260/263 +f 295/295 261/265 296/296 +f 262/267 296/296 261/265 +f 296/296 262/267 297/297 +f 302/298 262/267 267/266 +f 262/267 302/298 298/299 +f 303/300 298/299 302/298 +f 298/299 303/300 299/301 +f 304/302 299/301 303/300 +f 299/301 304/302 300/303 +f 305/304 300/303 304/302 +f 300/303 305/304 301/305 +f 306/306 267/266 272/272 +f 267/266 306/306 302/298 +f 307/307 302/298 306/306 +f 302/298 307/307 303/300 +f 308/308 303/300 307/307 +f 303/300 308/308 304/302 +f 309/309 304/302 308/308 +f 304/302 309/309 305/304 +f 310/310 272/272 277/277 +f 272/272 310/310 306/306 +f 311/311 306/306 310/310 +f 306/306 311/311 307/307 +f 312/312 307/307 311/311 +f 307/307 312/312 308/308 +f 313/313 308/308 312/312 +f 308/308 313/313 309/309 +f 314/314 277/277 282/282 +f 277/277 314/314 310/310 +f 315/315 310/310 314/314 +f 310/310 315/315 311/311 +f 316/316 311/311 315/315 +f 311/311 316/316 312/312 +f 317/317 312/312 316/316 +f 312/312 317/317 313/313 +f 318/318 282/282 287/287 +f 282/282 318/318 314/314 +f 319/319 314/314 318/318 +f 314/314 319/319 315/315 +f 320/320 315/315 319/319 +f 315/315 320/320 316/316 +f 321/321 316/316 320/320 +f 316/316 321/321 317/317 +f 322/322 287/287 292/292 +f 287/287 322/322 318/318 +f 323/323 318/318 322/322 +f 318/318 323/323 319/319 +f 324/324 319/319 323/323 +f 319/319 324/324 320/320 +f 325/325 320/320 324/324 +f 320/320 325/325 321/321 +f 326/326 292/292 297/297 +f 292/292 326/326 322/322 +f 327/327 322/322 326/326 +f 322/322 327/327 323/323 +f 328/328 323/323 327/327 +f 323/323 328/328 324/324 +f 329/329 324/324 328/328 +f 324/324 329/329 325/325 +f 298/299 297/297 262/267 +f 297/297 298/299 326/326 +f 299/301 326/326 298/299 +f 326/326 299/301 327/327 +f 300/303 327/327 299/301 +f 327/327 300/303 328/328 +f 301/305 328/328 300/303 +f 328/328 301/305 329/329 +f 336/330 330/332 335/331 +f 330/332 336/330 331/333 +f 337/334 331/333 336/330 +f 331/333 337/334 332/335 +f 338/336 332/335 337/334 +f 332/335 338/336 333/337 +f 339/338 333/337 338/336 +f 333/337 339/338 334/339 +f 341/340 335/331 340/341 +f 335/331 341/340 336/330 +f 342/342 336/330 341/340 +f 336/330 342/342 337/334 +f 343/343 337/334 342/342 +f 337/334 343/343 338/336 +f 344/344 338/336 343/343 +f 338/336 344/344 339/338 +f 346/345 340/341 345/346 +f 340/341 346/345 341/340 +f 347/347 341/340 346/345 +f 341/340 347/347 342/342 +f 348/348 342/342 347/347 +f 342/342 348/348 343/343 +f 349/349 343/343 348/348 +f 343/343 349/349 344/344 +f 351/350 345/346 350/351 +f 345/346 351/350 346/345 +f 352/352 346/345 351/350 +f 346/345 352/352 347/347 +f 353/353 347/347 352/352 +f 347/347 353/353 348/348 +f 354/354 348/348 353/353 +f 348/348 354/354 349/349 +f 356/355 350/351 355/356 +f 350/351 356/355 351/350 +f 357/357 351/350 356/355 +f 351/350 357/357 352/352 +f 358/358 352/352 357/357 +f 352/352 358/358 353/353 +f 359/359 353/353 358/358 +f 353/353 359/359 354/354 +f 361/360 355/356 360/361 +f 355/356 361/360 356/355 +f 362/362 356/355 361/360 +f 356/355 362/362 357/357 +f 363/363 357/357 362/362 +f 357/357 363/363 358/358 +f 364/364 358/358 363/363 +f 358/358 364/364 359/359 +f 366/365 360/361 365/366 +f 360/361 366/365 361/360 +f 367/367 361/360 366/365 +f 361/360 367/367 362/362 +f 368/368 362/362 367/367 +f 362/362 368/368 363/363 +f 369/369 363/363 368/368 +f 363/363 369/369 364/364 +f 331/333 365/366 330/332 +f 365/366 331/333 366/365 +f 332/335 366/365 331/333 +f 366/365 332/335 367/367 +f 333/337 367/367 332/335 +f 367/367 333/337 368/368 +f 334/339 368/368 333/337 +f 368/368 334/339 369/369 +f 374/370 334/339 339/338 +f 334/339 374/370 370/371 +f 375/372 370/371 374/370 +f 370/371 375/372 371/373 +f 376/374 371/373 375/372 +f 371/373 376/374 372/375 +f 377/376 372/375 376/374 +f 372/375 377/376 373/377 +f 378/378 339/338 344/344 +f 339/338 378/378 374/370 +f 379/379 374/370 378/378 +f 374/370 379/379 375/372 +f 380/380 375/372 379/379 +f 375/372 380/380 376/374 +f 381/381 376/374 380/380 +f 376/374 381/381 377/376 +f 382/382 344/344 349/349 +f 344/344 382/382 378/378 +f 383/383 378/378 382/382 +f 378/378 383/383 379/379 +f 384/384 379/379 383/383 +f 379/379 384/384 380/380 +f 385/385 380/380 384/384 +f 380/380 385/385 381/381 +f 386/386 349/349 354/354 +f 349/349 386/386 382/382 +f 387/387 382/382 386/386 +f 382/382 387/387 383/383 +f 388/388 383/383 387/387 +f 383/383 388/388 384/384 +f 389/389 384/384 388/388 +f 384/384 389/389 385/385 +f 390/390 354/354 359/359 +f 354/354 390/390 386/386 +f 391/391 386/386 390/390 +f 386/386 391/391 387/387 +f 392/392 387/387 391/391 +f 387/387 392/392 388/388 +f 393/393 388/388 392/392 +f 388/388 393/393 389/389 +f 394/394 359/359 364/364 +f 359/359 394/394 390/390 +f 395/395 390/390 394/394 +f 390/390 395/395 391/391 +f 396/396 391/391 395/395 +f 391/391 396/396 392/392 +f 397/397 392/392 396/396 +f 392/392 397/397 393/393 +f 398/398 364/364 369/369 +f 364/364 398/398 394/394 +f 399/399 394/394 398/398 +f 394/394 399/399 395/395 +f 400/400 395/395 399/399 +f 395/395 400/400 396/396 +f 401/401 396/396 400/400 +f 396/396 401/401 397/397 +f 370/371 369/369 334/339 +f 369/369 370/371 398/398 +f 371/373 398/398 370/371 +f 398/398 371/373 399/399 +f 372/375 399/399 371/373 +f 399/399 372/375 400/400 +f 373/377 400/400 372/375 +f 400/400 373/377 401/401 +f 407/402 402/403 402/403 +f 402/403 407/402 403/404 +f 408/405 403/404 407/402 +f 403/404 408/405 404/406 +f 409/407 404/406 408/405 +f 404/406 409/407 405/408 +f 410/409 405/408 409/407 +f 405/408 410/409 406/410 +f 411/411 402/403 402/403 +f 402/403 411/411 407/402 +f 412/412 407/402 411/411 +f 407/402 412/412 408/405 +f 413/413 408/405 412/412 +f 408/405 413/413 409/407 +f 414/414 409/407 413/413 +f 409/407 414/414 410/409 +f 415/415 402/403 402/403 +f 402/403 415/415 411/411 +f 416/416 411/411 415/415 +f 411/411 416/416 412/412 +f 417/417 412/412 416/416 +f 412/412 417/417 413/413 +f 418/418 413/413 417/417 +f 413/413 418/418 414/414 +f 419/419 402/403 402/403 +f 402/403 419/419 415/415 +f 420/420 415/415 419/419 +f 415/415 420/420 416/416 +f 421/421 416/416 420/420 +f 416/416 421/421 417/417 +f 422/422 417/417 421/421 +f 417/417 422/422 418/418 +f 423/423 402/403 402/403 +f 402/403 423/423 419/419 +f 424/424 419/419 423/423 +f 419/419 424/424 420/420 +f 425/425 420/420 424/424 +f 420/420 425/425 421/421 +f 426/426 421/421 425/425 +f 421/421 426/426 422/422 +f 427/427 402/403 402/403 +f 402/403 427/427 423/423 +f 428/428 423/423 427/427 +f 423/423 428/428 424/424 +f 429/429 424/424 428/428 +f 424/424 429/429 425/425 +f 430/430 425/425 429/429 +f 425/425 430/430 426/426 +f 431/431 402/403 402/403 +f 402/403 431/431 427/427 +f 432/432 427/427 431/431 +f 427/427 432/432 428/428 +f 433/433 428/428 432/432 +f 428/428 433/433 429/429 +f 434/434 429/429 433/433 +f 429/429 434/434 430/430 +f 435/435 402/403 402/403 +f 402/403 435/435 431/431 +f 436/436 431/431 435/435 +f 431/431 436/436 432/432 +f 437/437 432/432 436/436 +f 432/432 437/437 433/433 +f 438/438 433/433 437/437 +f 433/433 438/438 434/434 +f 439/439 402/403 402/403 +f 402/403 439/439 435/435 +f 440/440 435/435 439/439 +f 435/435 440/440 436/436 +f 441/441 436/436 440/440 +f 436/436 441/441 437/437 +f 442/442 437/437 441/441 +f 437/437 442/442 438/438 +f 443/443 402/403 402/403 +f 402/403 443/443 439/439 +f 444/444 439/439 443/443 +f 439/439 444/444 440/440 +f 445/445 440/440 444/444 +f 440/440 445/445 441/441 +f 446/446 441/441 445/445 +f 441/441 446/446 442/442 +f 447/447 402/403 402/403 +f 402/403 447/447 443/443 +f 448/448 443/443 447/447 +f 443/443 448/448 444/444 +f 449/449 444/444 448/448 +f 444/444 449/449 445/445 +f 450/450 445/445 449/449 +f 445/445 450/450 446/446 +f 451/451 402/403 402/403 +f 402/403 451/451 447/447 +f 452/452 447/447 451/451 +f 447/447 452/452 448/448 +f 453/453 448/448 452/452 +f 448/448 453/453 449/449 +f 454/454 449/449 453/453 +f 449/449 454/454 450/450 +f 455/455 402/403 402/403 +f 402/403 455/455 451/451 +f 456/456 451/451 455/455 +f 451/451 456/456 452/452 +f 457/457 452/452 456/456 +f 452/452 457/457 453/453 +f 458/458 453/453 457/457 +f 453/453 458/458 454/454 +f 459/459 402/403 402/403 +f 402/403 459/459 455/455 +f 460/460 455/455 459/459 +f 455/455 460/460 456/456 +f 461/461 456/456 460/460 +f 456/456 461/461 457/457 +f 462/462 457/457 461/461 +f 457/457 462/462 458/458 +f 463/463 402/403 402/403 +f 402/403 463/463 459/459 +f 464/464 459/459 463/463 +f 459/459 464/464 460/460 +f 465/465 460/460 464/464 +f 460/460 465/465 461/461 +f 466/466 461/461 465/465 +f 461/461 466/466 462/462 +f 403/404 402/403 402/403 +f 402/403 403/404 463/463 +f 404/406 463/463 403/404 +f 463/463 404/406 464/464 +f 405/408 464/464 404/406 +f 464/464 405/408 465/465 +f 406/410 465/465 405/408 +f 465/465 406/410 466/466 +f 471/467 406/410 410/409 +f 406/410 471/467 467/468 +f 472/469 467/468 471/467 +f 467/468 472/469 468/470 +f 473/471 468/470 472/469 +f 468/470 473/471 469/472 +f 474/473 469/472 473/471 +f 469/472 474/473 470/474 +f 475/475 410/409 414/414 +f 410/409 475/475 471/467 +f 476/476 471/467 475/475 +f 471/467 476/476 472/469 +f 477/477 472/469 476/476 +f 472/469 477/477 473/471 +f 478/478 473/471 477/477 +f 473/471 478/478 474/473 +f 479/479 414/414 418/418 +f 414/414 479/479 475/475 +f 480/480 475/475 479/479 +f 475/475 480/480 476/476 +f 481/481 476/476 480/480 +f 476/476 481/481 477/477 +f 482/482 477/477 481/481 +f 477/477 482/482 478/478 +f 483/483 418/418 422/422 +f 418/418 483/483 479/479 +f 484/484 479/479 483/483 +f 479/479 484/484 480/480 +f 485/485 480/480 484/484 +f 480/480 485/485 481/481 +f 486/486 481/481 485/485 +f 481/481 486/486 482/482 +f 487/487 422/422 426/426 +f 422/422 487/487 483/483 +f 488/488 483/483 487/487 +f 483/483 488/488 484/484 +f 489/489 484/484 488/488 +f 484/484 489/489 485/485 +f 490/490 485/485 489/489 +f 485/485 490/490 486/486 +f 491/491 426/426 430/430 +f 426/426 491/491 487/487 +f 492/492 487/487 491/491 +f 487/487 492/492 488/488 +f 493/493 488/488 492/492 +f 488/488 493/493 489/489 +f 494/494 489/489 493/493 +f 489/489 494/494 490/490 +f 495/495 430/430 434/434 +f 430/430 495/495 491/491 +f 496/496 491/491 495/495 +f 491/491 496/496 492/492 +f 497/497 492/492 496/496 +f 492/492 497/497 493/493 +f 498/498 493/493 497/497 +f 493/493 498/498 494/494 +f 499/499 434/434 438/438 +f 434/434 499/499 495/495 +f 500/500 495/495 499/499 +f 495/495 500/500 496/496 +f 501/501 496/496 500/500 +f 496/496 501/501 497/497 +f 502/502 497/497 501/501 +f 497/497 502/502 498/498 +f 503/503 438/438 442/442 +f 438/438 503/503 499/499 +f 504/504 499/499 503/503 +f 499/499 504/504 500/500 +f 505/505 500/500 504/504 +f 500/500 505/505 501/501 +f 506/506 501/501 505/505 +f 501/501 506/506 502/502 +f 507/507 442/442 446/446 +f 442/442 507/507 503/503 +f 508/508 503/503 507/507 +f 503/503 508/508 504/504 +f 509/509 504/504 508/508 +f 504/504 509/509 505/505 +f 510/510 505/505 509/509 +f 505/505 510/510 506/506 +f 511/511 446/446 450/450 +f 446/446 511/511 507/507 +f 512/512 507/507 511/511 +f 507/507 512/512 508/508 +f 513/513 508/508 512/512 +f 508/508 513/513 509/509 +f 514/514 509/509 513/513 +f 509/509 514/514 510/510 +f 515/515 450/450 454/454 +f 450/450 515/515 511/511 +f 516/516 511/511 515/515 +f 511/511 516/516 512/512 +f 517/517 512/512 516/516 +f 512/512 517/517 513/513 +f 518/518 513/513 517/517 +f 513/513 518/518 514/514 +f 519/519 454/454 458/458 +f 454/454 519/519 515/515 +f 520/520 515/515 519/519 +f 515/515 520/520 516/516 +f 521/521 516/516 520/520 +f 516/516 521/521 517/517 +f 522/522 517/517 521/521 +f 517/517 522/522 518/518 +f 523/523 458/458 462/462 +f 458/458 523/523 519/519 +f 524/524 519/519 523/523 +f 519/519 524/524 520/520 +f 525/525 520/520 524/524 +f 520/520 525/525 521/521 +f 526/526 521/521 525/525 +f 521/521 526/526 522/522 +f 527/527 462/462 466/466 +f 462/462 527/527 523/523 +f 528/528 523/523 527/527 +f 523/523 528/528 524/524 +f 529/529 524/524 528/528 +f 524/524 529/529 525/525 +f 530/530 525/525 529/529 +f 525/525 530/530 526/526 +f 467/468 466/466 406/410 +f 466/466 467/468 527/527 +f 468/470 527/527 467/468 +f 527/527 468/470 528/528 +f 469/472 528/528 468/470 +f 528/528 469/472 529/529 +f 470/474 529/529 469/472 +f 529/529 470/474 530/530 diff --git a/scenes/toBoldlyGo.txt b/scenes/toBoldlyGo.txt new file mode 100644 index 0000000..a0bfe35 --- /dev/null +++ b/scenes/toBoldlyGo.txt @@ -0,0 +1,110 @@ +// Emissive material (light) +MATERIAL 0 +RGB 1 1 1 +SPECEX 0 +SPECRGB 0 0 0 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 1 + +// Diffuse light grey +MATERIAL 1 +RGB .88 .88 .88 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Diffuse dark grey +MATERIAL 2 +RGB .35 .35 .35 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 0 + +// Emissive blue +MATERIAL 3 +RGB .35 .35 .85 +SPECEX 0 +SPECRGB 1 1 1 +REFL 0 +REFR 0 +REFRIOR 0 +EMITTANCE 5 + +// Camera +CAMERA +RES 800 800 +FOVY 45 +ITERATIONS 5000 +DEPTH 8 +FILE car +EYE 5.0 5 10.5 +VIEW -1 0.5 -1 +UP 0 1 0 +CAMERATIME 0 +SHUTTERDURATION 70 + +// ground +OBJECT 0 +cube +material 2 +TRANS 0 0 0 +ROTAT 0 0 0 +SCALE 1000 .01 1000 + +// Ceiling +OBJECT 1 +cube +material 0 +TRANS 0 100 0 +ROTAT 0 0 90 +SCALE .01 1000 1000 + +// Front wall +OBJECT 2 +cube +material 0 +TRANS 0 500 500 +ROTAT 0 90 0 +SCALE .01 1000 1000 + +// Back wall +OBJECT 3 +cube +material 0 +TRANS 0 500 -500 +ROTAT 0 90 0 +SCALE .01 1000 1000 + +// Left wall +OBJECT 4 +cube +material 0 +TRANS -500 500 0 +ROTAT 0 0 0 +SCALE .01 1000 1000 + +// Right wall +OBJECT 5 +cube +material 0 +TRANS 500 500 0 +ROTAT 0 0 0 +SCALE .01 1000 1000 + +// enterprise +OBJECT 6 +mesh +material 1 +SPEED 0 0 0.01 +TRANS 0 5 -3 +ROTAT 0 0 0 +SCALE 1 1 1 +FILE ../scenes/USSEnterprise.obj \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a1cb3fb..2937dbb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -15,6 +15,8 @@ set(SOURCE_FILES "preview.cpp" "utilities.cpp" "utilities.h" + "Mesh.cpp" + "Mesh.h" ) cuda_add_library(src diff --git a/src/Mesh.cpp b/src/Mesh.cpp new file mode 100644 index 0000000..8156b16 --- /dev/null +++ b/src/Mesh.cpp @@ -0,0 +1,123 @@ +#include "Mesh.h" + +Mesh::Mesh(string filename) +{ + m_FILENAME = filename; + + buildGeomtery(); + vertexAllTriangles(); +} + +Mesh::~Mesh() +{ +} + +void Mesh::buildGeomtery() +{ + // load the file up + ifstream myfile(m_FILENAME); + string line; + if (myfile.is_open()) + { + while (getline(myfile, line)) + { + placeToken(line, &myfile); + } + myfile.close(); + } + return; +} + +glm::vec3 parseOneVec3(string token) { + float x, y, z; + sscanf_s(token.c_str(), "%f %f %f\n", &x, &y, &z); + return glm::vec3(x, y, z); +} + +void parseTwoVec3(string token, glm::vec3 *a, glm::vec3 *b) +{ + float x1, y1, z1; + float x2, y2, z2; + sscanf_s(token.c_str(), "%f/%f %f/%f %f/%f\n", &x1, &x2, &y1, &y2, &z1, &z2); + *a = glm::vec3(x1, y1, z1); + *b = glm::vec3(x2, y2, z2); + return; +} + +void Mesh::placeToken(string token, ifstream *myfile) +{ + if (token.length() == 0) + { + ////std::cout << "newline maybe" << std::endl; + return; + } + + // case of a vertex + if (token.compare(0, 1, "v") == 0) + { + token.erase(0, 2); // we'll assume v x y z, so erase v and whitespace space + vertices.push_back(parseOneVec3(token)); + return; + } + + // case of a face index + if (token.compare(0, 1, "f") == 0) + { + token.erase(0, 2); // we'll assume f x y z, so erase f and whitespace space + + // the token can be of form p1 p2 p3 or p1/t1 p2/t2 p3/t3. also, not zero-indexed + std::size_t hasSlash = token.find_first_of('/'); + // there is no slash... just like there is no spoon oooOooooooOOOOOOoooo + if (hasSlash == std::string::npos) + { + glm::vec3 face_indices = parseOneVec3(token); + face_indices -= glm::vec3(1.0f); + indices.push_back((int)face_indices[0]); + indices.push_back((int)face_indices[1]); + indices.push_back((int)face_indices[2]); + //std::cout << "face is " << face_indices[0] << " " << face_indices[1] << " " << face_indices[2] << std::endl; + + } + else + { + glm::vec3 face_indices; + glm::vec3 tex_indices; + parseTwoVec3(token, &face_indices, &tex_indices); + + face_indices -= glm::vec3(1.0f); + indices.push_back((int)face_indices[0]); + indices.push_back((int)face_indices[1]); + indices.push_back((int)face_indices[2]); + + //std::cout << "face is " << face_indices[0] << " " << face_indices[1] << " " << face_indices[2] << " "; + //std::cout << "tex is " << tex_indices[0] << " " << tex_indices[1] << " " << tex_indices[2] << std::endl; + + // TODO: handle the texture coordinate thing! + } + return; + } + return; +} + +void Mesh::vertexAllTriangles() +{ + int numIndices = indices.size(); + + // count through all the indices and push those vertices on triangleVertices; + vector triangleVertices; + for (int i = 0; i < numIndices; i++) + { + int index = indices.at(i); + triangleVertices.push_back(vertices.at(index)); + } + // set indices + vector triangleIndices; + for (int i = 0; i < numIndices; i++) + { + triangleIndices.push_back(i); + } + + // aaaaand switch all the buffers! CANNOT BE REVERSED + vertices = triangleVertices; + indices = triangleIndices; +} \ No newline at end of file diff --git a/src/Mesh.h b/src/Mesh.h new file mode 100644 index 0000000..b03db96 --- /dev/null +++ b/src/Mesh.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include +#include "glm/glm.hpp" +#include "utilities.h" + +using namespace std; + +class Mesh +{ +public: + Mesh(string filename); + ~Mesh(); + + virtual void buildGeomtery(); + void placeToken(string token, ifstream *myfile); + + void vertexAllTriangles(); // change buffers so you upload every vertex for every triangle + string m_FILENAME; + vector vertices; // vertex buffer + vector indices; // index buffer +}; \ No newline at end of file diff --git a/src/interactions.h b/src/interactions.h index f0bf0b6..29710ba 100644 --- a/src/interactions.h +++ b/src/interactions.h @@ -1,6 +1,7 @@ #pragma once #include "intersections.h" +#include "sceneStructs.h" // CHECKITOUT /** @@ -41,6 +42,80 @@ glm::vec3 calculateRandomDirectionInHemisphere( + sin(around) * over * perpendicularDirection2; } +__host__ __device__ float SchlickCosine(float cosTheta, float IORi, float IORt) { + float R0 = ((IORi - IORt) / (IORi + IORt)); + R0 *= R0; + return R0 + (1.0f - R0) * pow((1.0f - cosTheta), 5.0f); +} + +__host__ __device__ void reflect( + PathRay &rayStep, + glm::vec3 intersect, + glm::vec3 normal, + const Material &m, + float term + ) { + // perfect reflection: http://paulbourke.net/geometry/reflected/ + rayStep.ray.direction = rayStep.ray.direction - 2.0f * normal * + (glm::dot(rayStep.ray.direction, normal)); + rayStep.ray.origin = intersect; + //if (m.hasRefractive) { + // // compute using Schlick's approximation + // float cosTheta = glm::dot(rayStep.ray.direction, normal); + // if (cosTheta > 0.0f) { + // float fresnel = SchlickCosine(cosTheta, 1.0f, m.indexOfRefraction); + // glm::vec3 color = m.color; + // color *= term * fresnel; + // rayStep.color *= color; + // return; + // } + //} + glm::vec3 color = m.color; + color *= term; + rayStep.color *= color; +} + +__host__ __device__ void refract( + PathRay &rayStep, + glm::vec3 intersect, + glm::vec3 normal, + const Material &m, + float term + ) { + // refract: http://graphics.stanford.edu/courses/cs148-10-summer/docs/2006--degreve--reflection_refraction.pdf + float IORi = 1.0f; // THE VOID + float IORt = m.indexOfRefraction; + float cosAnglei = glm::dot(rayStep.ray.direction, normal); + + float sinAnglei = sqrt(1.0f - cosAnglei * cosAnglei); + if (sinAnglei > IORt / IORi) { // total internal reflection + rayStep.depth = 0; + rayStep.color[0] = 0; + rayStep.color[1] = 0; + rayStep.color[2] = 0; + return; + } + + float underSqrt = 1.0f - (((IORi * IORi) / (IORt * IORt)) * (1.0f - cosAnglei * cosAnglei)); + + if (underSqrt > 0.0f) { + rayStep.ray.direction = (IORi / IORt) * rayStep.ray.direction; + rayStep.ray.direction += ((IORi / IORt) * cosAnglei - sqrt(underSqrt)) * normal; + } + else { + rayStep.depth = 0; + rayStep.color[0] = 0; + rayStep.color[1] = 0; + rayStep.color[2] = 0; + return; + } + + rayStep.ray.origin = intersect + 0.001f * rayStep.ray.direction; + glm::vec3 color = m.color; + color *= term; + rayStep.color *= color; +} + /** * Scatter a ray with some probabilities according to the material properties. * For example, a diffuse surface scatters in a cosine-weighted hemisphere. @@ -63,8 +138,7 @@ glm::vec3 calculateRandomDirectionInHemisphere( */ __host__ __device__ void scatterRay( - Ray &ray, - glm::vec3 &color, + PathRay &rayStep, glm::vec3 intersect, glm::vec3 normal, const Material &m, @@ -72,4 +146,37 @@ void scatterRay( // TODO: implement this. // A basic implementation of pure-diffuse shading will just call the // calculateRandomDirectionInHemisphere defined above. -} + + // premultiply color. + if (m.emittance > 0.0f) { // hitting a light + rayStep.color *= m.color * m.emittance; + rayStep.depth = 0; + } + else if (rayStep.depth <= 0){ // bottoming out + rayStep.color = glm::vec3(0, 0, 0); + } + //else if (m.hasReflective > 0.0f && m.hasRefractive > 0.0f) { + // thrust::uniform_real_distribution u01(0, 1); + // // 50/50 split where the ray goes + // if (u01(rng) <= 0.5f) { + // refract(rayStep, intersect, normal, m, 1.0f); + // } + // else { + // reflect(rayStep, intersect, normal, m, 1.0f); + // } + // + //} + else if (m.hasReflective > 0.0f && m.hasRefractive < 1.0f) { // hitting a simple mirrored object + reflect(rayStep, intersect, normal, m, 1.0f); + } + else if (m.hasRefractive > 0.0f && m.hasReflective < 1.0f) { // hitting a simple refractive object + refract(rayStep, intersect, normal, m, 1.0f); + } + // basic diffuse. "deploy a new ray" in a random cosine weighted direction. + else // hitting just a normal thing + { + rayStep.ray.direction = calculateRandomDirectionInHemisphere(normal, rng); + rayStep.ray.origin = intersect; + rayStep.color *= m.color; + } +} \ No newline at end of file diff --git a/src/intersections.h b/src/intersections.h index 5f3613d..f244bba 100644 --- a/src/intersections.h +++ b/src/intersections.h @@ -1,6 +1,9 @@ #pragma once #include +#include +#include +#include #include "sceneStructs.h" #include "utilities.h" @@ -24,7 +27,7 @@ __host__ __device__ inline unsigned int utilhash(unsigned int a) { * Falls slightly short so that it doesn't intersect the object it's hitting. */ __host__ __device__ glm::vec3 getPointOnRay(Ray r, float t) { - return r.origin + (t - .0001f) * glm::normalize(r.direction); + return r.origin + (t - .001f) * glm::normalize(r.direction); // using 0.0001f results in floating pt error! } /** @@ -34,6 +37,39 @@ __host__ __device__ glm::vec3 multiplyMV(glm::mat4 m, glm::vec4 v) { return glm::vec3(m * v); } +// recomputes transform, inverse transform, and transpose inverse transform +// for an object based on the given time in milliseconds and the object's velocity +__host__ __device__ void recomputeTransforms(Geom &object, float t) { + // check if there's a speed at all + if (abs(object.speed[0] + object.speed[1] + object.speed[2]) < 0.001f || + t < 0.0f) return; + + glm::vec3 translation_t = object.translation + object.speed * t; + + // recompute transform + glm::mat4 translationMat = glm::translate(glm::mat4(), translation_t); + glm::mat4 rotationMat = glm::rotate(glm::mat4(), object.rotation.x * (float)PI / 180, glm::vec3(1, 0, 0)); + rotationMat = rotationMat * glm::rotate(glm::mat4(), object.rotation.y * (float)PI / 180, glm::vec3(0, 1, 0)); + rotationMat = rotationMat * glm::rotate(glm::mat4(), object.rotation.z * (float)PI / 180, glm::vec3(0, 0, 1)); + glm::mat4 scaleMat = glm::scale(glm::mat4(), object.scale); + object.transform = translationMat * rotationMat * scaleMat; + + // recompute inverse + // there's no reason this shouldn't work too :( + //translationMat = glm::translate(glm::mat4(), -translation_t); + //rotationMat = glm::rotate(glm::mat4(), -object.rotation.x * (float)PI / 180, glm::vec3(1, 0, 0)); + //rotationMat = rotationMat * glm::rotate(glm::mat4(), -object.rotation.y * (float)PI / 180, glm::vec3(0, 1, 0)); + //rotationMat = rotationMat * glm::rotate(glm::mat4(), -object.rotation.z * (float)PI / 180, glm::vec3(0, 0, 1)); + //glm::vec3 inverseScale = glm::vec3(1.0f / object.scale.x, 1.0f / object.scale.y, 1.0f / object.scale.z); + //scaleMat = glm::scale(glm::mat4(), inverseScale); + //object.inverseTransform = scaleMat * rotationMat * translationMat; + + object.inverseTransform = glm::inverse(object.transform); + + // recompute inverse transpose + object.invTranspose = glm::inverseTranspose(object.transform); +} + // CHECKITOUT /** * Test intersection between a ray and a transformed cube. Untransformed, @@ -44,7 +80,9 @@ __host__ __device__ glm::vec3 multiplyMV(glm::mat4 m, glm::vec4 v) { * @return Ray parameter `t` value. -1 if no intersection. */ __host__ __device__ float boxIntersectionTest(Geom box, Ray r, - glm::vec3& intersectionPoint, glm::vec3& normal) { + glm::vec3& intersectionPoint, glm::vec3& normal, float time) { + recomputeTransforms(box, time); + Ray q; q.origin = multiplyMV(box.inverseTransform, glm::vec4(r.origin , 1.0f)); q.direction = glm::normalize(multiplyMV(box.inverseTransform, glm::vec4(r.direction, 0.0f))); @@ -99,7 +137,9 @@ __host__ __device__ float boxIntersectionTest(Geom box, Ray r, * @return Ray parameter `t` value. -1 if no intersection. */ __host__ __device__ float sphereIntersectionTest(Geom sphere, Ray r, - glm::vec3& intersectionPoint, glm::vec3& normal) { + glm::vec3& intersectionPoint, glm::vec3& normal, float time) { + recomputeTransforms(sphere, time); + bool outside = false; float radius = .5; @@ -142,3 +182,49 @@ __host__ __device__ float sphereIntersectionTest(Geom sphere, Ray r, return glm::length(r.origin - intersectionPoint); } + +__host__ __device__ float meshIntersectionTest(Geom mesh, Ray r, + glm::vec3& intersectionPoint, glm::vec3& normal, float time) { + recomputeTransforms(mesh, time); + + glm::vec3 ro = multiplyMV(mesh.inverseTransform, glm::vec4(r.origin, 1.0f)); + glm::vec3 rd = glm::normalize(multiplyMV(mesh.inverseTransform, glm::vec4(r.direction, 0.0f))); + + Ray rt; + rt.origin = ro; + rt.direction = rd; + + float nearestDistance = -1.0f; + int triangleIndex = -1; + for (int i = 0; i < mesh.numTriangles; i += 3) { + glm::vec3 barycentric; + bool intersects = false; + intersects = glm::intersectRayTriangle(rt.origin, rt.direction, mesh.dev_triangleVertices[i], + mesh.dev_triangleVertices[i + 1], mesh.dev_triangleVertices[i + 2], barycentric); + // intersectRayTriangle gives z in barycentric as the distance along the ray. + if (intersects && barycentric.z > 0.0f && + (barycentric.z < nearestDistance || nearestDistance < 0.0f)) { + nearestDistance = barycentric.z; + triangleIndex = i; + } + } + if (triangleIndex > -1 && nearestDistance > 0.0f) { + glm::vec3 local_normal; + // compute normal using triangle's indices. assume cclockwise face. + glm::vec3 sideA = mesh.dev_triangleVertices[triangleIndex + 1] - + mesh.dev_triangleVertices[triangleIndex]; + glm::vec3 sideB = mesh.dev_triangleVertices[triangleIndex + 2] - + mesh.dev_triangleVertices[triangleIndex]; + sideA = glm::normalize(sideA); + sideB = glm::normalize(sideB); + local_normal = glm::cross(sideA, sideB); + glm::vec3 objspaceIntersection = getPointOnRay(rt, nearestDistance); + + intersectionPoint = multiplyMV(mesh.transform, glm::vec4(objspaceIntersection, 1.f)); + normal = glm::normalize(multiplyMV(mesh.invTranspose, glm::vec4(local_normal, 0.f))); + return glm::length(r.origin - intersectionPoint); + + } + return -1; + +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 77671f4..bb0dc11 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,8 +37,11 @@ int main(int argc, char** argv) { width = renderState->camera.resolution.x; height = renderState->camera.resolution.y; - // Initialize CUDA and GL components - init(); + // Initialize CUDA and GL components + init(); + + // load objs + scene->loadAllObjs(); // GLFW main loop mainLoop(); diff --git a/src/pathtrace.cu b/src/pathtrace.cu index 7fbaf30..bd5f03a 100644 --- a/src/pathtrace.cu +++ b/src/pathtrace.cu @@ -63,14 +63,55 @@ static glm::vec3 *dev_image = NULL; // TODO: static variables for device memory, scene/camera info, etc // ... +static int hst_geomCount; // number of geometries to check against +static Geom *dev_geoms; // pointer to geometries in global memory +static Material *dev_mats; // pointer to materials in global memory +//static PathRay *dev_firstBounce; // cache of the first raycast of any iteration +static PathRay *dev_rayPool; // pool of rays "in flight" +static int pixelcount; +static glm::vec3 *dev_sample = NULL; + +static int *dev_compact_tmp_array; // temporary array used by compact +static int *dev_compact_scan_array; // scan array used by compact + void pathtraceInit(Scene *scene) { hst_scene = scene; const Camera &cam = hst_scene->state.camera; - const int pixelcount = cam.resolution.x * cam.resolution.y; + pixelcount = cam.resolution.x * cam.resolution.y; cudaMalloc(&dev_image, pixelcount * sizeof(glm::vec3)); cudaMemset(dev_image, 0, pixelcount * sizeof(glm::vec3)); // TODO: initialize the above static variables added above + // set up the geometries + hst_geomCount = scene->geoms.size(); + cudaMalloc(&dev_geoms, hst_geomCount * sizeof(Geom)); + cudaMemcpy(dev_geoms, scene->geoms.data(), sizeof(Geom) * hst_geomCount, + cudaMemcpyHostToDevice); + + // set up the materials + int hst_matCount = scene->materials.size(); + cudaMalloc(&dev_mats, hst_matCount * sizeof(Material)); + cudaMemcpy(dev_mats, scene->materials.data(), + sizeof(Material) * hst_matCount, cudaMemcpyHostToDevice); + + // set up space for the first cast + // we'll be casting a ray from every pixel + int numPixels = scene->state.camera.resolution.x; + numPixels *= scene->state.camera.resolution.y; + //cudaMalloc(&dev_firstBounce, numPixels * sizeof(PathRay)); + cudaMalloc(&dev_rayPool, numPixels * sizeof(PathRay)); + + // allocate space for a "sample" + cudaMalloc(&dev_sample, pixelcount * sizeof(glm::vec3)); + cudaMemset(dev_sample, 0, pixelcount * sizeof(glm::vec3)); + + // allocate space for the compact temp array + int logn = ilog2ceil(pixelcount); + int pow2 = (int)pow(2, logn); + + // TODO: something better than just allocating up to the next power of two. inefficient. + cudaMalloc(&dev_compact_tmp_array, pow2 * sizeof(int)); + cudaMalloc(&dev_compact_scan_array, pow2 * sizeof(int)); checkCUDAError("pathtraceInit"); } @@ -78,6 +119,14 @@ void pathtraceInit(Scene *scene) { void pathtraceFree() { cudaFree(dev_image); // no-op if dev_image is null // TODO: clean up the above static variables + cudaFree(dev_geoms); + cudaFree(dev_mats); + //cudaFree(dev_firstBounce); + cudaFree(dev_rayPool); + cudaFree(dev_sample); + + cudaFree(dev_compact_tmp_array); + cudaFree(dev_compact_scan_array); checkCUDAError("pathtraceFree"); } @@ -107,11 +156,153 @@ __global__ void generateNoiseDeleteMe(Camera cam, int iter, glm::vec3 *image) { } } +__global__ void singleBounce(int iter, int pixelCount, Material* dev_mats, + int geomCount, Geom* dev_geoms, PathRay* dev_rayPool) { + // what information do we need for a single ray given index by block/grid thing? + // we need: + // - pointer to the sample that will have color updated OR color storage + // - access to the "current rays" ray pool + // -is it better to read and write to the same place? + // -or have two buffers and flip them? + // -"next rays" memory should have same allocated size as current rays + // -should start off allocated full of "terminated" rays + // -terminated rays have depth of over MAX_DEPTH + // - count of ray depth + // - so I've added a PathRay struct that contains color and trace depth + + // 1) grab the index of the ray + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < pixelCount) { + // 2) check what it intersects with + Geom *nearestGeom = NULL; + glm::vec3 isx_point; + glm::vec3 isx_norm; + float t = INFINITY; + for (int i = 0; i < geomCount; i++) { + float candidate_t = -1.0f; + glm::vec3 candidate_isx_point; + glm::vec3 candidate_isx_norm; + if (dev_geoms[i].type == CUBE) { + candidate_t = boxIntersectionTest(dev_geoms[i], dev_rayPool[index].ray, + candidate_isx_point, candidate_isx_norm, dev_rayPool[index].time); + } + else if (dev_geoms[i].type == SPHERE) { + candidate_t = sphereIntersectionTest(dev_geoms[i], dev_rayPool[index].ray, + candidate_isx_point, candidate_isx_norm, dev_rayPool[index].time); + } + else if (dev_geoms[i].type == MESH) { + candidate_t = meshIntersectionTest(dev_geoms[i], dev_rayPool[index].ray, + candidate_isx_point, candidate_isx_norm, dev_rayPool[index].time); + } + if (candidate_t > 0.0f && candidate_t < t) { + t = candidate_t; + isx_point = candidate_isx_point; + isx_norm = candidate_isx_norm; + nearestGeom = &dev_geoms[i]; + } + } + + // 3) update the ray in its slot + if (nearestGeom) { + thrust::default_random_engine rng = random_engine(iter, index, dev_rayPool[index].depth); + scatterRay(dev_rayPool[index], isx_point, isx_norm, + dev_mats[nearestGeom->materialid], rng); + dev_rayPool[index].depth--; + } + else { + // ray cast out into space + dev_rayPool[index].depth = 0; + dev_rayPool[index].color = glm::vec3(0, 0, 0); + } + + // debug: intersection check. + // image[index] += isx_norm; + + // debug: flat color + //if (nearestGeom) { + // image[index] += dev_mats[nearestGeom->materialid].color; + //} + } +} + +// generates the initial raycasts +__global__ void rayCast(int iter, Camera cam, PathRay* dev_rayPool, int trace_depth) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + + // compute x and y screen coordinates by reversing int index = x + (y * resolution.x); + int y = index / (int)cam.resolution.x; + int x = index - y * cam.resolution.x; + + if (x < cam.resolution.x && y < cam.resolution.y) { + int index = x + (y * cam.resolution.x); + + // generate a PathRay to cast + glm::vec3 ref = cam.position + cam.view; + glm::vec3 R = glm::cross(cam.up, cam.view); + glm::vec3 V = cam.up * glm::tan(cam.fov.y * 0.01745329251f); + glm::vec3 H = R * glm::tan(cam.fov.x * 0.01745329251f); + // sx = ((2.0f * x) / cam.resolution.x) - 1.0f + // sy = 1.0f - ((2.0f * y) / cam.resolution.y) + glm::vec3 p = H * (((2.0f * x) / cam.resolution.x) - 1.0f) + + V * (1.0f - ((2.0f * y) / cam.resolution.y)) + ref; + dev_rayPool[index].ray.direction = glm::normalize(p - cam.position); + dev_rayPool[index].ray.origin = cam.position; + dev_rayPool[index].color = glm::vec3(1.0f); + dev_rayPool[index].depth = trace_depth; + dev_rayPool[index].pixelIndex = index; + + // jitter rays in time + if (cam.shutterDuration > 0.0f) { + thrust::default_random_engine rng = random_engine(iter, index, 0); + thrust::uniform_real_distribution u01(0, 1); + //float time = cam.cameraTime + u01(rng) * cam.shutterDuration; + //if (index < 100) { + // printf("%f\n", time); + //} + dev_rayPool[index].time = cam.cameraTime + u01(rng) * cam.shutterDuration; + } + else { + dev_rayPool[index].time = -1.0f; // timeless rays + } + + //glm::vec3 debug = glm::normalize(p - cam.position); + //debug.x = abs(debug.x); + //debug.y = abs(debug.y); + //debug.z = abs(debug.z); + // + //image[index] += debug; + } +} + +// transfers colors from thread pool to the image +__global__ void poolToImage(PathRay* dev_rayPool, glm::vec3 *sample) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (dev_rayPool[index].depth <= 0) { + sample[dev_rayPool[index].pixelIndex] = dev_rayPool[index].color; + } +} + +// transfers colors from thread pool to the image +__global__ void mergeSample(glm::vec3 *sample, glm::vec3 *image) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + image[index] += sample[index]; +} + /** * Wrapper for the __global__ call that sets up the kernel calls and does a ton * of memory management */ void pathtrace(uchar4 *pbo, int frame, int iter) { + // on iteration 1, run tests for efficient shared memory scan + //if (iter == 1) { + // StreamCompaction::Efficient::scan_components_test(); + //} + + + + // wipe the sample buffer + cudaMemset(dev_sample, 0, pixelcount * sizeof(glm::vec3)); + const int traceDepth = hst_scene->state.traceDepth; const Camera &cam = hst_scene->state.camera; const int pixelcount = cam.resolution.x * cam.resolution.y; @@ -149,7 +340,36 @@ void pathtrace(uchar4 *pbo, int frame, int iter) { // TODO: perform one iteration of path tracing - generateNoiseDeleteMe<<>>(cam, iter, dev_image); + //generateNoiseDeleteMe<<>>(cam, iter, dev_image); + + // while there are still unfinished rays in the scene, trace. + int unfinishedRays = cam.resolution.x * cam.resolution.y; + dim3 iterBlockSize(blockSideLength * blockSideLength); + dim3 iterBlocksPerGrid((unfinishedRays + iterBlockSize.x - 1) / + iterBlockSize.x); + + rayCast <<>>(iter, cam, dev_rayPool, traceDepth); + + while (unfinishedRays > 0) { + iterBlocksPerGrid.x = (unfinishedRays + iterBlockSize.x - 1) / + iterBlockSize.x; + + singleBounce <<>>(iter, pixelcount, + dev_mats, hst_geomCount, dev_geoms, dev_rayPool); + + poolToImage << > >(dev_rayPool, dev_sample); + + //unfinishedRays = cullRaysThrust(unfinishedRays); + //unfinishedRays = cullRaysEfficient(unfinishedRays); + unfinishedRays = cullRaysEfficientSharedMemory(unfinishedRays); + if (iter == 1) printf("unfinished rays: %i\n", unfinishedRays); + } + + // transfer results over to the image + iterBlocksPerGrid.x = (cam.resolution.x * cam.resolution.y + iterBlockSize.x - 1) / + iterBlockSize.x; + + mergeSample << > >(dev_sample, dev_image); /////////////////////////////////////////////////////////////////////////// @@ -162,3 +382,122 @@ void pathtrace(uchar4 *pbo, int frame, int iter) { checkCUDAError("pathtrace"); } + +struct bottomed_out +{ + __host__ __device__ + bool operator()(const PathRay pathray) + { + return pathray.depth <= 0; + } +}; + +// culls rays using stream compaction. for now, just uses thrust. +int cullRaysThrust(int numRays) { + PathRay *newEnd = thrust::remove_if(thrust::device, dev_rayPool, dev_rayPool + numRays, bottomed_out()); + // get the index of newEnd + int newNumRays = 0; + for (int i = 0; i < numRays; i++) { + if (&dev_rayPool[i] == newEnd) { + newNumRays = i; + break; + } + } + return newNumRays; +} + +// in parallel, compute the temp array +__global__ void tempArray(PathRay* dev_rayPool, int *dev_tmp, int numRays) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < numRays) { + dev_tmp[index] = dev_rayPool[index].depth > 0; + } +} + +// perform in-place scatter on the ray pool +__global__ void scatterRays(PathRay* dev_rayPool, int *dev_tmp, int *dev_scan, int numRays) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < numRays && dev_tmp[index]) { + dev_rayPool[dev_scan[index]] = dev_rayPool[index]; + } +} + +// culls rays using work efficient global memory stream compaction +int cullRaysEfficient(int numRays) { + + // zero pad up to a power of 2 + int logn = ilog2ceil(numRays); + int pow2 = (int)pow(2, logn); + + const int blockSideLength = 8; + const dim3 blockSize(blockSideLength * blockSideLength, 1); + const dim3 blocksPerGrid((pow2 + blockSize.x - 1) / blockSize.x); + + // zero out the temp array and the scan array + cudaMemset(dev_compact_tmp_array, 0, pow2 * sizeof(int)); + cudaMemset(dev_compact_scan_array, 0, pow2 * sizeof(int)); + // Step 1: compute temporary array containing 1 if criteria met, 0 otherwise + tempArray <<< blocksPerGrid, blockSize >>>(dev_rayPool, dev_compact_tmp_array, numRays); + // make a copy of the temp array so we can do an in-place upsweep downsweep step. TODO: can we get around this memcpy? + cudaMemcpy(dev_compact_scan_array, dev_compact_tmp_array, sizeof(int) * pow2, cudaMemcpyDeviceToDevice); + + // Step 2: run exclusive scan on temporary array + StreamCompaction::Efficient::up_sweep_down_sweep(pow2, dev_compact_scan_array, blocksPerGrid.x, blockSize.x); + + // Step 3: scatter in place + scatterRays << > >(dev_rayPool, dev_compact_tmp_array, dev_compact_scan_array, numRays); + + int last_index; + cudaMemcpy(&last_index, dev_compact_scan_array + (numRays - 1), sizeof(int), + cudaMemcpyDeviceToHost); + + int last_true_false; + cudaMemcpy(&last_true_false, dev_compact_tmp_array + (numRays - 1), sizeof(int), + cudaMemcpyDeviceToHost); + + return last_index + last_true_false; +} + +// perform in-place scatter on the ray pool +__global__ void inclusiveScatterRays(PathRay* dev_rayPool, int *dev_tmp, int *dev_scan, int numRays) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < numRays && dev_tmp[index]) { + if (index - 1 >= 0) { + dev_rayPool[dev_scan[index - 1]] = dev_rayPool[index]; + } + else { + dev_rayPool[0] = dev_rayPool[index]; + } + } +} + +// culls rays using work efficient shared memory stream compaction +int cullRaysEfficientSharedMemory(int numRays) { + const int blockSideLength = 8; + const dim3 blockSize(blockSideLength * blockSideLength, 1); + const dim3 blocksPerGrid((numRays + blockSize.x - 1) / blockSize.x); + + // zero out the temp array and the scan array + cudaMemset(dev_compact_tmp_array, 0, numRays * sizeof(int)); + cudaMemset(dev_compact_scan_array, 0, numRays * sizeof(int)); + // Step 1: compute temporary array containing 1 if criteria met, 0 otherwise + tempArray << < blocksPerGrid, blockSize >> >(dev_rayPool, dev_compact_tmp_array, numRays); + // make a copy of the temp array so we can do an scatter. TODO: can we get around this memcpy? + cudaMemcpy(dev_compact_scan_array, dev_compact_tmp_array, sizeof(int) * numRays, cudaMemcpyDeviceToDevice); + + // Step 2: run inclusive scan on temporary array + StreamCompaction::Efficient::memoryEfficientInclusiveScan(numRays, dev_compact_scan_array); + + // Step 3: inclusive scatter in place + inclusiveScatterRays << > >(dev_rayPool, dev_compact_tmp_array, dev_compact_scan_array, numRays); + + int last_index; + cudaMemcpy(&last_index, dev_compact_scan_array + (numRays - 2), sizeof(int), + cudaMemcpyDeviceToHost); + + int last_true_false; + cudaMemcpy(&last_true_false, dev_compact_tmp_array + (numRays - 1), sizeof(int), + cudaMemcpyDeviceToHost); + + return last_index + last_true_false; +} \ No newline at end of file diff --git a/src/pathtrace.h b/src/pathtrace.h index 1241227..882668c 100644 --- a/src/pathtrace.h +++ b/src/pathtrace.h @@ -2,7 +2,12 @@ #include #include "scene.h" +#include "stream_compaction\efficient.h" +#include "stream_compaction\common.h" void pathtraceInit(Scene *scene); void pathtraceFree(); void pathtrace(uchar4 *pbo, int frame, int iteration); +int cullRaysThrust(int numRays); +int cullRaysEfficient(int numRays); +int cullRaysEfficientSharedMemory(int numRays); \ No newline at end of file diff --git a/src/scene.cpp b/src/scene.cpp index 5804ce3..2a919de 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -32,6 +32,16 @@ Scene::Scene(string filename) { } } +Scene::~Scene() { + // free GPU resources + int numGeoms = geoms.size(); + for (int i = 0; i < numGeoms; i++) { + if (geoms.at(i).type == MESH) { + cudaFree(geoms.at(i).dev_triangleVertices); + } + } +} + int Scene::loadGeom(string objectid) { int id = atoi(objectid.c_str()); if (id != geoms.size()) { @@ -51,7 +61,10 @@ int Scene::loadGeom(string objectid) { } else if (strcmp(line.c_str(), "cube") == 0) { cout << "Creating new cube..." << endl; newGeom.type = CUBE; - } + } else if (strcmp(line.c_str(), "mesh") == 0) { + cout << "Creating new mesh..." << endl; + newGeom.type = MESH; + } } //link material @@ -74,7 +87,11 @@ int Scene::loadGeom(string objectid) { newGeom.rotation = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); } else if (strcmp(tokens[0].c_str(), "SCALE") == 0) { newGeom.scale = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); - } + } else if (strcmp(tokens[0].c_str(), "FILE") == 0) { + filenames.push_back(tokens[1]); + } else if (strcmp(tokens[0].c_str(), "SPEED") == 0) { + newGeom.speed = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); + } utilityCore::safeGetline(fp_in, line); } @@ -93,6 +110,7 @@ int Scene::loadCamera() { cout << "Loading Camera ..." << endl; RenderState &state = this->state; Camera &camera = state.camera; + camera.shutterDuration = -1.0f; float fovy; //load static properties @@ -103,15 +121,19 @@ int Scene::loadCamera() { if (strcmp(tokens[0].c_str(), "RES") == 0) { camera.resolution.x = atoi(tokens[1].c_str()); camera.resolution.y = atoi(tokens[2].c_str()); - } else if (strcmp(tokens[0].c_str(), "FOVY") == 0) { + } + else if (strcmp(tokens[0].c_str(), "FOVY") == 0) { fovy = atof(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "ITERATIONS") == 0) { + } + else if (strcmp(tokens[0].c_str(), "ITERATIONS") == 0) { state.iterations = atoi(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "DEPTH") == 0) { + } + else if (strcmp(tokens[0].c_str(), "DEPTH") == 0) { state.traceDepth = atoi(tokens[1].c_str()); - } else if (strcmp(tokens[0].c_str(), "FILE") == 0) { + } + else if (strcmp(tokens[0].c_str(), "FILE") == 0) { state.imageName = tokens[1]; - } + } } string line; @@ -124,7 +146,12 @@ int Scene::loadCamera() { camera.view = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); } else if (strcmp(tokens[0].c_str(), "UP") == 0) { camera.up = glm::vec3(atof(tokens[1].c_str()), atof(tokens[2].c_str()), atof(tokens[3].c_str())); - } + } else if (strcmp(tokens[0].c_str(), "CAMERATIME") == 0) { + camera.cameraTime = atof(tokens[1].c_str()); + } + else if (strcmp(tokens[0].c_str(), "SHUTTERDURATION") == 0) { + camera.shutterDuration = atof(tokens[1].c_str()); + } utilityCore::safeGetline(fp_in, line); } @@ -180,3 +207,30 @@ int Scene::loadMaterial(string materialid) { return 1; } } + +int Scene::loadAllObjs() { + int filenameVectorIndex = 0; + int numGeoms = geoms.size(); + for (int i = 0; i < numGeoms; i++) { + if (geoms.at(i).type == MESH) { + loadObj(filenames.at(filenameVectorIndex), geoms.at(i)); + filenameVectorIndex++; + } + } + return 1; +} + +int Scene::loadObj(string filename, Geom &geom) { + // load the obj + Mesh newMesh(filename); + + // load the triangles into GPU memory + geom.numTriangles = newMesh.vertices.size(); + cudaMalloc(&geom.dev_triangleVertices, geom.numTriangles * sizeof(glm::vec3)); + cudaMemcpy(geom.dev_triangleVertices, newMesh.vertices.data(), + geom.numTriangles * sizeof(glm::vec3), cudaMemcpyHostToDevice); + printf("Done loading "); + printf(filename.c_str()); + printf("\n"); + return 1; +} \ No newline at end of file diff --git a/src/scene.h b/src/scene.h index f29a917..3fc95fe 100644 --- a/src/scene.h +++ b/src/scene.h @@ -7,6 +7,7 @@ #include "glm/glm.hpp" #include "utilities.h" #include "sceneStructs.h" +#include "Mesh.h" using namespace std; @@ -16,10 +17,14 @@ class Scene { int loadMaterial(string materialid); int loadGeom(string objectid); int loadCamera(); + int loadObj(string filename, Geom &geom); + public: Scene(string filename); ~Scene(); + int loadAllObjs(); + std::vector filenames; std::vector geoms; std::vector materials; RenderState state; diff --git a/src/sceneStructs.h b/src/sceneStructs.h index baa2e30..a455650 100644 --- a/src/sceneStructs.h +++ b/src/sceneStructs.h @@ -8,6 +8,7 @@ enum GeomType { SPHERE, CUBE, + MESH }; struct Ray { @@ -15,15 +16,27 @@ struct Ray { glm::vec3 direction; }; +struct PathRay { + Ray ray; + glm::vec3 color; + int depth; + int pixelIndex; + float time; // in milliseconds +}; + struct Geom { enum GeomType type; int materialid; glm::vec3 translation; + glm::vec3 speed; // "speed" in units per millisecond glm::vec3 rotation; glm::vec3 scale; glm::mat4 transform; glm::mat4 inverseTransform; glm::mat4 invTranspose; + + glm::vec3 *dev_triangleVertices; // pointer to array of triangles in device memory + int numTriangles; }; struct Material { @@ -44,6 +57,8 @@ struct Camera { glm::vec3 view; glm::vec3 up; glm::vec2 fov; + float cameraTime; + float shutterDuration; }; struct RenderState { diff --git a/stream_compaction/CMakeLists.txt b/stream_compaction/CMakeLists.txt index ac358c9..cdbef77 100644 --- a/stream_compaction/CMakeLists.txt +++ b/stream_compaction/CMakeLists.txt @@ -1,4 +1,14 @@ set(SOURCE_FILES + "common.h" + "common.cu" + "cpu.h" + "cpu.cu" + "naive.h" + "naive.cu" + "efficient.h" + "efficient.cu" + "thrust.h" + "thrust.cu" ) cuda_add_library(stream_compaction diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu new file mode 100644 index 0000000..f609a6e --- /dev/null +++ b/stream_compaction/common.cu @@ -0,0 +1,39 @@ +#include "common.h" + +void checkCUDAErrorFnSC(const char *msg, const char *file, int line) { + cudaError_t err = cudaGetLastError(); + if (cudaSuccess == err) { + return; + } + + fprintf(stderr, "CUDA error"); + if (file) { + fprintf(stderr, " (%s:%d)", file, line); + } + fprintf(stderr, ": %s: %s\n", msg, cudaGetErrorString(err)); + exit(EXIT_FAILURE); +} + + +namespace StreamCompaction { +namespace Common { + +/** + * Maps an array to an array of 0s and 1s for stream compaction. Elements + * which map to 0 will be removed, and elements which map to 1 will be kept. + */ +__global__ void kernMapToBoolean(int n, int *bools, const int *idata) { + // TODO +} + +/** + * Performs scatter on an array. That is, for each element in idata, + * if bools[idx] == 1, it copies idata[idx] to odata[indices[idx]]. + */ +__global__ void kernScatter(int n, int *odata, + const int *idata, const int *bools, const int *indices) { + // TODO +} + +} +} diff --git a/stream_compaction/common.h b/stream_compaction/common.h new file mode 100644 index 0000000..5e4330e --- /dev/null +++ b/stream_compaction/common.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include +#include + +#define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) +#define BENCHMARK 0 + +/** + * Check for CUDA errors; print and exit if there was a problem. + */ +void checkCUDAErrorFnSC(const char *msg, const char *file = NULL, int line = -1); + +inline int ilog2(int x) { + int lg = 0; + while (x >>= 1) { + ++lg; + } + return lg; +} + +inline int ilog2ceil(int x) { + return ilog2(x - 1) + 1; +} + + +namespace StreamCompaction { +namespace Common { + __global__ void kernMapToBoolean(int n, int *bools, const int *idata); + + __global__ void kernScatter(int n, int *odata, + const int *idata, const int *bools, const int *indices); +} +} diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu new file mode 100644 index 0000000..87f5fd7 --- /dev/null +++ b/stream_compaction/cpu.cu @@ -0,0 +1,111 @@ +#include +#include "cpu.h" +#include "common.h" + +namespace StreamCompaction { +namespace CPU { + +/** + * CPU scan (prefix sum). + */ +void scan(int n, int *odata, const int *idata) { + std::chrono::high_resolution_clock::time_point t1; + if (BENCHMARK) { + t1 = std::chrono::high_resolution_clock::now(); + } + + + // Implement exclusive serial scan on CPU + odata[0] = 0; + for (int i = 1; i < n; i++) { + odata[i] = odata[i - 1] + idata[i - 1]; + } + + if (BENCHMARK) { + std::chrono::high_resolution_clock::time_point t2 = + std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(t2 - t1).count(); + std::cout << duration << " microseconds.\n"; + } +} + +/** + * CPU stream compaction without using the scan function. + * + * @returns the number of elements remaining after compaction. + */ +int compactWithoutScan(int n, int *odata, const int *idata) { + std::chrono::high_resolution_clock::time_point t1; + if (BENCHMARK) { + t1 = std::chrono::high_resolution_clock::now(); + } + + // remove all 0s from the array of ints + int odataIndex = 0; + for (int i = 0; i < n; i++) { + if (idata[i] == 0) { + continue; + } + odata[odataIndex] = idata[i]; + odataIndex++; + } + + if (BENCHMARK) { + std::chrono::high_resolution_clock::time_point t2 = + std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(t2 - t1).count(); + std::cout << duration << " microseconds.\n"; + } + + return odataIndex; +} + +/** + * CPU stream compaction using scan and scatter, like the parallel version. + * + * @returns the number of elements remaining after compaction. + */ +int compactWithScan(int n, int *odata, const int *idata) { + int *trueArray = new int[n]; + int *trueScan = new int[n]; + + std::chrono::high_resolution_clock::time_point t1; + if (BENCHMARK) { + t1 = std::chrono::high_resolution_clock::now(); + } + + + // Step 1: Compute temporary values in odata + for (int i = 0; i < n; i++) { + if (idata[i] == 0) { + trueArray[i] = 0; + } + else { + trueArray[i] = 1; + } + } + // Step 2: Run exclusive scan on temporary array + scan(n, trueScan, trueArray); + + // Step 3: Scatter + for (int i = 0; i < n; i++) { + if (trueArray[i]) { + odata[trueScan[i]] = idata[i]; + } + } + int numRemaining = trueScan[n - 1] + trueArray[n - 1]; + + if (BENCHMARK) { + std::chrono::high_resolution_clock::time_point t2 = + std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(t2 - t1).count(); + std::cout << duration << " microseconds.\n"; + } + + delete trueArray; + delete trueScan; + return numRemaining; +} + +} +} diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h new file mode 100644 index 0000000..21cce3a --- /dev/null +++ b/stream_compaction/cpu.h @@ -0,0 +1,13 @@ +#pragma once +#include +#include + +namespace StreamCompaction { +namespace CPU { + void scan(int n, int *odata, const int *idata); + + int compactWithoutScan(int n, int *odata, const int *idata); + + int compactWithScan(int n, int *odata, const int *idata); +} +} diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu new file mode 100644 index 0000000..b4f6433 --- /dev/null +++ b/stream_compaction/efficient.cu @@ -0,0 +1,579 @@ +#include +#include +#include "common.h" +#include "efficient.h" + +namespace StreamCompaction { +namespace Efficient { + +cudaEvent_t start, stop; + +static void setup_timer_events() { + cudaEventCreate(&start); + cudaEventCreate(&stop); + + cudaEventRecord(start); +} + +static float teardown_timer_events() { + cudaEventRecord(stop); + + cudaEventSynchronize(stop); + float milliseconds = 0; + cudaEventElapsedTime(&milliseconds, start, stop); + + cudaEventDestroy(start); + cudaEventDestroy(stop); + + return milliseconds; +} + +// TODO: __global__ + +__global__ void upsweep_step(int d_offset_plus, int d_offset, int *x) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + if (k % d_offset_plus) { + return; + } + x[k + d_offset_plus - 1] += x[k + d_offset - 1]; +} + +__global__ void downsweep_step(int d_offset_plus, int d_offset, int *x) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + if (k % d_offset_plus) { + return; + } + int t = x[k + d_offset - 1]; + x[k + d_offset - 1] = x[k + d_offset_plus - 1]; + x[k + d_offset_plus - 1] += t; +} + +__global__ void fill_by_value(int val, int *x) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + x[k] = val; +} + +static void setup_dimms(dim3 &dimBlock, dim3 &dimGrid, int n) { + cudaDeviceProp deviceProp; + cudaGetDeviceProperties(&deviceProp, 0); + int tpb = deviceProp.maxThreadsPerBlock; + int blockWidth = fmin(n, tpb); + int blocks = 1; + if (blockWidth != n) { + blocks = n / tpb; + if (n % tpb) { + blocks ++; + } + } + + dimBlock = dim3(blockWidth); + dimGrid = dim3(blocks); +} + +/** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ +void scan(int n, int *odata, const int *idata) { + + // we'll need to pad the device memory with 0s to get a power of 2 array size. + int logn = ilog2ceil(n); + int pow2 = (int)pow(2, logn); + + dim3 dimBlock; + dim3 dimGrid; + setup_dimms(dimBlock, dimGrid, pow2); + + int *dev_x; + cudaMalloc((void**)&dev_x, sizeof(int) * pow2); + fill_by_value <<>>(0, dev_x); + // copy everything in idata over to the GPU. + cudaMemcpy(dev_x, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + // up sweep and down sweep + up_sweep_down_sweep(pow2, dev_x, -1, -1); + + cudaMemcpy(odata, dev_x, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaFree(dev_x); +} + +// exposed up sweep and down sweep. expects powers of two! +void up_sweep_down_sweep(int n, int *dev_data1, int blocksPerGrid, int blockSize) { + int logn = ilog2ceil(n); + + dim3 dimBlock(blockSize, 1); + dim3 dimGrid(blocksPerGrid, 1); + if (blockSize < 0 && blocksPerGrid < 0) + setup_dimms(dimBlock, dimGrid, n); + + // Up Sweep + for (int d = 0; d < logn; d++) { + int d_offset_plus = (int)pow(2, d + 1); + int d_offset = (int)pow(2, d); + upsweep_step << > >(d_offset_plus, d_offset, dev_data1); + } + + // Down-Sweep + cudaMemset(&dev_data1[n - 1], 0, sizeof(int) * 1); + for (int d = logn - 1; d >= 0; d--) { + int d_offset_plus = (int)pow(2, d + 1); + int d_offset = (int)pow(2, d); + downsweep_step << > >(d_offset_plus, d_offset, dev_data1); + } +} + +__global__ void temporary_array(int *x, int *temp) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + temp[k] = (x[k] != 0); +} + +__global__ void scatter(int *x, int *trueFalse, int* scan, int *out) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + if (trueFalse[k]) { + out[scan[k]] = x[k]; + } +} + +/** + * Performs stream compaction on idata, storing the result into odata. + * All zeroes are discarded. + * + * @param n The number of elements in idata. + * @param odata The array into which to store elements. + * @param idata The array of elements to compact. + * @returns The number of elements remaining after compaction. + */ +int compact(int n, int *odata, const int *idata) { + int logn = ilog2ceil(n); + int pow2 = (int)pow(2, logn); + + dim3 dimBlock; + dim3 dimGrid; + setup_dimms(dimBlock, dimGrid, pow2); + + int *dev_x; + int *dev_tmp; + int *dev_scatter; + int *dev_scan; + + cudaMalloc((void**)&dev_x, sizeof(int) * pow2); + cudaMalloc((void**)&dev_tmp, sizeof(int) * pow2); + cudaMalloc((void**)&dev_scan, sizeof(int) * pow2); + cudaMalloc((void**)&dev_scatter, sizeof(int) * pow2); + + // 0 pad up to a power of 2 array length. + // copy everything in idata over to the GPU. + fill_by_value << > >(0, dev_x); + cudaMemcpy(dev_x, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + // Step 1: compute temporary true/false array + temporary_array <<>>(dev_x, dev_tmp); + + // Step 2: run efficient scan on the tmp array + cudaMemcpy(dev_scan, dev_tmp, sizeof(int) * pow2, cudaMemcpyDeviceToDevice); + up_sweep_down_sweep(pow2, dev_scan, -1, -1); + + // Step 3: scatter + scatter <<>>(dev_x, dev_tmp, dev_scan, dev_scatter); + + cudaMemcpy(odata, dev_scatter, sizeof(int) * n, cudaMemcpyDeviceToHost); + + int last_index; + cudaMemcpy(&last_index, dev_scan + (n - 1), sizeof(int), + cudaMemcpyDeviceToHost); + + int last_true_false; + cudaMemcpy(&last_true_false, dev_tmp + (n - 1), sizeof(int), + cudaMemcpyDeviceToHost); + + cudaFree(dev_x); + cudaFree(dev_tmp); + cudaFree(dev_scan); + cudaFree(dev_scatter); + + return last_index + last_true_false; +} + +__global__ void block_upsweep(int *dev_data, int n) { + // parallel reduction with some modifications + // in place of: + // 0 1 2 3 4 5 6 7 stride = 1 + // 1 5 9 13 stride = 2 + // 6 22 stride = 4 + // 28 + // + // we want: + // 0 1 2 3 4 5 6 7 stride = 1 + // 1 5 9 13 stride = 2 + // 6 22 stride = 4 + // 28 + // + // want to do stuff at indices: + // 1 3 5 6 7 -> stride to get here is 1 + // 3 7 -> stride to get here is 2 + // 7 -> stride to get here is 4 + // + // use if((t + 2) % (2 * stride) == 1) + // needs to produce something more like an "upsweep" than a traditional parallel reduction + + unsigned int t = threadIdx.x; // we're indexing shared memory, so no need for +(blockIdx.x * blockDim.x); + + // load into shared memory from provided pointer + // we know dev_data is spread over the entire grid + // so start is blockId.x * blockDim.x, size i blockDim.x + __shared__ int block_data[DEVICE_SHARED_MEMORY]; + if (t + blockIdx.x * blockDim.x < n) { + block_data[t] = dev_data[t + blockIdx.x * blockDim.x]; + } + else { + block_data[t] = 0; // pad the data with 0s if n isn't a multiple of DEVICE_SHARED_MEMORY + } + // for each stage: + for (unsigned int stride = 1; stride < blockDim.x; stride *= 2) { + // syncthreads to make sure all threads have transferred relevant data + __syncthreads(); + // compute partial + if ((t + 2) % (2 * stride) == 1) { + block_data[t] += block_data[t - stride]; + } + } + // write the data out. no need to sync b/c block_data[t] is all handled on this thread. + dev_data[t + blockIdx.x * blockDim.x] = block_data[t]; +} + +__global__ void block_downsweep(int *dev_data, int n) { + // we basically want the indices per step in block_upsweep in reverse. + // then we need to do that tricky tricky swapping thing + + unsigned int t = threadIdx.x; // we're indexing shared memory, so no need for +(blockIdx.x * blockDim.x); + // load into shared memory from provided pointer + // we know dev_data is spread over the entire grid + // so start is blockId.x * blockDim.x, size i blockDim.x + __shared__ int block_data[DEVICE_SHARED_MEMORY]; + block_data[t] = dev_data[t + blockIdx.x * blockDim.x]; + if (t == blockDim.x - 1) { + block_data[t] = 0; // set the "max value" to 0 + } + int tmp = 0; + // for each stage: + for (unsigned int stride = blockDim.x / 2; stride > 0; stride /= 2) { + // syncthreads to make sure all threads have transferred relevant data + __syncthreads(); + // swap and sum + if ((t + 2) % (2 * stride) == 1) { + tmp = block_data[t - stride]; + block_data[t - stride] = block_data[t]; + block_data[t] += tmp; + } + } + __syncthreads(); + if (t + blockIdx.x * blockDim.x < n) { + // write the data out. + dev_data[t + blockIdx.x * blockDim.x] = block_data[t]; + } +} + +__global__ void block_downsweep_inclusive(int *dev_data, int *dev_segment_ends, int n) { + // we basically want the indices per step in block_upsweep in reverse. + // then we need to do that tricky tricky swapping thing + + unsigned int t = threadIdx.x; // we're indexing shared memory, so no need for +(blockIdx.x * blockDim.x); + // load into shared memory from provided pointer + // we know dev_data is spread over the entire grid + // so start is blockId.x * blockDim.x, size i blockDim.x + __shared__ int block_data[DEVICE_SHARED_MEMORY]; + __shared__ int block_data_inclusive[DEVICE_SHARED_MEMORY]; + + block_data[t] = dev_data[t + blockIdx.x * blockDim.x]; + if (t == blockDim.x - 1) { + block_data[t] = 0; + } + int tmp = 0; + // for each stage: + for (unsigned int stride = blockDim.x / 2; stride > 0; stride /= 2) { + // syncthreads to make sure all threads have transferred relevant data + __syncthreads(); + // swap and sum + if ((t + 2) % (2 * stride) == 1) { + tmp = block_data[t - stride]; + block_data[t - stride] = block_data[t]; + block_data[t] += tmp; + } + } + __syncthreads(); + // shift left by 1 to make this inclusive. + if (t < DEVICE_SHARED_MEMORY - 1) { + block_data_inclusive[t] = block_data[t + 1]; + } + else { + // figure out what index of dev_segment_ends to look at + block_data_inclusive[DEVICE_SHARED_MEMORY - 1] = dev_segment_ends[blockIdx.x]; + block_data_inclusive[DEVICE_SHARED_MEMORY - 1] += block_data[t]; + } + + __syncthreads(); + if (t + blockIdx.x * blockDim.x < n) { + // write the data out. + dev_data[t + blockIdx.x * blockDim.x] = block_data_inclusive[t]; + } +} + +__global__ void accumulate_ends_of_segments(int *dev_data, int data_length, int *dev_maxPerSeg, int segWidth) { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index < ((data_length + segWidth - 1) / segWidth)) { // the number of data segments, including incomplete + int blockMaxIndex = segWidth * (index + 1) - 1; + if (blockMaxIndex >= data_length) { + blockMaxIndex = data_length - 1; + } + dev_maxPerSeg[index] = dev_data[blockMaxIndex]; + } +} + +__global__ void backAdd(int *dev_data, int data_length, int *dev_maxPerSegScan, int segWidth) { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index < data_length) { + // compute which maxPerSegScan value to use. based on block. + dev_data[index] += dev_maxPerSegScan[index / segWidth]; + } +} + +void scan_components_test() { + printf("running efficient shared memory scan component tests...\n"); + int *dev_small; + cudaMalloc(&dev_small, 8 * sizeof(int)); + int results[8]; + + // tests on non-power of two case. + int smallNP2[6]; + for (int i = 0; i < 6; i++) { + smallNP2[i] = i; + } + int smallScanNP2[6] = { 0, 0, 1, 3, 6, 10}; + + // test scan on one block + cudaMemcpy(dev_small, smallNP2, 6 * sizeof(int), cudaMemcpyHostToDevice); + dim3 blockSize = dim3(8, 1); + dim3 blocksPerGrid = dim3(1, 1); + block_upsweep << > >(dev_small, 6); + //cudaMemcpy(results, dev_small, 8 * sizeof(int), cudaMemcpyDeviceToHost); + //printf("peeking"); + + block_downsweep << > >(dev_small, 6); + cudaMemcpy(results, dev_small, 8 * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = 0; i < 6; i++) { + if (smallScanNP2[i] != results[i]) { + printf("one block scan NP2 test FAIL!\n"); + return; + } + } + + // the case in the slides, as a smaller test. + int small[8]; + for (int i = 0; i < 8; i++) { + small[i] = i; + } + int smallScan[8] = { 0, 0, 1, 3, 6, 10, 15, 21 }; + int smallUpsweepSingle[8] = {0, 1, 2, 6, 4, 9, 6, 28}; + int smallUpsweepDouble[8] = { 0, 1, 2, 6, 4, 9, 6, 22}; // upsweep across two blocks is "incomplete" + + // test upsweep on one block + cudaMemcpy(dev_small, small, 8 * sizeof(int), cudaMemcpyHostToDevice); + blockSize = dim3(8, 1); + blocksPerGrid = dim3(1, 1); + block_upsweep << > >(dev_small, 8); + cudaMemcpy(results, dev_small, 8 * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = 0; i < 8; i++) { + if (smallUpsweepSingle[i] != results[i]) { + printf("one block upweep test FAIL!\n"); + return; + } + } + + // test upsweep across two blocks + cudaMemcpy(dev_small, small, 8 * sizeof(int), cudaMemcpyHostToDevice); + blockSize = dim3(4, 1); + blocksPerGrid = dim3(2, 1); + block_upsweep << > >(dev_small, 8); + cudaMemcpy(results, dev_small, 8 * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = 0; i < 8; i++) { + if (smallUpsweepDouble[i] != results[i]) { + printf("multi block upsweep test FAIL!\n"); + return; + } + } + + int smallDownsweepSingle[8] = {0, 0, 1, 3, 6, 10, 15, 21 }; + + // test downsweep on one block + cudaMemcpy(dev_small, smallUpsweepSingle, 8 * sizeof(int), cudaMemcpyHostToDevice); + blockSize = dim3(8, 1); + blocksPerGrid = dim3(1, 1); + block_downsweep << > >(dev_small, 8); + cudaMemcpy(results, dev_small, 8 * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = 0; i < 8; i++) { + if (smallDownsweepSingle[i] != results[i]) { + printf("one block downsweep test FAIL!\n"); + return; + } + } + + // test scan on one block + cudaMemcpy(dev_small, small, 8 * sizeof(int), cudaMemcpyHostToDevice); + blockSize = dim3(8, 1); + blocksPerGrid = dim3(1, 1); + block_upsweep << > >(dev_small, 8); + block_downsweep << > >(dev_small, 8); + cudaMemcpy(results, dev_small, 8 * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = 0; i < 8; i++) { + if (smallScan[i] != results[i]) { + printf("one block scan test FAIL!\n"); + return; + } + } + + + // test accumulate + int *dev_values; + int *dev_maxes; + cudaMalloc(&dev_values, 8 * sizeof(int)); + cudaMalloc(&dev_maxes, 8 * sizeof(int)); + cudaMemcpy(dev_values, small, 8 * sizeof(int), cudaMemcpyHostToDevice); + + // test for a block width that divides the data evenly + accumulate_ends_of_segments << > >(dev_values, 8, dev_maxes, 4); + cudaMemcpy(results, dev_maxes, 8 * sizeof(int), cudaMemcpyDeviceToHost); + int maxesSegWidth4[2] = {3, 7}; + for (int i = 0; i < 2; i++) { + if (results[i] != maxesSegWidth4[i]) { + printf("accumulate test on even block width FAIL!\n"); + return; + } + } + + // test for a block width that divides the data unevenly + accumulate_ends_of_segments << > >(dev_values, 8, dev_maxes, 3); + cudaMemcpy(results, dev_maxes, 8 * sizeof(int), cudaMemcpyDeviceToHost); + int maxesSegWidth3[3] = { 2, 5, 7 }; + for (int i = 0; i < 3; i++) { + if (results[i] != maxesSegWidth3[i]) { + printf("accumulate test on even block width FAIL!\n"); + return; + } + } + + // test back add, backAdd(int *dev_data, int data_length, int *dev_maxPerSegScan, int segWidth) { + cudaMemcpy(dev_values, small, 8 * sizeof(int), cudaMemcpyHostToDevice); + backAdd << > >(dev_values, 8, dev_maxes, 3); + int backAddedValues[8] = {2, 3, 4, 8, 9, 10, 13, 14}; + cudaMemcpy(results, dev_values, 8 * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = 0; i < 8; i++) { + if (results[i] != backAddedValues[i]) { + printf("back add test FAIL!\n"); + return; + } + } + + // test efficient scan for power of two! + int bigger[16]; + int biggerScan[16]; + for (int i = 0; i < 16; i++) { + bigger[i] = i; + } + biggerScan[0] = 0; + for (int i = 1; i < 16; i++) { + biggerScan[i] = biggerScan[i - 1] + bigger[i]; + } + + int *dev_data; + cudaMalloc(&dev_data, 16 * sizeof(int)); + cudaMemcpy(dev_data, bigger, 16 * sizeof(int), cudaMemcpyHostToDevice); + memoryEfficientInclusiveScan(16, dev_data); + cudaMemcpy(bigger, dev_data, 16 * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = 0; i < 16; i++) { + if (bigger[i] != biggerScan[i]) { + printf("power of two efficient scan test FAIL!\n"); + return; + } + } + + // test for non power of two + int biggerNP2[27]; + int biggerScanNP2[27]; + for (int i = 0; i < 27; i++) { + biggerNP2[i] = i; + } + biggerScanNP2[0] = 0; + for (int i = 1; i < 27; i++) { + biggerScanNP2[i] = biggerScanNP2[i - 1] + biggerNP2[i]; + } + + int *dev_dataNP2; + cudaMalloc(&dev_dataNP2, 27 * sizeof(int)); + cudaMemcpy(dev_dataNP2, biggerNP2, 27 * sizeof(int), cudaMemcpyHostToDevice); + memoryEfficientInclusiveScan(27, dev_dataNP2); + cudaMemcpy(biggerNP2, dev_dataNP2, 27 * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = 0; i < 27; i++) { + if (biggerNP2[i] != biggerScanNP2[i]) { + printf("non power of two efficient scan test FAIL!\n"); + return; + } + } + + printf("appears that all tests pass.\n"); + cudaFree(dev_small); + cudaFree(dev_values); + cudaFree(dev_maxes); + cudaFree(dev_data); + cudaFree(dev_dataNP2); +} + +void memoryEfficientInclusiveScan(int n, int *dev_data) { + // break up into blocks. + + //int peek0[3]; + //int peek1[24]; + //int peek2[3]; + + int numBlocks = ((n + DEVICE_SHARED_MEMORY - 1) / DEVICE_SHARED_MEMORY); + int* dev_accumulation; + cudaMalloc(&dev_accumulation, numBlocks * sizeof(int)); + + // run scan on each block (upsweep downsweep) + dim3 blockSize(DEVICE_SHARED_MEMORY, 1); + dim3 blocksPerGrid(numBlocks, 1); + + accumulate_ends_of_segments << > >(dev_data, n, + dev_accumulation, DEVICE_SHARED_MEMORY); + + block_upsweep << > >(dev_data, n); + block_downsweep_inclusive << > >(dev_data, dev_accumulation, n); + + // accumulate block sums into an array of sums. + accumulate_ends_of_segments << > >(dev_data, n, + dev_accumulation, DEVICE_SHARED_MEMORY); + //cudaMemcpy(peek0, dev_accumulation, 3 * sizeof(int), cudaMemcpyDeviceToHost); + + // scan block sums to compute block increments. if it's too big for one block, recurse (omg) + if (numBlocks > DEVICE_SHARED_MEMORY) { + memoryEfficientInclusiveScan(numBlocks, dev_accumulation); + // make this exclusive. Less memory access than making this return exclusive. + cudaMemcpy(dev_accumulation + 1, dev_accumulation, (numBlocks - 1) * sizeof(int), cudaMemcpyDeviceToDevice); + cudaMemset(dev_accumulation, 0, sizeof(int)); + } + else { + dim3 oneblockPerGrid(1, 1); + block_upsweep << > >(dev_accumulation, numBlocks); + block_downsweep << > >(dev_accumulation, numBlocks); + } + //cudaMemcpy(peek1, dev_data, 24 * sizeof(int), cudaMemcpyDeviceToHost); + //cudaMemcpy(peek2, dev_accumulation, 3 * sizeof(int), cudaMemcpyDeviceToHost); + //printf("derp\n"); + + // add block increments to each element in the corresponding block. + backAdd << > >(dev_data, n, dev_accumulation, DEVICE_SHARED_MEMORY); + + // free and return! + cudaFree(dev_accumulation); +} + +} +} diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h new file mode 100644 index 0000000..8b877d9 --- /dev/null +++ b/stream_compaction/efficient.h @@ -0,0 +1,16 @@ +#pragma once +#define DEVICE_SHARED_MEMORY 8 + +namespace StreamCompaction { +namespace Efficient { + void scan(int n, int *odata, const int *idata); + + void up_sweep_down_sweep(int n, int *dev_data, int blocksPerGrid, int blockSize); + + int compact(int n, int *odata, const int *idata); + + void scan_components_test(); + + void memoryEfficientInclusiveScan(int n, int *dev_data); +} +} diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu new file mode 100644 index 0000000..430d658 --- /dev/null +++ b/stream_compaction/naive.cu @@ -0,0 +1,99 @@ +#include +#include +#include "common.h" +#include "naive.h" + +namespace StreamCompaction { +namespace Naive { + +cudaEvent_t start, stop; + +static void setup_timer_events() { + cudaEventCreate(&start); + cudaEventCreate(&stop); + + cudaEventRecord(start); +} + +static float teardown_timer_events() { + cudaEventRecord(stop); + + cudaEventSynchronize(stop); + float milliseconds = 0; + cudaEventElapsedTime(&milliseconds, start, stop); + + cudaEventDestroy(start); + cudaEventDestroy(stop); + + return milliseconds; +} + +// TODO: __global__ + +__global__ void naive_scan_step(int offset, int *x_1, int *x_2) { + int i = threadIdx.x + (blockIdx.x * blockDim.x); + if (i >= offset) { + x_2[i] = x_1[i - offset] + x_1[i]; + } + else { + x_2[i] = x_1[i]; + } +} + +/** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ +void scan(int n, int *odata, const int *idata) { + // copy everything in idata over to the GPU + cudaDeviceProp deviceProp; + cudaGetDeviceProperties(&deviceProp, 0); + int tpb = deviceProp.maxThreadsPerBlock; + int blockWidth = fmin(n, tpb); + int blocks = 1; + if (blockWidth != n) { + blocks = n / tpb; + if (n % tpb) { + blocks++; + } + } + + dim3 dimBlock(blockWidth); + dim3 dimGrid(blocks); + + int *dev_x; + int *dev_x_next; + cudaMalloc((void**)&dev_x, sizeof(int) * n); + cudaMalloc((void**)&dev_x_next, sizeof(int) * n); + + cudaMemcpy(dev_x, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + cudaMemcpy(dev_x_next, dev_x, sizeof(int) * n, cudaMemcpyDeviceToDevice); + + if (BENCHMARK) { + setup_timer_events(); + } + + // run steps. + // no need to pad with 0s to get a power of 2 array here, + // this can be an "unbalanced" binary tree of ops. + int logn = ilog2ceil(n); + for (int d = 1; d <= logn; d++) { + int offset = powf(2, d - 1); + naive_scan_step <<>>(offset, dev_x, dev_x_next); + int *temp = dev_x_next; + dev_x_next = dev_x; + dev_x = temp; + } + if (BENCHMARK) { + printf("%f microseconds.\n", + teardown_timer_events() * 1000.0f); + } + + cudaMemcpy(odata + 1, dev_x, sizeof(int) * (n - 1), cudaMemcpyDeviceToHost); + odata[0] = 0; + + cudaFree(dev_x); + cudaFree(dev_x_next); +} + +} +} diff --git a/stream_compaction/naive.h b/stream_compaction/naive.h new file mode 100644 index 0000000..21152d6 --- /dev/null +++ b/stream_compaction/naive.h @@ -0,0 +1,7 @@ +#pragma once + +namespace StreamCompaction { +namespace Naive { + void scan(int n, int *odata, const int *idata); +} +} diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu new file mode 100644 index 0000000..4ae5746 --- /dev/null +++ b/stream_compaction/thrust.cu @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include "common.h" +#include "thrust.h" + +namespace StreamCompaction { +namespace Thrust { + +cudaEvent_t start, stop; + +static void setup_timer_events() { + cudaEventCreate(&start); + cudaEventCreate(&stop); + + cudaEventRecord(start); +} + +static float teardown_timer_events() { + cudaEventRecord(stop); + + cudaEventSynchronize(stop); + float milliseconds = 0; + cudaEventElapsedTime(&milliseconds, start, stop); + + cudaEventDestroy(start); + cudaEventDestroy(stop); + + return milliseconds; +} + +/** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ +void scan(int n, int *odata, const int *idata) { + // use `thrust::exclusive_scan` + // example: for device_vectors dv_in and dv_out: + // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + + // Create a thrust::device_vector from a thrust::host_vector + thrust::host_vector v_in(idata, idata + n); + thrust::device_vector device_v_in(v_in); + thrust::device_vector device_v_out(n); + + thrust::exclusive_scan(device_v_in.begin(), device_v_in.end(), + device_v_out.begin()); + + // copy back over + for (int i = 0; i < n; i++) { + odata[i] = device_v_out[i]; + } +} + +} +} diff --git a/stream_compaction/thrust.h b/stream_compaction/thrust.h new file mode 100644 index 0000000..06707f3 --- /dev/null +++ b/stream_compaction/thrust.h @@ -0,0 +1,7 @@ +#pragma once + +namespace StreamCompaction { +namespace Thrust { + void scan(int n, int *odata, const int *idata); +} +}