diff --git a/.gitignore b/.gitignore index b98dc456f..daf19e569 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ build_debug/ misc/file2c/file2cpp # Editor and OS things +.idea/ imgui.ini .DS_Store .vscode diff --git a/.gitmodules b/.gitmodules index e96caf6d9..e383fd4b3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,14 +1,7 @@ -[submodule "deps/glfw"] - path = deps/glfw - url = https://github.com/glfw/glfw.git - branch = master -[submodule "deps/imgui/imgui"] - path = deps/imgui/imgui - url = https://github.com/ocornut/imgui.git - branch = master [submodule "deps/happly"] path = deps/happly url = https://github.com/nmwsharp/happly.git -[submodule "deps/glm"] - path = deps/glm - url = https://github.com/g-truc/glm.git + +[submodule "deps/geometry-central"] + path = deps/geometry-central + url = https://github.com/tx-code/geometry-central.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 77dc97b95..0b4a258b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,18 +2,29 @@ cmake_minimum_required(VERSION 3.5...3.22) project(polyscope) -### Policy settings -cmake_policy(SET CMP0054 NEW) # don't implicitly dereference inside if() +# ## Policy settings +cmake_policy(SET CMP0054 NEW) # don't implicitly dereference inside if() -## Project options +# # Project options # Backend set(POLYSCOPE_BACKEND_OPENGL3_GLFW "ON" CACHE BOOL "Enable openGL3_glfw backend") set(POLYSCOPE_BACKEND_OPENGL_MOCK "ON" CACHE BOOL "Enable openGL_mock backend") set(POLYSCOPE_BACKEND_OPENGL3_EGL "AUTO" CACHE STRING "Enable openGL3_egl backend") # 'AUTO' means "if we're on linux and EGL.h is available" -### Do anything needed for dependencies and bring their stuff in to scope +# ## Do anything needed for dependencies and bring their stuff in to scope add_subdirectory(deps) -### Add things for this project +# ## Add things for this project add_subdirectory(src) + +add_subdirectory(deps/geometry-central) + +set(BUILD_EXAMPLES "ON" CACHE BOOL "BUILD Examples") + +if(BUILD_EXAMPLES) + add_subdirectory(examples/demo-app) + add_subdirectory(examples/navigating-intrinsic-triangulations-demo) + add_subdirectory(examples/signed-heat-demo) + add_subdirectory(examples/stripe-patterns-demo) +endif() \ No newline at end of file diff --git a/CMakeUserPresets.json b/CMakeUserPresets.json new file mode 100644 index 000000000..851a34751 --- /dev/null +++ b/CMakeUserPresets.json @@ -0,0 +1,60 @@ +{ + "version": 3, + "cmakeMinimumRequired": { + "major": 3, + "minor": 14, + "patch": 0 + }, + "configurePresets": [ + { + "name": "default", + "displayName": "Default Config", + "description": "Default build using Ninja", + "generator": "Ninja", + "architecture": { + "value": "x64", + "strategy": "external" + }, + "binaryDir": "${sourceDir}/build", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "F:/Dev/vcpkg/scripts/buildsystems/vcpkg.cmake", + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/install", + "VCPKG_TARGET_TRIPLET": "x64-windows", + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe" + } + }, + { + "name": "release", + "displayName": "Release Config", + "description": "Release build configuration", + "inherits": "default", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + } + ], + "buildPresets": [ + { + "name": "default", + "configurePreset": "default", + "configuration": "Debug" + }, + { + "name": "release", + "configurePreset": "release", + "configuration": "Release" + } + ], + "testPresets": [ + { + "name": "default", + "configurePreset": "default", + "configuration": "Debug", + "output": { + "outputOnFailure": true + } + } + ] +} \ No newline at end of file diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index d7bded020..a53d5b739 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -1,43 +1,18 @@ if("${POLYSCOPE_BACKEND_OPENGL3_GLFW}") + # # Glad + find_package(Glad REQUIRED) - ## Glad - if(NOT TARGET glad) - add_subdirectory(glad) - endif() - - ## GLFW - if(NOT TARGET glfw) - set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) - set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) - set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) - set(GLFW_INSTALL OFF CACHE BOOL "" FORCE) - add_subdirectory(glfw) - endif() -endif() - -## glm -if(NOT TARGET glm::glm) - add_subdirectory(glm) - target_compile_definitions(glm INTERFACE GLM_ENABLE_EXPERIMENTAL) - set_target_properties(glm PROPERTIES LINKER_LANGUAGE CXX) + # # GLFW + find_package(glfw3 REQUIRED) endif() -## Imgui -if(NOT TARGET imgui) - add_subdirectory(imgui) -endif() +# # Imgui +find_package(imgui REQUIRED) -## Json -if(NOT TARGET nlohmann_json::nlohmann_json) - add_subdirectory(json) -endif() - -## MarchingCube +# # MarchingCube if(NOT TARGET MarchingCube::MarchingCube) add_subdirectory(MarchingCubeCpp) endif() -## stb -if(NOT TARGET stb) - add_subdirectory(stb) -endif() +# # stb +find_package(stb REQUIRED) \ No newline at end of file diff --git a/deps/args/LICENSE b/deps/args/LICENSE deleted file mode 100755 index 56f069072..000000000 --- a/deps/args/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) 2016-2017 Taylor C. Richberger and Pavel Belikov - - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deps/args/README.md b/deps/args/README.md deleted file mode 100755 index f3a35d8c2..000000000 --- a/deps/args/README.md +++ /dev/null @@ -1,1111 +0,0 @@ -# args - -#### Note that this library is essentially in maintenance mode. I haven't had the time to work on it or give it the love that it deserves. I'm not adding new features, but I will fix bugs. I will also very gladly accept pull requests. - -[![Cpp Standard](https://img.shields.io/badge/C%2B%2B-11-blue.svg)](https://en.wikipedia.org/wiki/C%2B%2B11) -[![Travis status](https://travis-ci.org/Taywee/args.svg?branch=master)](https://travis-ci.org/Taywee/args) -[![AppVeyor status](https://ci.appveyor.com/api/projects/status/nlnlmpttdjlndyc2?svg=true)](https://ci.appveyor.com/project/Taywee/args) -[![Coverage Status](https://coveralls.io/repos/github/Taywee/args/badge.svg?branch=master)](https://coveralls.io/github/Taywee/args?branch=master) -[![Read the Docs](https://img.shields.io/readthedocs/pip.svg)](https://taywee.github.io/args) - -A simple, small, flexible, single-header C++11 argument parsing library, in -fewer than 2K lines of code. - -This is designed to appear somewhat similar to Python's argparse, but in C++, -with static type checking, and hopefully a lot faster (also allowing fully -nestable group logic, where Python's argparse does not). - -UTF-8 support is limited at best. No normalization is performed, so non-ascii -characters are very best kept out of flags, and combined glyphs are probably -going to mess up help output if you use them. Most UTF-8 necessary for -internationalization should work for most cases, though heavily combinatory UTF -alphabets may wreak havoc. - -This program is MIT-licensed, so you can use the header as-is with no -restrictions. I'd appreciate attribution in a README, Man page, or something if -you are feeling generous, but all that's required is that you don't remove the -license and my name from the header of the args.hxx file in source -redistributions (ie. don't pretend that you wrote it). I do welcome additions -and updates wherever you feel like contributing code. - -The API documentation can be found at https://taywee.github.io/args - -The code can be downloaded at https://github.com/Taywee/args - -There are also somewhat extensive examples below. - -You can find the complete test cases at -https://github.com/Taywee/args/blob/master/test.cxx, which should very well -describe the usage, as it's built to push the boundaries. - -# What does it do? - -It: - -* Lets you handle flags, flag+value, and positional arguments simply and - elegently, with the full help of static typechecking. -* Allows you to use your own types in a pretty simple way. -* Lets you use count flags, and lists of all argument-accepting types. -* Allows full validation of groups of required arguments, though output isn't - pretty when something fails group validation. User validation functions are - accepted. Groups are fully nestable. -* Generates pretty help for you, with some good tweakable parameters. -* Lets you customize all prefixes and most separators, allowing you to create - an infinite number of different argument syntaxes -* Lets you parse, by default, any type that has a stream extractor operator for - it. If this doesn't work for your uses, you can supply a function and parse - the string yourself if you like. -* Lets you decide not to allow separate-argument value flags or joined ones - (like disallowing `--foo bar`, requiring `--foo=bar`, or the inverse, or the - same for short options). -* Allows you to create subparsers, to reuse arguments for multiple commands and - to refactor your command's logic to a function or lambda -* Allows one value flag to take a specific number of values (like `--foo first - second`, where --foo slurps both arguments). -* Allows you to have value flags only optionally accept values - -# What does it not do? - -There are tons of things this library does not do! - -## It will not ever: - -* Allow you to intermix multiple different prefix types (eg. `++foo` and - `--foo` in the same parser), though shortopt and longopt prefixes can be - different. -* Allow you to make flags sensitive to order (like gnu find), or make them - sensitive to relative ordering with positionals. The only orderings that are - order-sensitive are: - * Positionals relative to one-another - * List positionals or flag values to each of their own respective items -* Allow you to use a positional list before any other positionals (the last - argument list will slurp all subsequent positional arguments). The logic for - allowing this would be a lot more code than I'd like, and would make static - checking much more difficult, requiring us to sort std::string arguments and - pair them to positional arguments before assigning them, rather than what we - currently do, which is assiging them as we go for better simplicity and - speed. The library doesn't stop you from trying, but the first positional - list will slurp in all following positionals - -# How do I install it? - -```shell -sudo make install -``` - -Or, to install it somewhere special (default is `/usr/local`): - -```shell -sudo make install DESTDIR=/opt/mydir -``` - -You can also copy the file into your source tree, if you want to be absolutely -sure you keep a stable API between projects. - -## I also want man pages. - -```shell -make doc/man -sudo make installman -``` - -This requires Doxygen - -## I want the doxygen documentation locally - -```shell -doxygen Doxyfile -``` - -Your docs are now in doc/html - -# How do I use it? - -Create an ArgumentParser, modify its attributes to fit your needs, add -arguments through regular argument objects (or create your own), and match them -with an args::Matcher object (check its construction details in the doxygen -documentation. - -Then you can either call it with args::ArgumentParser::ParseCLI for the full -command line with program name, or args::ArgumentParser::ParseArgs with -just the arguments to be parsed. The argument and group variables can then be -interpreted as a boolean to see if they've been matched. - -All variables can be pulled (including the boolean match status for regular -args::Flag variables) with args::get. - -# Group validation is weird. How do I get more helpful output for failed validation? - -This is unfortunately not possible, given the power of the groups available. -For instance, if you have a group validation that works like -`(A && B) || (C && (D XOR E))`, how is this library going to be able to -determine what exactly when wrong when it fails? It only knows that the -entire expression evaluated false, not specifically what the user did wrong -(and this is doubled over by the fact that validation operations are ordinary -functions without any special meaning to the library). As you are the only one -who understands the logic of your program, if you want useful group messages, -you have to catch the ValidationError as a special case and check your own -groups and spit out messages accordingly. - -# Is it developed with regression tests? - -Yes. tests.cxx in the git repository has a set of standard tests (which are -still relatively small in number, but I would welcome some expansion here), and -thanks to Travis CI and AppVeyor, these tests run with every single push: - -```shell -% make runtests -g++ test.cxx -o test.o -I. -std=c++11 -O2 -c -MMD -g++ -o test test.o -std=c++11 -O2 -./test -=============================================================================== -All tests passed (74 assertions in 15 test cases) - -% -``` - -The testing library used is [Catch](https://github.com/philsquared/Catch). - -# Examples - -All the code examples here will be complete code examples, with some output. - -## Simple example: - -```cpp -#include -#include -int main(int argc, char **argv) -{ - args::ArgumentParser parser("This is a test program.", "This goes after the options."); - args::HelpFlag help(parser, "help", "Display this help menu", {'h', "help"}); - try - { - parser.ParseCLI(argc, argv); - } - catch (args::Help) - { - std::cout << parser; - return 0; - } - catch (args::ParseError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - return 0; -} -``` - -```shell - % ./test - % ./test -h - ./test {OPTIONS} - - This is a test program. - - OPTIONS: - - -h, --help Display this help menu - - This goes after the options. - % -``` - -## Boolean flags, special group types, different matcher construction: - -```cpp -#include -#include -int main(int argc, char **argv) -{ - args::ArgumentParser parser("This is a test program.", "This goes after the options."); - args::Group group(parser, "This group is all exclusive:", args::Group::Validators::Xor); - args::Flag foo(group, "foo", "The foo flag", {'f', "foo"}); - args::Flag bar(group, "bar", "The bar flag", {'b'}); - args::Flag baz(group, "baz", "The baz flag", {"baz"}); - try - { - parser.ParseCLI(argc, argv); - } - catch (args::Help) - { - std::cout << parser; - return 0; - } - catch (args::ParseError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - catch (args::ValidationError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - if (foo) { std::cout << "foo" << std::endl; } - if (bar) { std::cout << "bar" << std::endl; } - if (baz) { std::cout << "baz" << std::endl; } - return 0; -} -``` - -```shell - % ./test -Group validation failed somewhere! - ./test {OPTIONS} - - This is a test program. - - OPTIONS: - - This group is all exclusive: - -f, --foo The foo flag - -b The bar flag - --baz The baz flag - - This goes after the options. - % ./test -f -foo - % ./test --foo -foo - % ./test --foo -f -foo - % ./test -b -bar - % ./test --baz -baz - % ./test --baz -f -Group validation failed somewhere! - ./test {OPTIONS} - - This is a test program. -... - % ./test --baz -fb -Group validation failed somewhere! - ./test {OPTIONS} -... - % -``` - -## Argument flags, Positional arguments, lists - -```cpp -#include -#include -int main(int argc, char **argv) -{ - args::ArgumentParser parser("This is a test program.", "This goes after the options."); - args::HelpFlag help(parser, "help", "Display this help menu", {'h', "help"}); - args::ValueFlag integer(parser, "integer", "The integer flag", {'i'}); - args::ValueFlagList characters(parser, "characters", "The character flag", {'c'}); - args::Positional foo(parser, "foo", "The foo position"); - args::PositionalList numbers(parser, "numbers", "The numbers position list"); - try - { - parser.ParseCLI(argc, argv); - } - catch (args::Help) - { - std::cout << parser; - return 0; - } - catch (args::ParseError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - catch (args::ValidationError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - if (integer) { std::cout << "i: " << args::get(integer) << std::endl; } - if (characters) { for (const auto ch: args::get(characters)) { std::cout << "c: " << ch << std::endl; } } - if (foo) { std::cout << "f: " << args::get(foo) << std::endl; } - if (numbers) { for (const auto nm: args::get(numbers)) { std::cout << "n: " << nm << std::endl; } } - return 0; -} -``` - -```shell -% ./test -h - ./test {OPTIONS} [foo] [numbers...] - - This is a test program. - - OPTIONS: - - -h, --help Display this help menu - -i integer The integer flag - -c characters The character flag - foo The foo position - numbers The numbers position list - "--" can be used to terminate flag options and force all following - arguments to be treated as positional options - - This goes after the options. - % ./test -i 5 -i: 5 - % ./test -i 5.2 -Argument 'integer' received invalid value type '5.2' - ./test {OPTIONS} [foo] [numbers...] - % ./test -c 1 -c 2 -c 3 -c: 1 -c: 2 -c: 3 - % - % ./test 1 2 3 4 5 6 7 8 9 -f: 1 -n: 2 -n: 3 -n: 4 -n: 5 -n: 6 -n: 7 -n: 8 -n: 9 - % ./test 1 2 3 4 5 6 7 8 9 a -Argument 'numbers' received invalid value type 'a' - ./test {OPTIONS} [foo] [numbers...] - - This is a test program. -... -``` - -## Commands - -```cpp -#include -#include -int main(int argc, char **argv) -{ - args::ArgumentParser p("git-like parser"); - args::Group commands(p, "commands"); - args::Command add(commands, "add", "add file contents to the index"); - args::Command commit(commands, "commit", "record changes to the repository"); - args::Group arguments(p, "arguments", args::Group::Validators::DontCare, args::Options::Global); - args::ValueFlag gitdir(arguments, "path", "", {"git-dir"}); - args::HelpFlag h(arguments, "help", "help", {'h', "help"}); - args::PositionalList pathsList(arguments, "paths", "files to commit"); - - try - { - p.ParseCLI(argc, argv); - if (add) - { - std::cout << "Add"; - } - else - { - std::cout << "Commit"; - } - - for (auto &&path : pathsList) - { - std::cout << ' ' << path; - } - - std::cout << std::endl; - } - catch (args::Help) - { - std::cout << p; - } - catch (args::Error& e) - { - std::cerr << e.what() << std::endl << p; - return 1; - } - return 0; -} -``` - -```shell -% ./test -h - ./test COMMAND [paths...] {OPTIONS} - - git-like parser - - OPTIONS: - - commands - add add file contents to the index - commit record changes to the repository - arguments - --git-dir=[path] - -h, --help help - paths... files - "--" can be used to terminate flag options and force all following - arguments to be treated as positional options - -% ./test add 1 2 -Add 1 2 -``` - -## Refactoring commands - -```cpp -#include -#include "args.hxx" - -args::Group arguments("arguments"); -args::ValueFlag gitdir(arguments, "path", "", {"git-dir"}); -args::HelpFlag h(arguments, "help", "help", {'h', "help"}); -args::PositionalList pathsList(arguments, "paths", "files to commit"); - -void CommitCommand(args::Subparser &parser) -{ - args::ValueFlag message(parser, "MESSAGE", "commit message", {'m'}); - parser.Parse(); - - std::cout << "Commit"; - - for (auto &&path : pathsList) - { - std::cout << ' ' << path; - } - - std::cout << std::endl; - - if (message) - { - std::cout << "message: " << args::get(message) << std::endl; - } -} - -int main(int argc, const char **argv) -{ - args::ArgumentParser p("git-like parser"); - args::Group commands(p, "commands"); - args::Command add(commands, "add", "add file contents to the index", [&](args::Subparser &parser) - { - parser.Parse(); - std::cout << "Add"; - - for (auto &&path : pathsList) - { - std::cout << ' ' << path; - } - - std::cout << std::endl; - }); - - args::Command commit(commands, "commit", "record changes to the repository", &CommitCommand); - args::GlobalOptions globals(p, arguments); - - try - { - p.ParseCLI(argc, argv); - } - catch (args::Help) - { - std::cout << p; - } - catch (args::Error& e) - { - std::cerr << e.what() << std::endl << p; - return 1; - } - return 0; -} -``` - -```shell -% ./test -h - ./test COMMAND [paths...] {OPTIONS} - - git-like parser - - OPTIONS: - - commands - add add file contents to the index - commit record changes to the repository - arguments - --git-dir=[path] - -h, --help help - paths... files - "--" can be used to terminate flag options and force all following - arguments to be treated as positional options - -% ./test add 1 2 -Add 1 2 - -% ./test commit -m "my commit message" 1 2 -Commit 1 2 -message: my commit message -``` - -# Custom type parsers (here we use std::tuple) - -```cpp -#include -#include - -std::istream& operator>>(std::istream& is, std::tuple& ints) -{ - is >> std::get<0>(ints); - is.get(); - is >> std::get<1>(ints); - return is; -} - -#include - -struct DoublesReader -{ - void operator()(const std::string &name, const std::string &value, std::tuple &destination) - { - size_t commapos = 0; - std::get<0>(destination) = std::stod(value, &commapos); - std::get<1>(destination) = std::stod(std::string(value, commapos + 1)); - } -}; - -int main(int argc, char **argv) -{ - args::ArgumentParser parser("This is a test program."); - args::Positional> ints(parser, "INTS", "This takes a pair of integers."); - args::Positional, DoublesReader> doubles(parser, "DOUBLES", "This takes a pair of doubles."); - try - { - parser.ParseCLI(argc, argv); - } - catch (args::Help) - { - std::cout << parser; - return 0; - } - catch (args::ParseError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - if (ints) - { - std::cout << "ints found: " << std::get<0>(args::get(ints)) << " and " << std::get<1>(args::get(ints)) << std::endl; - } - if (doubles) - { - std::cout << "doubles found: " << std::get<0>(args::get(doubles)) << " and " << std::get<1>(args::get(doubles)) << std::endl; - } - return 0; -} -``` - -```shell - % ./test -h -Argument could not be matched: 'h' - ./test [INTS] [DOUBLES] - - This is a test program. - - OPTIONS: - - INTS This takes a pair of integers. - DOUBLES This takes a pair of doubles. - - % ./test 5 -ints found: 5 and 0 - % ./test 5,8 -ints found: 5 and 8 - % ./test 5,8 2.4,8 -ints found: 5 and 8 -doubles found: 2.4 and 8 - % ./test 5,8 2.4, -terminate called after throwing an instance of 'std::invalid_argument' - what(): stod -zsh: abort ./test 5,8 2.4, - % ./test 5,8 2.4 -terminate called after throwing an instance of 'std::out_of_range' - what(): basic_string::basic_string: __pos (which is 4) > this->size() (which is 3) -zsh: abort ./test 5,8 2.4 - % ./test 5,8 2.4-7 -ints found: 5 and 8 -doubles found: 2.4 and 7 - % ./test 5,8 2.4,-7 -ints found: 5 and 8 -doubles found: 2.4 and -7 -``` - -As you can see, with your own types, validation can get a little weird. Make -sure to check and throw a parsing error (or whatever error you want to catch) -if you can't fully deduce your type. The built-in validator will only throw if -there are unextracted characters left in the stream. - -## Long descriptions and proper wrapping and listing - -```cpp -#include -#include -int main(int argc, char **argv) -{ - args::ArgumentParser parser("This is a test program with a really long description that is probably going to have to be wrapped across multiple different lines. This is a test to see how the line wrapping works", "This goes after the options. This epilog is also long enough that it will have to be properly wrapped to display correctly on the screen"); - args::HelpFlag help(parser, "HELP", "Show this help menu.", {'h', "help"}); - args::ValueFlag foo(parser, "FOO", "The foo flag.", {'a', 'b', 'c', "a", "b", "c", "the-foo-flag"}); - args::ValueFlag bar(parser, "BAR", "The bar flag. This one has a lot of options, and will need wrapping in the description, along with its long flag list.", {'d', 'e', 'f', "d", "e", "f"}); - args::ValueFlag baz(parser, "FOO", "The baz flag. This one has a lot of options, and will need wrapping in the description, even with its short flag list.", {"baz"}); - args::Positional pos1(parser, "POS1", "The pos1 argument."); - args::PositionalList poslist1(parser, "POSLIST1", "The poslist1 argument."); - args::Positional pos2(parser, "POS2", "The pos2 argument."); - args::PositionalList poslist2(parser, "POSLIST2", "The poslist2 argument."); - args::Positional pos3(parser, "POS3", "The pos3 argument."); - args::PositionalList poslist3(parser, "POSLIST3", "The poslist3 argument."); - args::Positional pos4(parser, "POS4", "The pos4 argument."); - args::PositionalList poslist4(parser, "POSLIST4", "The poslist4 argument."); - args::Positional pos5(parser, "POS5", "The pos5 argument."); - args::PositionalList poslist5(parser, "POSLIST5", "The poslist5 argument."); - args::Positional pos6(parser, "POS6", "The pos6 argument."); - args::PositionalList poslist6(parser, "POSLIST6", "The poslist6 argument."); - args::Positional pos7(parser, "POS7", "The pos7 argument."); - args::PositionalList poslist7(parser, "POSLIST7", "The poslist7 argument."); - args::Positional pos8(parser, "POS8", "The pos8 argument."); - args::PositionalList poslist8(parser, "POSLIST8", "The poslist8 argument."); - args::Positional pos9(parser, "POS9", "The pos9 argument."); - args::PositionalList poslist9(parser, "POSLIST9", "The poslist9 argument."); - try - { - parser.ParseCLI(argc, argv); - } - catch (args::Help) - { - std::cout << parser; - return 0; - } - catch (args::ParseError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - catch (args::ValidationError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - return 0; -} -``` - -```shell - % ./test -h - ./test {OPTIONS} [POS1] [POSLIST1...] [POS2] [POSLIST2...] [POS3] - [POSLIST3...] [POS4] [POSLIST4...] [POS5] [POSLIST5...] [POS6] - [POSLIST6...] [POS7] [POSLIST7...] [POS8] [POSLIST8...] [POS9] - [POSLIST9...] - - This is a test program with a really long description that is probably going - to have to be wrapped across multiple different lines. This is a test to see - how the line wrapping works - - OPTIONS: - - -h, --help Show this help menu. - -a FOO, -b FOO, -c FOO, --a FOO, --b FOO, --c FOO, --the-foo-flag FOO - The foo flag. - -d BAR, -e BAR, -f BAR, --d BAR, --e BAR, --f BAR - The bar flag. This one has a lot of options, and will - need wrapping in the description, along with its long - flag list. - --baz FOO The baz flag. This one has a lot of options, and will - need wrapping in the description, even with its short - flag list. - POS1 The pos1 argument. - POSLIST1 The poslist1 argument. - POS2 The pos2 argument. - POSLIST2 The poslist2 argument. - POS3 The pos3 argument. - POSLIST3 The poslist3 argument. - POS4 The pos4 argument. - POSLIST4 The poslist4 argument. - POS5 The pos5 argument. - POSLIST5 The poslist5 argument. - POS6 The pos6 argument. - POSLIST6 The poslist6 argument. - POS7 The pos7 argument. - POSLIST7 The poslist7 argument. - POS8 The pos8 argument. - POSLIST8 The poslist8 argument. - POS9 The pos9 argument. - POSLIST9 The poslist9 argument. - "--" can be used to terminate flag options and force all following - arguments to be treated as positional options - - This goes after the options. This epilog is also long enough that it will - have to be properly wrapped to display correctly on the screen - % -``` - -## Customizing parser prefixes - -### dd-style - -```cpp -#include -#include -int main(int argc, char **argv) -{ - args::ArgumentParser parser("This command likes to break your disks"); - parser.LongPrefix(""); - parser.LongSeparator("="); - args::HelpFlag help(parser, "HELP", "Show this help menu.", {"help"}); - args::ValueFlag bs(parser, "BYTES", "Block size", {"bs"}, 512); - args::ValueFlag skip(parser, "BYTES", "Bytes to skip", {"skip"}, 0); - args::ValueFlag input(parser, "BLOCK SIZE", "Block size", {"if"}); - args::ValueFlag output(parser, "BLOCK SIZE", "Block size", {"of"}); - try - { - parser.ParseCLI(argc, argv); - } - catch (args::Help) - { - std::cout << parser; - return 0; - } - catch (args::ParseError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - catch (args::ValidationError e) - { - std::cerr << e.what() << std::endl; - std::cerr << parser; - return 1; - } - std::cout << "bs = " << args::get(bs) << std::endl; - std::cout << "skip = " << args::get(skip) << std::endl; - if (input) { std::cout << "if = " << args::get(input) << std::endl; } - if (output) { std::cout << "of = " << args::get(output) << std::endl; } - return 0; -} -``` - -```shell - % ./test help - ./test {OPTIONS} - - This command likes to break your disks - - OPTIONS: - - help Show this help menu. - bs=[BYTES] Block size - skip=[BYTES] Bytes to skip - if=[BLOCK SIZE] Block size - of=[BLOCK SIZE] Block size - - % ./test bs=1024 skip=7 if=/tmp/input -bs = 1024 -skip = 7 -if = /tmp/input -``` - -### Windows style - -The code is the same as above, but the two lines are replaced out: - -```cpp -parser.LongPrefix("/"); -parser.LongSeparator(":"); -``` - -```shell - % ./test /help - ./test {OPTIONS} - - This command likes to break your disks - - OPTIONS: - - /help Show this help menu. - /bs:[BYTES] Block size - /skip:[BYTES] Bytes to skip - /if:[BLOCK SIZE] Block size - /of:[BLOCK SIZE] Block size - - % ./test /bs:72 /skip:87 /if:/tmp/test.txt -bs = 72 -skip = 87 -if = /tmp/test.txt - % -``` - -## Group nesting help menu text - -```cpp -#include -#include -int main(int argc, char **argv) -{ - args::ArgumentParser parser("This is a test program.", "This goes after the options."); - args::Group xorgroup(parser, "this group provides xor validation:", args::Group::Validators::Xor); - args::Flag a(xorgroup, "a", "test flag", {'a'}); - args::Flag b(xorgroup, "b", "test flag", {'b'}); - args::Flag c(xorgroup, "c", "test flag", {'c'}); - args::Group nxor(xorgroup, "this group provides all-or-none (nxor) validation:", args::Group::Validators::AllOrNone); - args::Flag d(nxor, "d", "test flag", {'d'}); - args::Flag e(nxor, "e", "test flag", {'e'}); - args::Flag f(nxor, "f", "test flag", {'f'}); - args::Group nxor2(nxor, "this group provides all-or-none (nxor2) validation:", args::Group::Validators::AllOrNone); - args::Flag i(nxor2, "i", "test flag", {'i'}); - args::Flag j(nxor2, "j", "test flag", {'j'}); - args::Flag k(nxor2, "k", "test flag", {'k'}); - args::Group nxor3(nxor, "this group provides all-or-none (nxor3) validation:", args::Group::Validators::AllOrNone); - args::Flag l(nxor3, "l", "test flag", {'l'}); - args::Flag m(nxor3, "m", "test flag", {'m'}); - args::Flag n(nxor3, "n", "test flag", {'n'}); - args::Group atleastone(xorgroup, "this group provides at-least-one validation:", args::Group::Validators::AtLeastOne); - args::Flag g(atleastone, "g", "test flag", {'g'}); - args::Flag o(atleastone, "o", "test flag", {'o'}); - args::HelpFlag help(parser, "help", "Show this help menu", {'h', "help"}); - try - { - parser.ParseCLI(argc, argv); - } - catch (args::Help) - { - std::cout << parser; - return 0; - } - catch (args::ParseError e) - { - std::cerr << e.what() << std::endl; - parser.Help(std::cerr); - return 1; - } - catch (args::ValidationError e) - { - std::cerr << e.what() << std::endl; - parser.Help(std::cerr); - return 1; - } - return 0; -} -``` - -```shell - % /tmp/test -h - /tmp/test {OPTIONS} - - This is a test program. - - OPTIONS: - - this group provides xor validation: - -a test flag - -b test flag - -c test flag - this group provides all-or-none (nxor) validation: - -d test flag - -e test flag - -f test flag - this group provides all-or-none (nxor2) validation: - -i test flag - -j test flag - -k test flag - this group provides all-or-none (nxor3) validation: - -l test flag - -m test flag - -n test flag - this group provides at-least-one validation: - -g test flag - -o test flag - -h, --help Show this help menu - - This goes after the options. - % -``` - -# Mapping arguments - -I haven't written out a long example for this, but here's the test case you should be able to discern the meaning from: - -```cpp -bool ToLowerReader(const std::string &name, const std::string &value, std::string &destination) -{ - destination = value; - std::transform(destination.begin(), destination.end(), destination.begin(), ::tolower); - return true; -} - -TEST_CASE("Mapping types work as needed", "[args]") -{ - std::unordered_map map{ - {"default", MappingEnum::def}, - {"foo", MappingEnum::foo}, - {"bar", MappingEnum::bar}, - {"red", MappingEnum::red}, - {"yellow", MappingEnum::yellow}, - {"green", MappingEnum::green}}; - args::ArgumentParser parser("This is a test program.", "This goes after the options."); - args::MapFlag dmf(parser, "DMF", "Maps string to an enum", {"dmf"}, map); - args::MapFlag mf(parser, "MF", "Maps string to an enum", {"mf"}, map); - args::MapFlag cimf(parser, "CIMF", "Maps string to an enum case-insensitively", {"cimf"}, map); - args::MapFlagList mfl(parser, "MFL", "Maps string to an enum list", {"mfl"}, map); - args::MapPositional mp(parser, "MP", "Maps string to an enum", map); - args::MapPositionalList mpl(parser, "MPL", "Maps string to an enum list", map); - parser.ParseArgs(std::vector{"--mf=red", "--cimf=YeLLoW", "--mfl=bar", "foo", "--mfl=green", "red", "--mfl", "bar", "default"}); - REQUIRE_FALSE(dmf); - REQUIRE(args::get(dmf) == MappingEnum::def); - REQUIRE(mf); - REQUIRE(args::get(mf) == MappingEnum::red); - REQUIRE(cimf); - REQUIRE(args::get(cimf) == MappingEnum::yellow); - REQUIRE(mfl); - REQUIRE((args::get(mfl) == std::vector{MappingEnum::bar, MappingEnum::green, MappingEnum::bar})); - REQUIRE(mp); - REQUIRE((args::get(mp) == MappingEnum::foo)); - REQUIRE(mpl); - REQUIRE((args::get(mpl) == std::vector{MappingEnum::red, MappingEnum::def})); - REQUIRE_THROWS_AS(parser.ParseArgs(std::vector{"--mf=YeLLoW"}), args::MapError); -} -``` - -# How fast is it? - -This should not really be a question you ask when you are looking for an -argument-parsing library, but every test I've done shows args as being about -65% faster than TCLAP and 220% faster than boost::program_options. - -The simplest benchmark I threw together is the following one, which parses the -command line `-i 7 -c a 2.7 --char b 8.4 -c c 8.8 --char d` with a parser that -parses -i as an int, -c as a list of chars, and the positional parameters as a -list of doubles (the command line was originally much more complex, but TCLAP's -limitations made me trim it down so I could use a common command line across -all libraries. I also have to copy in the arguments list with every run, -because TCLAP permutes its argument list as it runs (and comparison would have -been unfair without comparing all about equally), but that surprisingly didn't -affect much. Also tested is pulling the arguments out, but that was fast -compared to parsing, as would be expected. - -### The run: - -```shell -% g++ -obench bench.cxx -O2 -std=c++11 -lboost_program_options -% ./bench -args seconds to run: 0.895472 -tclap seconds to run: 1.45001 -boost::program_options seconds to run: 1.98972 -% -``` - -### The benchmark: - -```cpp -#undef NDEBUG -#include -#include -#include -#include "args.hxx" -#include -#include -namespace po = boost::program_options; -using namespace std::chrono; -inline bool doubleequals(const double a, const double b) -{ - static const double delta = 0.0001; - const double diff = a - b; - return diff < delta && diff > -delta; -} -int main() -{ - const std::vector carguments({"-i", "7", "-c", "a", "2.7", "--char", "b", "8.4", "-c", "c", "8.8", "--char", "d"}); - const std::vector pcarguments({"progname", "-i", "7", "-c", "a", "2.7", "--char", "b", "8.4", "-c", "c", "8.8", "--char", "d"}); - // args - { - high_resolution_clock::time_point start = high_resolution_clock::now(); - for (unsigned int x = 0; x < 100000; ++x) - { - std::vector arguments(carguments); - args::ArgumentParser parser("This is a test program.", "This goes after the options."); - args::ValueFlag integer(parser, "integer", "The integer flag", {'i', "int"}); - args::ValueFlagList characters(parser, "characters", "The character flag", {'c', "char"}); - args::PositionalList numbers(parser, "numbers", "The numbers position list"); - parser.ParseArgs(arguments); - const int i = args::get(integer); - const std::vector c(args::get(characters)); - const std::vector n(args::get(numbers)); - assert(i == 7); - assert(c[0] == 'a'); - assert(c[1] == 'b'); - assert(c[2] == 'c'); - assert(c[3] == 'd'); - assert(doubleequals(n[0], 2.7)); - assert(doubleequals(n[1], 8.4)); - assert(doubleequals(n[2], 8.8)); - } - high_resolution_clock::duration runtime = high_resolution_clock::now() - start; - std::cout << "args seconds to run: " << duration_cast>(runtime).count() << std::endl; - } - // tclap - { - high_resolution_clock::time_point start = high_resolution_clock::now(); - for (unsigned int x = 0; x < 100000; ++x) - { - std::vector arguments(pcarguments); - TCLAP::CmdLine cmd("Command description message", ' ', "0.9"); - TCLAP::ValueArg integer("i", "int", "The integer flag", false, 0, "integer", cmd); - TCLAP::MultiArg characters("c", "char", "The character flag", false, "characters", cmd); - TCLAP::UnlabeledMultiArg numbers("numbers", "The numbers position list", false, "foo", cmd, false); - cmd.parse(arguments); - const int i = integer.getValue(); - const std::vector c(characters.getValue()); - const std::vector n(numbers.getValue()); - assert(i == 7); - assert(c[0] == 'a'); - assert(c[1] == 'b'); - assert(c[2] == 'c'); - assert(c[3] == 'd'); - assert(doubleequals(n[0], 2.7)); - assert(doubleequals(n[1], 8.4)); - assert(doubleequals(n[2], 8.8)); - } - high_resolution_clock::duration runtime = high_resolution_clock::now() - start; - std::cout << "tclap seconds to run: " << duration_cast>(runtime).count() << std::endl; - } - // boost::program_options - { - high_resolution_clock::time_point start = high_resolution_clock::now(); - for (unsigned int x = 0; x < 100000; ++x) - { - std::vector arguments(carguments); - po::options_description desc("This is a test program."); - desc.add_options() - ("int,i", po::value(), "The integer flag") - ("char,c", po::value>(), "The character flag") - ("numbers", po::value>(), "The numbers flag"); - po::positional_options_description p; - p.add("numbers", -1); - po::variables_map vm; - po::store(po::command_line_parser(carguments).options(desc).positional(p).run(), vm); - const int i = vm["int"].as(); - const std::vector c(vm["char"].as>()); - const std::vector n(vm["numbers"].as>()); - assert(i == 7); - assert(c[0] == 'a'); - assert(c[1] == 'b'); - assert(c[2] == 'c'); - assert(c[3] == 'd'); - assert(doubleequals(n[0], 2.7)); - assert(doubleequals(n[1], 8.4)); - assert(doubleequals(n[2], 8.8)); - } - high_resolution_clock::duration runtime = high_resolution_clock::now() - start; - std::cout << "boost::program_options seconds to run: " << duration_cast>(runtime).count() << std::endl; - } - return 0; -} -``` - -So, on top of being more flexible, smaller, and easier to read, it is faster -than the most common alternatives. diff --git a/deps/args/args/args.hxx b/deps/args/args/args.hxx deleted file mode 100755 index 652937d1d..000000000 --- a/deps/args/args/args.hxx +++ /dev/null @@ -1,4279 +0,0 @@ -/* Copyright (c) 2016-2017 Taylor C. Richberger and Pavel - * Belikov - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -/** \file args.hxx - * \brief this single-header lets you use all of the args functionality - * - * The important stuff is done inside the args namespace - */ - -#ifndef ARGS_HXX -#define ARGS_HXX - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef ARGS_TESTNAMESPACE -namespace argstest -{ -#else - -/** \namespace args - * \brief contains all the functionality of the args library - */ -namespace args -{ -#endif - /** Getter to grab the value from the argument type. - * - * If the Get() function of the type returns a reference, so does this, and - * the value will be modifiable. - */ - template - auto get(Option &option_) -> decltype(option_.Get()) - { - return option_.Get(); - } - - /** (INTERNAL) Count UTF-8 glyphs - * - * This is not reliable, and will fail for combinatory glyphs, but it's - * good enough here for now. - * - * \param string The string to count glyphs from - * \return The UTF-8 glyphs in the string - */ - inline std::string::size_type Glyphs(const std::string &string_) - { - std::string::size_type length = 0; - for (const char c: string_) - { - if ((c & 0xc0) != 0x80) - { - ++length; - } - } - return length; - } - - /** (INTERNAL) Wrap a vector of words into a vector of lines - * - * Empty words are skipped. Word "\n" forces wrapping. - * - * \param begin The begin iterator - * \param end The end iterator - * \param width The width of the body - * \param firstlinewidth the width of the first line, defaults to the width of the body - * \param firstlineindent the indent of the first line, defaults to 0 - * \return the vector of lines - */ - template - inline std::vector Wrap(It begin, - It end, - const std::string::size_type width, - std::string::size_type firstlinewidth = 0, - std::string::size_type firstlineindent = 0) - { - std::vector output; - std::string line(firstlineindent, ' '); - bool empty = true; - - if (firstlinewidth == 0) - { - firstlinewidth = width; - } - - auto currentwidth = firstlinewidth; - - for (auto it = begin; it != end; ++it) - { - if (it->empty()) - { - continue; - } - - if (*it == "\n") - { - if (!empty) - { - output.push_back(line); - line.clear(); - empty = true; - currentwidth = width; - } - - continue; - } - - auto itemsize = Glyphs(*it); - if ((line.length() + 1 + itemsize) > currentwidth) - { - if (!empty) - { - output.push_back(line); - line.clear(); - empty = true; - currentwidth = width; - } - } - - if (itemsize > 0) - { - if (!empty) - { - line += ' '; - } - - line += *it; - empty = false; - } - } - - if (!empty) - { - output.push_back(line); - } - - return output; - } - - namespace detail - { - template - std::string Join(const T& array, const std::string &delimiter) - { - std::string res; - for (auto &element : array) - { - if (!res.empty()) - { - res += delimiter; - } - - res += element; - } - - return res; - } - } - - /** (INTERNAL) Wrap a string into a vector of lines - * - * This is quick and hacky, but works well enough. You can specify a - * different width for the first line - * - * \param width The width of the body - * \param firstlinewid the width of the first line, defaults to the width of the body - * \return the vector of lines - */ - inline std::vector Wrap(const std::string &in, const std::string::size_type width, std::string::size_type firstlinewidth = 0) - { - // Preserve existing line breaks - const auto newlineloc = in.find('\n'); - if (newlineloc != in.npos) - { - auto first = Wrap(std::string(in, 0, newlineloc), width); - auto second = Wrap(std::string(in, newlineloc + 1), width); - first.insert( - std::end(first), - std::make_move_iterator(std::begin(second)), - std::make_move_iterator(std::end(second))); - return first; - } - - std::istringstream stream(in); - std::string::size_type indent = 0; - - for (char c : in) - { - if (!isspace(c)) - { - break; - } - ++indent; - } - - return Wrap(std::istream_iterator(stream), std::istream_iterator(), - width, firstlinewidth, indent); - } - -#ifdef ARGS_NOEXCEPT - /// Error class, for when ARGS_NOEXCEPT is defined - enum class Error - { - None, - Usage, - Parse, - Validation, - Required, - Map, - Extra, - Help, - Subparser, - Completion, - }; -#else - /** Base error class - */ - class Error : public std::runtime_error - { - public: - Error(const std::string &problem) : std::runtime_error(problem) {} - virtual ~Error() {} - }; - - /** Errors that occur during usage - */ - class UsageError : public Error - { - public: - UsageError(const std::string &problem) : Error(problem) {} - virtual ~UsageError() {} - }; - - /** Errors that occur during regular parsing - */ - class ParseError : public Error - { - public: - ParseError(const std::string &problem) : Error(problem) {} - virtual ~ParseError() {} - }; - - /** Errors that are detected from group validation after parsing finishes - */ - class ValidationError : public Error - { - public: - ValidationError(const std::string &problem) : Error(problem) {} - virtual ~ValidationError() {} - }; - - /** Errors that when a required flag is omitted - */ - class RequiredError : public ValidationError - { - public: - RequiredError(const std::string &problem) : ValidationError(problem) {} - virtual ~RequiredError() {} - }; - - /** Errors in map lookups - */ - class MapError : public ParseError - { - public: - MapError(const std::string &problem) : ParseError(problem) {} - virtual ~MapError() {} - }; - - /** Error that occurs when a singular flag is specified multiple times - */ - class ExtraError : public ParseError - { - public: - ExtraError(const std::string &problem) : ParseError(problem) {} - virtual ~ExtraError() {} - }; - - /** An exception that indicates that the user has requested help - */ - class Help : public Error - { - public: - Help(const std::string &flag) : Error(flag) {} - virtual ~Help() {} - }; - - /** (INTERNAL) An exception that emulates coroutine-like control flow for subparsers. - */ - class SubparserError : public Error - { - public: - SubparserError() : Error("") {} - virtual ~SubparserError() {} - }; - - /** An exception that contains autocompletion reply - */ - class Completion : public Error - { - public: - Completion(const std::string &flag) : Error(flag) {} - virtual ~Completion() {} - }; -#endif - - /** A simple unified option type for unified initializer lists for the Matcher class. - */ - struct EitherFlag - { - const bool isShort; - const char shortFlag; - const std::string longFlag; - EitherFlag(const std::string &flag) : isShort(false), shortFlag(), longFlag(flag) {} - EitherFlag(const char *flag) : isShort(false), shortFlag(), longFlag(flag) {} - EitherFlag(const char flag) : isShort(true), shortFlag(flag), longFlag() {} - - /** Get just the long flags from an initializer list of EitherFlags - */ - static std::unordered_set GetLong(std::initializer_list flags) - { - std::unordered_set longFlags; - for (const EitherFlag &flag: flags) - { - if (!flag.isShort) - { - longFlags.insert(flag.longFlag); - } - } - return longFlags; - } - - /** Get just the short flags from an initializer list of EitherFlags - */ - static std::unordered_set GetShort(std::initializer_list flags) - { - std::unordered_set shortFlags; - for (const EitherFlag &flag: flags) - { - if (flag.isShort) - { - shortFlags.insert(flag.shortFlag); - } - } - return shortFlags; - } - - std::string str() const - { - return isShort ? std::string(1, shortFlag) : longFlag; - } - - std::string str(const std::string &shortPrefix, const std::string &longPrefix) const - { - return isShort ? shortPrefix + std::string(1, shortFlag) : longPrefix + longFlag; - } - }; - - - - /** A class of "matchers", specifying short and flags that can possibly be - * matched. - * - * This is supposed to be constructed and then passed in, not used directly - * from user code. - */ - class Matcher - { - private: - const std::unordered_set shortFlags; - const std::unordered_set longFlags; - - public: - /** Specify short and long flags separately as iterators - * - * ex: `args::Matcher(shortFlags.begin(), shortFlags.end(), longFlags.begin(), longFlags.end())` - */ - template - Matcher(ShortIt shortFlagsStart, ShortIt shortFlagsEnd, LongIt longFlagsStart, LongIt longFlagsEnd) : - shortFlags(shortFlagsStart, shortFlagsEnd), - longFlags(longFlagsStart, longFlagsEnd) - { - if (shortFlags.empty() && longFlags.empty()) - { -#ifndef ARGS_NOEXCEPT - throw UsageError("empty Matcher"); -#endif - } - } - -#ifdef ARGS_NOEXCEPT - /// Only for ARGS_NOEXCEPT - Error GetError() const noexcept - { - return shortFlags.empty() && longFlags.empty() ? Error::Usage : Error::None; - } -#endif - - /** Specify short and long flags separately as iterables - * - * ex: `args::Matcher(shortFlags, longFlags)` - */ - template - Matcher(Short &&shortIn, Long &&longIn) : - Matcher(std::begin(shortIn), std::end(shortIn), std::begin(longIn), std::end(longIn)) - {} - - /** Specify a mixed single initializer-list of both short and long flags - * - * This is the fancy one. It takes a single initializer list of - * any number of any mixed kinds of flags. Chars are - * automatically interpreted as short flags, and strings are - * automatically interpreted as long flags: - * - * args::Matcher{'a'} - * args::Matcher{"foo"} - * args::Matcher{'h', "help"} - * args::Matcher{"foo", 'f', 'F', "FoO"} - */ - Matcher(std::initializer_list in) : - Matcher(EitherFlag::GetShort(in), EitherFlag::GetLong(in)) {} - - Matcher(Matcher &&other) : shortFlags(std::move(other.shortFlags)), longFlags(std::move(other.longFlags)) - {} - - ~Matcher() {} - - /** (INTERNAL) Check if there is a match of a short flag - */ - bool Match(const char flag) const - { - return shortFlags.find(flag) != shortFlags.end(); - } - - /** (INTERNAL) Check if there is a match of a long flag - */ - bool Match(const std::string &flag) const - { - return longFlags.find(flag) != longFlags.end(); - } - - /** (INTERNAL) Check if there is a match of a flag - */ - bool Match(const EitherFlag &flag) const - { - return flag.isShort ? Match(flag.shortFlag) : Match(flag.longFlag); - } - - /** (INTERNAL) Get all flag strings as a vector, with the prefixes embedded - */ - std::vector GetFlagStrings() const - { - std::vector flagStrings; - flagStrings.reserve(shortFlags.size() + longFlags.size()); - for (const char flag: shortFlags) - { - flagStrings.emplace_back(flag); - } - for (const std::string &flag: longFlags) - { - flagStrings.emplace_back(flag); - } - return flagStrings; - } - - /** (INTERNAL) Get long flag if it exists or any short flag - */ - EitherFlag GetLongOrAny() const - { - if (!longFlags.empty()) - { - return *longFlags.begin(); - } - - if (!shortFlags.empty()) - { - return *shortFlags.begin(); - } - - // should be unreachable - return ' '; - } - - /** (INTERNAL) Get short flag if it exists or any long flag - */ - EitherFlag GetShortOrAny() const - { - if (!shortFlags.empty()) - { - return *shortFlags.begin(); - } - - if (!longFlags.empty()) - { - return *longFlags.begin(); - } - - // should be unreachable - return ' '; - } - }; - - /** Attributes for flags. - */ - enum class Options - { - /** Default options. - */ - None = 0x0, - - /** Flag can't be passed multiple times. - */ - Single = 0x01, - - /** Flag can't be omitted. - */ - Required = 0x02, - - /** Flag is excluded from usage line. - */ - HiddenFromUsage = 0x04, - - /** Flag is excluded from options help. - */ - HiddenFromDescription = 0x08, - - /** Flag is global and can be used in any subcommand. - */ - Global = 0x10, - - /** Flag stops a parser. - */ - KickOut = 0x20, - - /** Flag is excluded from auto completion. - */ - HiddenFromCompletion = 0x40, - - /** Flag is excluded from options help and usage line - */ - Hidden = HiddenFromUsage | HiddenFromDescription | HiddenFromCompletion, - }; - - inline Options operator | (Options lhs, Options rhs) - { - return static_cast(static_cast(lhs) | static_cast(rhs)); - } - - inline Options operator & (Options lhs, Options rhs) - { - return static_cast(static_cast(lhs) & static_cast(rhs)); - } - - class FlagBase; - class PositionalBase; - class Command; - class ArgumentParser; - - /** A simple structure of parameters for easy user-modifyable help menus - */ - struct HelpParams - { - /** The width of the help menu - */ - unsigned int width = 80; - /** The indent of the program line - */ - unsigned int progindent = 2; - /** The indent of the program trailing lines for long parameters - */ - unsigned int progtailindent = 4; - /** The indent of the description and epilogs - */ - unsigned int descriptionindent = 4; - /** The indent of the flags - */ - unsigned int flagindent = 6; - /** The indent of the flag descriptions - */ - unsigned int helpindent = 40; - /** The additional indent each group adds - */ - unsigned int eachgroupindent = 2; - - /** The minimum gutter between each flag and its help - */ - unsigned int gutter = 1; - - /** Show the terminator when both options and positional parameters are present - */ - bool showTerminator = true; - - /** Show the {OPTIONS} on the prog line when this is true - */ - bool showProglineOptions = true; - - /** Show the positionals on the prog line when this is true - */ - bool showProglinePositionals = true; - - /** The prefix for short flags - */ - std::string shortPrefix; - - /** The prefix for long flags - */ - std::string longPrefix; - - /** The separator for short flags - */ - std::string shortSeparator; - - /** The separator for long flags - */ - std::string longSeparator; - - /** The program name for help generation - */ - std::string programName; - - /** Show command's flags - */ - bool showCommandChildren = false; - - /** Show command's descriptions and epilog - */ - bool showCommandFullHelp = false; - - /** The postfix for progline when showProglineOptions is true and command has any flags - */ - std::string proglineOptions = "{OPTIONS}"; - - /** The prefix for progline when command has any subcommands - */ - std::string proglineCommand = "COMMAND"; - - /** The prefix for progline value - */ - std::string proglineValueOpen = " <"; - - /** The postfix for progline value - */ - std::string proglineValueClose = ">"; - - /** The prefix for progline required argument - */ - std::string proglineRequiredOpen = ""; - - /** The postfix for progline required argument - */ - std::string proglineRequiredClose = ""; - - /** The prefix for progline non-required argument - */ - std::string proglineNonrequiredOpen = "["; - - /** The postfix for progline non-required argument - */ - std::string proglineNonrequiredClose = "]"; - - /** Show flags in program line - */ - bool proglineShowFlags = false; - - /** Use short flags in program lines when possible - */ - bool proglinePreferShortFlags = false; - - /** Program line prefix - */ - std::string usageString; - - /** String shown in help before flags descriptions - */ - std::string optionsString = "OPTIONS:"; - - /** Display value name after all the long and short flags - */ - bool useValueNameOnce = false; - - /** Show value name - */ - bool showValueName = true; - - /** Add newline before flag description - */ - bool addNewlineBeforeDescription = false; - - /** The prefix for option value - */ - std::string valueOpen = "["; - - /** The postfix for option value - */ - std::string valueClose = "]"; - - /** Add choices to argument description - */ - bool addChoices = false; - - /** The prefix for choices - */ - std::string choiceString = "\nOne of: "; - - /** Add default values to argument description - */ - bool addDefault = false; - - /** The prefix for default values - */ - std::string defaultString = "\nDefault: "; - }; - - /** A number of arguments which can be consumed by an option. - * - * Represents a closed interval [min, max]. - */ - struct Nargs - { - const size_t min; - const size_t max; - - Nargs(size_t min_, size_t max_) : min{min_}, max{max_} - { -#ifndef ARGS_NOEXCEPT - if (max < min) - { - throw UsageError("Nargs: max > min"); - } -#endif - } - - Nargs(size_t num_) : min{num_}, max{num_} - { - } - - friend bool operator == (const Nargs &lhs, const Nargs &rhs) - { - return lhs.min == rhs.min && lhs.max == rhs.max; - } - - friend bool operator != (const Nargs &lhs, const Nargs &rhs) - { - return !(lhs == rhs); - } - }; - - /** Base class for all match types - */ - class Base - { - private: - Options options = {}; - - protected: - bool matched = false; - const std::string help; -#ifdef ARGS_NOEXCEPT - /// Only for ARGS_NOEXCEPT - mutable Error error = Error::None; - mutable std::string errorMsg; -#endif - - public: - Base(const std::string &help_, Options options_ = {}) : options(options_), help(help_) {} - virtual ~Base() {} - - Options GetOptions() const noexcept - { - return options; - } - - bool IsRequired() const noexcept - { - return (GetOptions() & Options::Required) != Options::None; - } - - virtual bool Matched() const noexcept - { - return matched; - } - - virtual void Validate(const std::string &, const std::string &) const - { - } - - operator bool() const noexcept - { - return Matched(); - } - - virtual std::vector> GetDescription(const HelpParams &, const unsigned indentLevel) const - { - std::tuple description; - std::get<1>(description) = help; - std::get<2>(description) = indentLevel; - return { std::move(description) }; - } - - virtual std::vector GetCommands() - { - return {}; - } - - virtual bool IsGroup() const - { - return false; - } - - virtual FlagBase *Match(const EitherFlag &) - { - return nullptr; - } - - virtual PositionalBase *GetNextPositional() - { - return nullptr; - } - - virtual std::vector GetAllFlags() - { - return {}; - } - - virtual bool HasFlag() const - { - return false; - } - - virtual bool HasPositional() const - { - return false; - } - - virtual bool HasCommand() const - { - return false; - } - - virtual std::vector GetProgramLine(const HelpParams &) const - { - return {}; - } - - /// Sets a kick-out value for building subparsers - void KickOut(bool kickout_) noexcept - { - if (kickout_) - { - options = options | Options::KickOut; - } - else - { - options = static_cast(static_cast(options) & ~static_cast(Options::KickOut)); - } - } - - /// Gets the kick-out value for building subparsers - bool KickOut() const noexcept - { - return (options & Options::KickOut) != Options::None; - } - - virtual void Reset() noexcept - { - matched = false; -#ifdef ARGS_NOEXCEPT - error = Error::None; - errorMsg.clear(); -#endif - } - -#ifdef ARGS_NOEXCEPT - /// Only for ARGS_NOEXCEPT - virtual Error GetError() const - { - return error; - } - - /// Only for ARGS_NOEXCEPT - std::string GetErrorMsg() const - { - return errorMsg; - } -#endif - }; - - /** Base class for all match types that have a name - */ - class NamedBase : public Base - { - protected: - const std::string name; - bool kickout = false; - std::string defaultString; - bool defaultStringManual = false; - std::vector choicesStrings; - bool choicesStringManual = false; - - virtual std::string GetDefaultString(const HelpParams&) const { return {}; } - - virtual std::vector GetChoicesStrings(const HelpParams&) const { return {}; } - - virtual std::string GetNameString(const HelpParams&) const { return Name(); } - - void AddDescriptionPostfix(std::string &dest, const bool isManual, const std::string &manual, bool isGenerated, const std::string &generated, const std::string &str) const - { - if (isManual && !manual.empty()) - { - dest += str; - dest += manual; - } - else if (!isManual && isGenerated && !generated.empty()) - { - dest += str; - dest += generated; - } - } - - public: - NamedBase(const std::string &name_, const std::string &help_, Options options_ = {}) : Base(help_, options_), name(name_) {} - virtual ~NamedBase() {} - - /** Sets default value string that will be added to argument description. - * Use empty string to disable it for this argument. - */ - void HelpDefault(const std::string &str) - { - defaultStringManual = true; - defaultString = str; - } - - /** Gets default value string that will be added to argument description. - */ - std::string HelpDefault(const HelpParams ¶ms) const - { - return defaultStringManual ? defaultString : GetDefaultString(params); - } - - /** Sets choices strings that will be added to argument description. - * Use empty vector to disable it for this argument. - */ - void HelpChoices(const std::vector &array) - { - choicesStringManual = true; - choicesStrings = array; - } - - /** Gets choices strings that will be added to argument description. - */ - std::vector HelpChoices(const HelpParams ¶ms) const - { - return choicesStringManual ? choicesStrings : GetChoicesStrings(params); - } - - virtual std::vector> GetDescription(const HelpParams ¶ms, const unsigned indentLevel) const override - { - std::tuple description; - std::get<0>(description) = GetNameString(params); - std::get<1>(description) = help; - std::get<2>(description) = indentLevel; - - AddDescriptionPostfix(std::get<1>(description), choicesStringManual, detail::Join(choicesStrings, ", "), params.addChoices, detail::Join(GetChoicesStrings(params), ", "), params.choiceString); - AddDescriptionPostfix(std::get<1>(description), defaultStringManual, defaultString, params.addDefault, GetDefaultString(params), params.defaultString); - - return { std::move(description) }; - } - - virtual std::string Name() const - { - return name; - } - }; - - namespace detail - { - template - struct IsConvertableToString : std::false_type {}; - - template - struct IsConvertableToString() << std::declval(), int())> : std::true_type {}; - - template - typename std::enable_if::value, std::string>::type - ToString(const T &value) - { - std::ostringstream s; - s << value; - return s.str(); - } - - template - typename std::enable_if::value, std::string>::type - ToString(const T &) - { - return {}; - } - - template - std::vector MapKeysToStrings(const T &map) - { - std::vector res; - using K = typename std::decayfirst)>::type; - if (IsConvertableToString::value) - { - for (const auto &p : map) - { - res.push_back(detail::ToString(p.first)); - } - - std::sort(res.begin(), res.end()); - } - return res; - } - } - - /** Base class for all flag options - */ - class FlagBase : public NamedBase - { - protected: - const Matcher matcher; - - virtual std::string GetNameString(const HelpParams ¶ms) const override - { - const std::string postfix = !params.showValueName || NumberOfArguments() == 0 ? std::string() : Name(); - std::string flags; - const auto flagStrings = matcher.GetFlagStrings(); - const bool useValueNameOnce = flagStrings.size() == 1 ? false : params.useValueNameOnce; - for (auto it = flagStrings.begin(); it != flagStrings.end(); ++it) - { - auto &flag = *it; - if (it != flagStrings.begin()) - { - flags += ", "; - } - - flags += flag.isShort ? params.shortPrefix : params.longPrefix; - flags += flag.str(); - - if (!postfix.empty() && (!useValueNameOnce || it + 1 == flagStrings.end())) - { - flags += flag.isShort ? params.shortSeparator : params.longSeparator; - flags += params.valueOpen + postfix + params.valueClose; - } - } - - return flags; - } - - public: - FlagBase(const std::string &name_, const std::string &help_, Matcher &&matcher_, const bool extraError_ = false) : NamedBase(name_, help_, extraError_ ? Options::Single : Options()), matcher(std::move(matcher_)) {} - - FlagBase(const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_) : NamedBase(name_, help_, options_), matcher(std::move(matcher_)) {} - - virtual ~FlagBase() {} - - virtual FlagBase *Match(const EitherFlag &flag) override - { - if (matcher.Match(flag)) - { - if ((GetOptions() & Options::Single) != Options::None && matched) - { - std::ostringstream problem; - problem << "Flag '" << flag.str() << "' was passed multiple times, but is only allowed to be passed once"; -#ifdef ARGS_NOEXCEPT - error = Error::Extra; - errorMsg = problem.str(); -#else - throw ExtraError(problem.str()); -#endif - } - matched = true; - return this; - } - return nullptr; - } - - virtual std::vector GetAllFlags() override - { - return { this }; - } - - const Matcher &GetMatcher() const - { - return matcher; - } - - virtual void Validate(const std::string &shortPrefix, const std::string &longPrefix) const override - { - if (!Matched() && IsRequired()) - { - std::ostringstream problem; - problem << "Flag '" << matcher.GetLongOrAny().str(shortPrefix, longPrefix) << "' is required"; -#ifdef ARGS_NOEXCEPT - error = Error::Required; - errorMsg = problem.str(); -#else - throw RequiredError(problem.str()); -#endif - } - } - - virtual std::vector GetProgramLine(const HelpParams ¶ms) const override - { - if (!params.proglineShowFlags) - { - return {}; - } - - const std::string postfix = NumberOfArguments() == 0 ? std::string() : Name(); - const EitherFlag flag = params.proglinePreferShortFlags ? matcher.GetShortOrAny() : matcher.GetLongOrAny(); - std::string res = flag.str(params.shortPrefix, params.longPrefix); - if (!postfix.empty()) - { - res += params.proglineValueOpen + postfix + params.proglineValueClose; - } - - return { IsRequired() ? params.proglineRequiredOpen + res + params.proglineRequiredClose - : params.proglineNonrequiredOpen + res + params.proglineNonrequiredClose }; - } - - virtual bool HasFlag() const override - { - return true; - } - -#ifdef ARGS_NOEXCEPT - /// Only for ARGS_NOEXCEPT - virtual Error GetError() const override - { - const auto nargs = NumberOfArguments(); - if (nargs.min > nargs.max) - { - return Error::Usage; - } - - const auto matcherError = matcher.GetError(); - if (matcherError != Error::None) - { - return matcherError; - } - - return error; - } -#endif - - /** Defines how many values can be consumed by this option. - * - * \return closed interval [min, max] - */ - virtual Nargs NumberOfArguments() const noexcept = 0; - - /** Parse values of this option. - * - * \param value Vector of values. It's size must be in NumberOfArguments() interval. - */ - virtual void ParseValue(const std::vector &value) = 0; - }; - - /** Base class for value-accepting flag options - */ - class ValueFlagBase : public FlagBase - { - public: - ValueFlagBase(const std::string &name_, const std::string &help_, Matcher &&matcher_, const bool extraError_ = false) : FlagBase(name_, help_, std::move(matcher_), extraError_) {} - ValueFlagBase(const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_) : FlagBase(name_, help_, std::move(matcher_), options_) {} - virtual ~ValueFlagBase() {} - - virtual Nargs NumberOfArguments() const noexcept override - { - return 1; - } - }; - - class CompletionFlag : public ValueFlagBase - { - public: - std::vector reply; - size_t cword = 0; - std::string syntax; - - template - CompletionFlag(GroupClass &group_, Matcher &&matcher_): ValueFlagBase("completion", "completion flag", std::move(matcher_), Options::Hidden) - { - group_.AddCompletion(*this); - } - - virtual ~CompletionFlag() {} - - virtual Nargs NumberOfArguments() const noexcept override - { - return 2; - } - - virtual void ParseValue(const std::vector &value_) override - { - syntax = value_.at(0); - std::istringstream(value_.at(1)) >> cword; - } - - /** Get the completion reply - */ - std::string Get() noexcept - { - return detail::Join(reply, "\n"); - } - - virtual void Reset() noexcept override - { - ValueFlagBase::Reset(); - cword = 0; - syntax.clear(); - reply.clear(); - } - }; - - - /** Base class for positional options - */ - class PositionalBase : public NamedBase - { - protected: - bool ready; - - public: - PositionalBase(const std::string &name_, const std::string &help_, Options options_ = {}) : NamedBase(name_, help_, options_), ready(true) {} - virtual ~PositionalBase() {} - - bool Ready() - { - return ready; - } - - virtual void ParseValue(const std::string &value_) = 0; - - virtual void Reset() noexcept override - { - matched = false; - ready = true; -#ifdef ARGS_NOEXCEPT - error = Error::None; - errorMsg.clear(); -#endif - } - - virtual PositionalBase *GetNextPositional() override - { - return Ready() ? this : nullptr; - } - - virtual bool HasPositional() const override - { - return true; - } - - virtual std::vector GetProgramLine(const HelpParams ¶ms) const override - { - return { IsRequired() ? params.proglineRequiredOpen + Name() + params.proglineRequiredClose - : params.proglineNonrequiredOpen + Name() + params.proglineNonrequiredClose }; - } - - virtual void Validate(const std::string &, const std::string &) const override - { - if (IsRequired() && !Matched()) - { - std::ostringstream problem; - problem << "Option '" << Name() << "' is required"; -#ifdef ARGS_NOEXCEPT - error = Error::Required; - errorMsg = problem.str(); -#else - throw RequiredError(problem.str()); -#endif - } - } - }; - - /** Class for all kinds of validating groups, including ArgumentParser - */ - class Group : public Base - { - private: - std::vector children; - std::function validator; - - public: - /** Default validators - */ - struct Validators - { - static bool Xor(const Group &group) - { - return group.MatchedChildren() == 1; - } - - static bool AtLeastOne(const Group &group) - { - return group.MatchedChildren() >= 1; - } - - static bool AtMostOne(const Group &group) - { - return group.MatchedChildren() <= 1; - } - - static bool All(const Group &group) - { - return group.Children().size() == group.MatchedChildren(); - } - - static bool AllOrNone(const Group &group) - { - return (All(group) || None(group)); - } - - static bool AllChildGroups(const Group &group) - { - return std::none_of(std::begin(group.Children()), std::end(group.Children()), [](const Base* child) -> bool { - return child->IsGroup() && !child->Matched(); - }); - } - - static bool DontCare(const Group &) - { - return true; - } - - static bool CareTooMuch(const Group &) - { - return false; - } - - static bool None(const Group &group) - { - return group.MatchedChildren() == 0; - } - }; - /// If help is empty, this group will not be printed in help output - Group(const std::string &help_ = std::string(), const std::function &validator_ = Validators::DontCare, Options options_ = {}) : Base(help_, options_), validator(validator_) {} - /// If help is empty, this group will not be printed in help output - Group(Group &group_, const std::string &help_ = std::string(), const std::function &validator_ = Validators::DontCare, Options options_ = {}) : Base(help_, options_), validator(validator_) - { - group_.Add(*this); - } - virtual ~Group() {} - - /** Append a child to this Group. - */ - void Add(Base &child) - { - children.emplace_back(&child); - } - - /** Get all this group's children - */ - const std::vector &Children() const - { - return children; - } - - /** Return the first FlagBase that matches flag, or nullptr - * - * \param flag The flag with prefixes stripped - * \return the first matching FlagBase pointer, or nullptr if there is no match - */ - virtual FlagBase *Match(const EitherFlag &flag) override - { - for (Base *child: Children()) - { - if (FlagBase *match = child->Match(flag)) - { - return match; - } - } - return nullptr; - } - - virtual std::vector GetAllFlags() override - { - std::vector res; - for (Base *child: Children()) - { - auto childRes = child->GetAllFlags(); - res.insert(res.end(), childRes.begin(), childRes.end()); - } - return res; - } - - virtual void Validate(const std::string &shortPrefix, const std::string &longPrefix) const override - { - for (Base *child: Children()) - { - child->Validate(shortPrefix, longPrefix); - } - } - - /** Get the next ready positional, or nullptr if there is none - * - * \return the first ready PositionalBase pointer, or nullptr if there is no match - */ - virtual PositionalBase *GetNextPositional() override - { - for (Base *child: Children()) - { - if (auto next = child->GetNextPositional()) - { - return next; - } - } - return nullptr; - } - - /** Get whether this has any FlagBase children - * - * \return Whether or not there are any FlagBase children - */ - virtual bool HasFlag() const override - { - return std::any_of(Children().begin(), Children().end(), [](Base *child) { return child->HasFlag(); }); - } - - /** Get whether this has any PositionalBase children - * - * \return Whether or not there are any PositionalBase children - */ - virtual bool HasPositional() const override - { - return std::any_of(Children().begin(), Children().end(), [](Base *child) { return child->HasPositional(); }); - } - - /** Get whether this has any Command children - * - * \return Whether or not there are any Command children - */ - virtual bool HasCommand() const override - { - return std::any_of(Children().begin(), Children().end(), [](Base *child) { return child->HasCommand(); }); - } - - /** Count the number of matched children this group has - */ - std::vector::size_type MatchedChildren() const - { - // Cast to avoid warnings from -Wsign-conversion - return static_cast::size_type>( - std::count_if(std::begin(Children()), std::end(Children()), [](const Base *child){return child->Matched();})); - } - - /** Whether or not this group matches validation - */ - virtual bool Matched() const noexcept override - { - return validator(*this); - } - - /** Get validation - */ - bool Get() const - { - return Matched(); - } - - /** Get all the child descriptions for help generation - */ - virtual std::vector> GetDescription(const HelpParams ¶ms, const unsigned int indent) const override - { - std::vector> descriptions; - - // Push that group description on the back if not empty - unsigned addindent = 0; - if (!help.empty()) - { - descriptions.emplace_back(help, "", indent); - addindent = 1; - } - - for (Base *child: Children()) - { - if ((child->GetOptions() & Options::HiddenFromDescription) != Options::None) - { - continue; - } - - auto groupDescriptions = child->GetDescription(params, indent + addindent); - descriptions.insert( - std::end(descriptions), - std::make_move_iterator(std::begin(groupDescriptions)), - std::make_move_iterator(std::end(groupDescriptions))); - } - return descriptions; - } - - /** Get the names of positional parameters - */ - virtual std::vector GetProgramLine(const HelpParams ¶ms) const override - { - std::vector names; - for (Base *child: Children()) - { - if ((child->GetOptions() & Options::HiddenFromUsage) != Options::None) - { - continue; - } - - auto groupNames = child->GetProgramLine(params); - names.insert( - std::end(names), - std::make_move_iterator(std::begin(groupNames)), - std::make_move_iterator(std::end(groupNames))); - } - return names; - } - - virtual std::vector GetCommands() override - { - std::vector res; - for (const auto &child : Children()) - { - auto subparsers = child->GetCommands(); - res.insert(std::end(res), std::begin(subparsers), std::end(subparsers)); - } - return res; - } - - virtual bool IsGroup() const override - { - return true; - } - - virtual void Reset() noexcept override - { - Base::Reset(); - - for (auto &child: Children()) - { - child->Reset(); - } -#ifdef ARGS_NOEXCEPT - error = Error::None; - errorMsg.clear(); -#endif - } - -#ifdef ARGS_NOEXCEPT - /// Only for ARGS_NOEXCEPT - virtual Error GetError() const override - { - if (error != Error::None) - { - return error; - } - - auto it = std::find_if(Children().begin(), Children().end(), [](const Base *child){return child->GetError() != Error::None;}); - if (it == Children().end()) - { - return Error::None; - } else - { - return (*it)->GetError(); - } - } -#endif - - }; - - /** Class for using global options in ArgumentParser. - */ - class GlobalOptions : public Group - { - public: - GlobalOptions(Group &base, Base &options_) : Group(base, {}, Group::Validators::DontCare, Options::Global) - { - Add(options_); - } - }; - - /** Utility class for building subparsers with coroutines/callbacks. - * - * Brief example: - * \code - * Command command(argumentParser, "command", "my command", [](args::Subparser &s) - * { - * // your command flags/positionals - * s.Parse(); //required - * //your command code - * }); - * \endcode - * - * For ARGS_NOEXCEPT mode don't forget to check `s.GetError()` after `s.Parse()` - * and return if it isn't equals to args::Error::None. - * - * \sa Command - */ - class Subparser : public Group - { - private: - std::vector args; - std::vector kicked; - ArgumentParser *parser = nullptr; - const HelpParams &helpParams; - const Command &command; - bool isParsed = false; - - public: - Subparser(std::vector args_, ArgumentParser &parser_, const Command &command_, const HelpParams &helpParams_) - : Group({}, Validators::AllChildGroups), args(std::move(args_)), parser(&parser_), helpParams(helpParams_), command(command_) - { - } - - Subparser(const Command &command_, const HelpParams &helpParams_) : Group({}, Validators::AllChildGroups), helpParams(helpParams_), command(command_) - { - } - - Subparser(const Subparser&) = delete; - Subparser(Subparser&&) = delete; - Subparser &operator = (const Subparser&) = delete; - Subparser &operator = (Subparser&&) = delete; - - const Command &GetCommand() - { - return command; - } - - /** (INTERNAL) Determines whether Parse was called or not. - */ - bool IsParsed() const - { - return isParsed; - } - - /** Continue parsing arguments for new command. - */ - void Parse(); - - /** Returns a vector of kicked out arguments. - * - * \sa Base::KickOut - */ - const std::vector &KickedOut() const noexcept - { - return kicked; - } - }; - - /** Main class for building subparsers. - * - * /sa Subparser - */ - class Command : public Group - { - private: - friend class Subparser; - - std::string name; - std::string help; - std::string description; - std::string epilog; - std::string proglinePostfix; - - std::function parserCoroutine; - bool commandIsRequired = true; - Command *selectedCommand = nullptr; - - mutable std::vector> subparserDescription; - mutable std::vector subparserProgramLine; - mutable bool subparserHasFlag = false; - mutable bool subparserHasPositional = false; - mutable bool subparserHasCommand = false; -#ifdef ARGS_NOEXCEPT - mutable Error subparserError = Error::None; -#endif - mutable Subparser *subparser = nullptr; - - protected: - - class RaiiSubparser - { - public: - RaiiSubparser(ArgumentParser &parser_, std::vector args_); - RaiiSubparser(const Command &command_, const HelpParams ¶ms_); - - ~RaiiSubparser() - { - command.subparser = oldSubparser; - } - - Subparser &Parser() - { - return parser; - } - - private: - const Command &command; - Subparser parser; - Subparser *oldSubparser; - }; - - Command() = default; - - std::function &GetCoroutine() - { - return selectedCommand != nullptr ? selectedCommand->GetCoroutine() : parserCoroutine; - } - - Command &SelectedCommand() - { - Command *res = this; - while (res->selectedCommand != nullptr) - { - res = res->selectedCommand; - } - - return *res; - } - - const Command &SelectedCommand() const - { - const Command *res = this; - while (res->selectedCommand != nullptr) - { - res = res->selectedCommand; - } - - return *res; - } - - void UpdateSubparserHelp(const HelpParams ¶ms) const - { - if (parserCoroutine) - { - RaiiSubparser coro(*this, params); -#ifndef ARGS_NOEXCEPT - try - { - parserCoroutine(coro.Parser()); - } - catch (args::SubparserError&) - { - } -#else - parserCoroutine(coro.Parser()); -#endif - } - } - - public: - Command(Group &base_, std::string name_, std::string help_, std::function coroutine_ = {}) - : name(std::move(name_)), help(std::move(help_)), parserCoroutine(std::move(coroutine_)) - { - base_.Add(*this); - } - - /** The description that appears on the prog line after options - */ - const std::string &ProglinePostfix() const - { return proglinePostfix; } - - /** The description that appears on the prog line after options - */ - void ProglinePostfix(const std::string &proglinePostfix_) - { this->proglinePostfix = proglinePostfix_; } - - /** The description that appears above options - */ - const std::string &Description() const - { return description; } - /** The description that appears above options - */ - - void Description(const std::string &description_) - { this->description = description_; } - - /** The description that appears below options - */ - const std::string &Epilog() const - { return epilog; } - - /** The description that appears below options - */ - void Epilog(const std::string &epilog_) - { this->epilog = epilog_; } - - /** The name of command - */ - const std::string &Name() const - { return name; } - - /** The description of command - */ - const std::string &Help() const - { return help; } - - /** If value is true, parser will fail if no command was parsed. - * - * Default: true. - */ - void RequireCommand(bool value) - { commandIsRequired = value; } - - virtual bool IsGroup() const override - { return false; } - - virtual bool Matched() const noexcept override - { return Base::Matched(); } - - operator bool() const noexcept - { return Matched(); } - - void Match() noexcept - { matched = true; } - - void SelectCommand(Command *c) noexcept - { - selectedCommand = c; - - if (c != nullptr) - { - c->Match(); - } - } - - virtual FlagBase *Match(const EitherFlag &flag) override - { - if (selectedCommand != nullptr) - { - if (auto *res = selectedCommand->Match(flag)) - { - return res; - } - - for (auto *child: Children()) - { - if ((child->GetOptions() & Options::Global) != Options::None) - { - if (auto *res = child->Match(flag)) - { - return res; - } - } - } - - return nullptr; - } - - if (subparser != nullptr) - { - return subparser->Match(flag); - } - - return Matched() ? Group::Match(flag) : nullptr; - } - - virtual std::vector GetAllFlags() override - { - std::vector res; - - if (!Matched()) - { - return res; - } - - for (auto *child: Children()) - { - if (selectedCommand == nullptr || (child->GetOptions() & Options::Global) != Options::None) - { - auto childFlags = child->GetAllFlags(); - res.insert(res.end(), childFlags.begin(), childFlags.end()); - } - } - - if (selectedCommand != nullptr) - { - auto childFlags = selectedCommand->GetAllFlags(); - res.insert(res.end(), childFlags.begin(), childFlags.end()); - } - - if (subparser != nullptr) - { - auto childFlags = subparser->GetAllFlags(); - res.insert(res.end(), childFlags.begin(), childFlags.end()); - } - - return res; - } - - virtual PositionalBase *GetNextPositional() override - { - if (selectedCommand != nullptr) - { - if (auto *res = selectedCommand->GetNextPositional()) - { - return res; - } - - for (auto *child: Children()) - { - if ((child->GetOptions() & Options::Global) != Options::None) - { - if (auto *res = child->GetNextPositional()) - { - return res; - } - } - } - - return nullptr; - } - - if (subparser != nullptr) - { - return subparser->GetNextPositional(); - } - - return Matched() ? Group::GetNextPositional() : nullptr; - } - - virtual bool HasFlag() const override - { - return subparserHasFlag || Group::HasFlag(); - } - - virtual bool HasPositional() const override - { - return subparserHasPositional || Group::HasPositional(); - } - - virtual bool HasCommand() const override - { - return true; - } - - std::vector GetCommandProgramLine(const HelpParams ¶ms) const - { - UpdateSubparserHelp(params); - - auto res = Group::GetProgramLine(params); - res.insert(res.end(), subparserProgramLine.begin(), subparserProgramLine.end()); - - if (!params.proglineCommand.empty() && (Group::HasCommand() || subparserHasCommand)) - { - res.insert(res.begin(), commandIsRequired ? params.proglineCommand : "[" + params.proglineCommand + "]"); - } - - if (!Name().empty()) - { - res.insert(res.begin(), Name()); - } - - if ((subparserHasFlag || Group::HasFlag()) && params.showProglineOptions && !params.proglineShowFlags) - { - res.push_back(params.proglineOptions); - } - - if (!ProglinePostfix().empty()) - { - std::string line; - for (char c : ProglinePostfix()) - { - if (isspace(c)) - { - if (!line.empty()) - { - res.push_back(line); - line.clear(); - } - - if (c == '\n') - { - res.push_back("\n"); - } - } - else - { - line += c; - } - } - - if (!line.empty()) - { - res.push_back(line); - } - } - - return res; - } - - virtual std::vector GetProgramLine(const HelpParams ¶ms) const override - { - if (!Matched()) - { - return {}; - } - - return GetCommandProgramLine(params); - } - - virtual std::vector GetCommands() override - { - if (selectedCommand != nullptr) - { - return selectedCommand->GetCommands(); - } - - if (Matched()) - { - return Group::GetCommands(); - } - - return { this }; - } - - virtual std::vector> GetDescription(const HelpParams ¶ms, const unsigned int indent) const override - { - std::vector> descriptions; - unsigned addindent = 0; - - UpdateSubparserHelp(params); - - if (!Matched()) - { - if (params.showCommandFullHelp) - { - std::ostringstream s; - bool empty = true; - for (const auto &progline: GetCommandProgramLine(params)) - { - if (!empty) - { - s << ' '; - } - else - { - empty = false; - } - - s << progline; - } - - descriptions.emplace_back(s.str(), "", indent); - } - else - { - descriptions.emplace_back(Name(), help, indent); - } - - if (!params.showCommandChildren && !params.showCommandFullHelp) - { - return descriptions; - } - - addindent = 1; - } - - if (params.showCommandFullHelp && !Matched()) - { - descriptions.emplace_back("", "", indent + addindent); - descriptions.emplace_back(Description().empty() ? Help() : Description(), "", indent + addindent); - descriptions.emplace_back("", "", indent + addindent); - } - - for (Base *child: Children()) - { - if ((child->GetOptions() & Options::HiddenFromDescription) != Options::None) - { - continue; - } - - auto groupDescriptions = child->GetDescription(params, indent + addindent); - descriptions.insert( - std::end(descriptions), - std::make_move_iterator(std::begin(groupDescriptions)), - std::make_move_iterator(std::end(groupDescriptions))); - } - - for (auto childDescription: subparserDescription) - { - std::get<2>(childDescription) += indent + addindent; - descriptions.push_back(std::move(childDescription)); - } - - if (params.showCommandFullHelp && !Matched()) - { - descriptions.emplace_back("", "", indent + addindent); - if (!Epilog().empty()) - { - descriptions.emplace_back(Epilog(), "", indent + addindent); - descriptions.emplace_back("", "", indent + addindent); - } - } - - return descriptions; - } - - virtual void Validate(const std::string &shortprefix, const std::string &longprefix) const override - { - if (!Matched()) - { - return; - } - - auto onValidationError = [&] - { - std::ostringstream problem; - problem << "Group validation failed somewhere!"; -#ifdef ARGS_NOEXCEPT - error = Error::Validation; - errorMsg = problem.str(); -#else - throw ValidationError(problem.str()); -#endif - }; - - for (Base *child: Children()) - { - if (child->IsGroup() && !child->Matched()) - { - onValidationError(); - } - - child->Validate(shortprefix, longprefix); - } - - if (subparser != nullptr) - { - subparser->Validate(shortprefix, longprefix); - if (!subparser->Matched()) - { - onValidationError(); - } - } - - if (selectedCommand == nullptr && commandIsRequired && (Group::HasCommand() || subparserHasCommand)) - { - std::ostringstream problem; - problem << "Command is required"; -#ifdef ARGS_NOEXCEPT - error = Error::Validation; - errorMsg = problem.str(); -#else - throw ValidationError(problem.str()); -#endif - } - } - - virtual void Reset() noexcept override - { - Group::Reset(); - selectedCommand = nullptr; - subparserProgramLine.clear(); - subparserDescription.clear(); - subparserHasFlag = false; - subparserHasPositional = false; - subparserHasCommand = false; -#ifdef ARGS_NOEXCEPT - subparserError = Error::None; -#endif - } - -#ifdef ARGS_NOEXCEPT - /// Only for ARGS_NOEXCEPT - virtual Error GetError() const override - { - if (!Matched()) - { - return Error::None; - } - - if (error != Error::None) - { - return error; - } - - if (subparserError != Error::None) - { - return subparserError; - } - - return Group::GetError(); - } -#endif - }; - - /** The main user facing command line argument parser class - */ - class ArgumentParser : public Command - { - friend class Subparser; - - private: - std::string longprefix; - std::string shortprefix; - - std::string longseparator; - - std::string terminator; - - bool allowJoinedShortValue = true; - bool allowJoinedLongValue = true; - bool allowSeparateShortValue = true; - bool allowSeparateLongValue = true; - - CompletionFlag *completion = nullptr; - bool readCompletion = false; - - protected: - enum class OptionType - { - LongFlag, - ShortFlag, - Positional - }; - - OptionType ParseOption(const std::string &s, bool allowEmpty = false) - { - if (s.find(longprefix) == 0 && (allowEmpty || s.length() > longprefix.length())) - { - return OptionType::LongFlag; - } - - if (s.find(shortprefix) == 0 && (allowEmpty || s.length() > shortprefix.length())) - { - return OptionType::ShortFlag; - } - - return OptionType::Positional; - } - - template - bool Complete(FlagBase &flag, It it, It end) - { - auto nextIt = it; - if (!readCompletion || (++nextIt != end)) - { - return false; - } - - const auto &chunk = *it; - for (auto &choice : flag.HelpChoices(helpParams)) - { - AddCompletionReply(chunk, choice); - } - -#ifndef ARGS_NOEXCEPT - throw Completion(completion->Get()); -#else - return true; -#endif - } - - /** (INTERNAL) Parse flag's values - * - * \param arg The string to display in error message as a flag name - * \param[in, out] it The iterator to first value. It will point to the last value - * \param end The end iterator - * \param joinedArg Joined value (e.g. bar in --foo=bar) - * \param canDiscardJoined If true joined value can be parsed as flag not as a value (as in -abcd) - * \param[out] values The vector to store parsed arg's values - */ - template - std::string ParseArgsValues(FlagBase &flag, const std::string &arg, It &it, It end, - const bool allowSeparate, const bool allowJoined, - const bool hasJoined, const std::string &joinedArg, - const bool canDiscardJoined, std::vector &values) - { - values.clear(); - - Nargs nargs = flag.NumberOfArguments(); - - if (hasJoined && !allowJoined && nargs.min != 0) - { - return "Flag '" + arg + "' was passed a joined argument, but these are disallowed"; - } - - if (hasJoined) - { - if (!canDiscardJoined || nargs.max != 0) - { - values.push_back(joinedArg); - } - } else if (!allowSeparate) - { - if (nargs.min != 0) - { - return "Flag '" + arg + "' was passed a separate argument, but these are disallowed"; - } - } else - { - auto valueIt = it; - ++valueIt; - - while (valueIt != end && - values.size() < nargs.max && - (nargs.min == nargs.max || ParseOption(*valueIt) == OptionType::Positional)) - { - if (Complete(flag, valueIt, end)) - { - it = end; - return ""; - } - - values.push_back(*valueIt); - ++it; - ++valueIt; - } - } - - if (values.size() > nargs.max) - { - return "Passed an argument into a non-argument flag: " + arg; - } else if (values.size() < nargs.min) - { - if (nargs.min == 1 && nargs.max == 1) - { - return "Flag '" + arg + "' requires an argument but received none"; - } else if (nargs.min == 1) - { - return "Flag '" + arg + "' requires at least one argument but received none"; - } else if (nargs.min != nargs.max) - { - return "Flag '" + arg + "' requires at least " + std::to_string(nargs.min) + - " arguments but received " + std::to_string(values.size()); - } else - { - return "Flag '" + arg + "' requires " + std::to_string(nargs.min) + - " arguments but received " + std::to_string(values.size()); - } - } - - return {}; - } - - template - bool ParseLong(It &it, It end) - { - const auto &chunk = *it; - const auto argchunk = chunk.substr(longprefix.size()); - // Try to separate it, in case of a separator: - const auto separator = longseparator.empty() ? argchunk.npos : argchunk.find(longseparator); - // If the separator is in the argument, separate it. - const auto arg = (separator != argchunk.npos ? - std::string(argchunk, 0, separator) - : argchunk); - const auto joined = (separator != argchunk.npos ? - argchunk.substr(separator + longseparator.size()) - : std::string()); - - if (auto flag = Match(arg)) - { - std::vector values; - const std::string errorMessage = ParseArgsValues(*flag, arg, it, end, allowSeparateLongValue, allowJoinedLongValue, - separator != argchunk.npos, joined, false, values); - if (!errorMessage.empty()) - { -#ifndef ARGS_NOEXCEPT - throw ParseError(errorMessage); -#else - error = Error::Parse; - errorMsg = errorMessage; - return false; -#endif - } - - if (!readCompletion) - { - flag->ParseValue(values); - } - - if (flag->KickOut()) - { - ++it; - return false; - } - } else - { - const std::string errorMessage("Flag could not be matched: " + arg); -#ifndef ARGS_NOEXCEPT - throw ParseError(errorMessage); -#else - error = Error::Parse; - errorMsg = errorMessage; - return false; -#endif - } - - return true; - } - - template - bool ParseShort(It &it, It end) - { - const auto &chunk = *it; - const auto argchunk = chunk.substr(shortprefix.size()); - for (auto argit = std::begin(argchunk); argit != std::end(argchunk); ++argit) - { - const auto arg = *argit; - - if (auto flag = Match(arg)) - { - const std::string value(argit + 1, std::end(argchunk)); - std::vector values; - const std::string errorMessage = ParseArgsValues(*flag, std::string(1, arg), it, end, - allowSeparateShortValue, allowJoinedShortValue, - !value.empty(), value, !value.empty(), values); - - if (!errorMessage.empty()) - { -#ifndef ARGS_NOEXCEPT - throw ParseError(errorMessage); -#else - error = Error::Parse; - errorMsg = errorMessage; - return false; -#endif - } - - if (!readCompletion) - { - flag->ParseValue(values); - } - - if (flag->KickOut()) - { - ++it; - return false; - } - - if (!values.empty()) - { - break; - } - } else - { - const std::string errorMessage("Flag could not be matched: '" + std::string(1, arg) + "'"); -#ifndef ARGS_NOEXCEPT - throw ParseError(errorMessage); -#else - error = Error::Parse; - errorMsg = errorMessage; - return false; -#endif - } - } - - return true; - } - - bool AddCompletionReply(const std::string &cur, const std::string &choice) - { - if (cur.empty() || choice.find(cur) == 0) - { - if (completion->syntax == "bash" && ParseOption(choice) == OptionType::LongFlag && choice.find(longseparator) != std::string::npos) - { - completion->reply.push_back(choice.substr(choice.find(longseparator) + 1)); - } else - { - completion->reply.push_back(choice); - } - return true; - } - - return false; - } - - template - bool Complete(It it, It end) - { - auto nextIt = it; - if (!readCompletion || (++nextIt != end)) - { - return false; - } - - const auto &chunk = *it; - auto pos = GetNextPositional(); - std::vector commands = GetCommands(); - const auto optionType = ParseOption(chunk, true); - - if (!commands.empty() && (chunk.empty() || optionType == OptionType::Positional)) - { - for (auto &cmd : commands) - { - if ((cmd->GetOptions() & Options::HiddenFromCompletion) == Options::None) - { - AddCompletionReply(chunk, cmd->Name()); - } - } - } else - { - bool hasPositionalCompletion = true; - - if (!commands.empty()) - { - for (auto &cmd : commands) - { - if ((cmd->GetOptions() & Options::HiddenFromCompletion) == Options::None) - { - AddCompletionReply(chunk, cmd->Name()); - } - } - } else if (pos) - { - if ((pos->GetOptions() & Options::HiddenFromCompletion) == Options::None) - { - auto choices = pos->HelpChoices(helpParams); - hasPositionalCompletion = !choices.empty() || optionType != OptionType::Positional; - for (auto &choice : choices) - { - AddCompletionReply(chunk, choice); - } - } - } - - if (hasPositionalCompletion) - { - auto flags = GetAllFlags(); - for (auto flag : flags) - { - if ((flag->GetOptions() & Options::HiddenFromCompletion) != Options::None) - { - continue; - } - - auto &matcher = flag->GetMatcher(); - if (!AddCompletionReply(chunk, matcher.GetShortOrAny().str(shortprefix, longprefix))) - { - for (auto &flagName : matcher.GetFlagStrings()) - { - if (AddCompletionReply(chunk, flagName.str(shortprefix, longprefix))) - { - break; - } - } - } - } - - if (optionType == OptionType::LongFlag && allowJoinedLongValue) - { - const auto separator = longseparator.empty() ? chunk.npos : chunk.find(longseparator); - if (separator != chunk.npos) - { - std::string arg(chunk, 0, separator); - if (auto flag = this->Match(arg.substr(longprefix.size()))) - { - for (auto &choice : flag->HelpChoices(helpParams)) - { - AddCompletionReply(chunk, arg + longseparator + choice); - } - } - } - } else if (optionType == OptionType::ShortFlag && allowJoinedShortValue) - { - if (chunk.size() > shortprefix.size() + 1) - { - auto arg = chunk.at(shortprefix.size()); - //TODO: support -abcVALUE where a and b take no value - if (auto flag = this->Match(arg)) - { - for (auto &choice : flag->HelpChoices(helpParams)) - { - AddCompletionReply(chunk, shortprefix + arg + choice); - } - } - } - } - } - } - -#ifndef ARGS_NOEXCEPT - throw Completion(completion->Get()); -#else - return true; -#endif - } - - template - It Parse(It begin, It end) - { - bool terminated = false; - std::vector commands = GetCommands(); - - // Check all arg chunks - for (auto it = begin; it != end; ++it) - { - if (Complete(it, end)) - { - return end; - } - - const auto &chunk = *it; - - if (!terminated && chunk == terminator) - { - terminated = true; - } else if (!terminated && ParseOption(chunk) == OptionType::LongFlag) - { - if (!ParseLong(it, end)) - { - return it; - } - } else if (!terminated && ParseOption(chunk) == OptionType::ShortFlag) - { - if (!ParseShort(it, end)) - { - return it; - } - } else if (!terminated && !commands.empty()) - { - auto itCommand = std::find_if(commands.begin(), commands.end(), [&chunk](Command *c) { return c->Name() == chunk; }); - if (itCommand == commands.end()) - { - const std::string errorMessage("Unknown command: " + chunk); -#ifndef ARGS_NOEXCEPT - throw ParseError(errorMessage); -#else - error = Error::Parse; - errorMsg = errorMessage; - return it; -#endif - } - - SelectCommand(*itCommand); - - if (const auto &coroutine = GetCoroutine()) - { - ++it; - RaiiSubparser coro(*this, std::vector(it, end)); - coroutine(coro.Parser()); -#ifdef ARGS_NOEXCEPT - error = GetError(); - if (error != Error::None) - { - return end; - } - - if (!coro.Parser().IsParsed()) - { - error = Error::Usage; - return end; - } -#else - if (!coro.Parser().IsParsed()) - { - throw UsageError("Subparser::Parse was not called"); - } -#endif - - break; - } - - commands = GetCommands(); - } else - { - auto pos = GetNextPositional(); - if (pos) - { - pos->ParseValue(chunk); - - if (pos->KickOut()) - { - return ++it; - } - } else - { - const std::string errorMessage("Passed in argument, but no positional arguments were ready to receive it: " + chunk); -#ifndef ARGS_NOEXCEPT - throw ParseError(errorMessage); -#else - error = Error::Parse; - errorMsg = errorMessage; - return it; -#endif - } - } - - if (!readCompletion && completion != nullptr && completion->Matched()) - { -#ifdef ARGS_NOEXCEPT - error = Error::Completion; -#endif - readCompletion = true; - ++it; - const auto argsLeft = static_cast(std::distance(it, end)); - if (completion->cword == 0 || argsLeft <= 1 || completion->cword >= argsLeft) - { -#ifndef ARGS_NOEXCEPT - throw Completion(""); -#endif - } - - std::vector curArgs(++it, end); - curArgs.resize(completion->cword); - - if (completion->syntax == "bash") - { - // bash tokenizes --flag=value as --flag=value - for (size_t idx = 0; idx < curArgs.size(); ) - { - if (idx > 0 && curArgs[idx] == "=") - { - curArgs[idx - 1] += "="; - // Avoid warnings from -Wsign-conversion - const auto signedIdx = static_cast(idx); - if (idx + 1 < curArgs.size()) - { - curArgs[idx - 1] += curArgs[idx + 1]; - curArgs.erase(curArgs.begin() + signedIdx, curArgs.begin() + signedIdx + 2); - } else - { - curArgs.erase(curArgs.begin() + signedIdx); - } - } else - { - ++idx; - } - } - - } -#ifndef ARGS_NOEXCEPT - try - { - Parse(curArgs.begin(), curArgs.end()); - throw Completion(""); - } - catch (Completion &) - { - throw; - } - catch (args::Error&) - { - throw Completion(""); - } -#else - return Parse(curArgs.begin(), curArgs.end()); -#endif - } - } - - Validate(shortprefix, longprefix); - return end; - } - - public: - HelpParams helpParams; - - ArgumentParser(const std::string &description_, const std::string &epilog_ = std::string()) - { - Description(description_); - Epilog(epilog_); - LongPrefix("--"); - ShortPrefix("-"); - LongSeparator("="); - Terminator("--"); - SetArgumentSeparations(true, true, true, true); - matched = true; - } - - void AddCompletion(CompletionFlag &completionFlag) - { - completion = &completionFlag; - Add(completionFlag); - } - - /** The program name for help generation - */ - const std::string &Prog() const - { return helpParams.programName; } - /** The program name for help generation - */ - void Prog(const std::string &prog_) - { this->helpParams.programName = prog_; } - - /** The prefix for long flags - */ - const std::string &LongPrefix() const - { return longprefix; } - /** The prefix for long flags - */ - void LongPrefix(const std::string &longprefix_) - { - this->longprefix = longprefix_; - this->helpParams.longPrefix = longprefix_; - } - - /** The prefix for short flags - */ - const std::string &ShortPrefix() const - { return shortprefix; } - /** The prefix for short flags - */ - void ShortPrefix(const std::string &shortprefix_) - { - this->shortprefix = shortprefix_; - this->helpParams.shortPrefix = shortprefix_; - } - - /** The separator for long flags - */ - const std::string &LongSeparator() const - { return longseparator; } - /** The separator for long flags - */ - void LongSeparator(const std::string &longseparator_) - { - if (longseparator_.empty()) - { - const std::string errorMessage("longseparator can not be set to empty"); -#ifdef ARGS_NOEXCEPT - error = Error::Usage; - errorMsg = errorMessage; -#else - throw UsageError(errorMessage); -#endif - } else - { - this->longseparator = longseparator_; - this->helpParams.longSeparator = allowJoinedLongValue ? longseparator_ : " "; - } - } - - /** The terminator that forcibly separates flags from positionals - */ - const std::string &Terminator() const - { return terminator; } - /** The terminator that forcibly separates flags from positionals - */ - void Terminator(const std::string &terminator_) - { this->terminator = terminator_; } - - /** Get the current argument separation parameters. - * - * See SetArgumentSeparations for details on what each one means. - */ - void GetArgumentSeparations( - bool &allowJoinedShortValue_, - bool &allowJoinedLongValue_, - bool &allowSeparateShortValue_, - bool &allowSeparateLongValue_) const - { - allowJoinedShortValue_ = this->allowJoinedShortValue; - allowJoinedLongValue_ = this->allowJoinedLongValue; - allowSeparateShortValue_ = this->allowSeparateShortValue; - allowSeparateLongValue_ = this->allowSeparateLongValue; - } - - /** Change allowed option separation. - * - * \param allowJoinedShortValue_ Allow a short flag that accepts an argument to be passed its argument immediately next to it (ie. in the same argv field) - * \param allowJoinedLongValue_ Allow a long flag that accepts an argument to be passed its argument separated by the longseparator (ie. in the same argv field) - * \param allowSeparateShortValue_ Allow a short flag that accepts an argument to be passed its argument separated by whitespace (ie. in the next argv field) - * \param allowSeparateLongValue_ Allow a long flag that accepts an argument to be passed its argument separated by whitespace (ie. in the next argv field) - */ - void SetArgumentSeparations( - const bool allowJoinedShortValue_, - const bool allowJoinedLongValue_, - const bool allowSeparateShortValue_, - const bool allowSeparateLongValue_) - { - this->allowJoinedShortValue = allowJoinedShortValue_; - this->allowJoinedLongValue = allowJoinedLongValue_; - this->allowSeparateShortValue = allowSeparateShortValue_; - this->allowSeparateLongValue = allowSeparateLongValue_; - - this->helpParams.longSeparator = allowJoinedLongValue ? longseparator : " "; - this->helpParams.shortSeparator = allowJoinedShortValue ? "" : " "; - } - - /** Pass the help menu into an ostream - */ - void Help(std::ostream &help_) const - { - auto &command = SelectedCommand(); - const auto &commandDescription = command.Description().empty() ? command.Help() : command.Description(); - const auto description_text = Wrap(commandDescription, helpParams.width - helpParams.descriptionindent); - const auto epilog_text = Wrap(command.Epilog(), helpParams.width - helpParams.descriptionindent); - - const bool hasoptions = command.HasFlag(); - const bool hasarguments = command.HasPositional(); - - std::vector prognameline; - prognameline.push_back(helpParams.usageString); - prognameline.push_back(Prog()); - auto commandProgLine = command.GetProgramLine(helpParams); - prognameline.insert(prognameline.end(), commandProgLine.begin(), commandProgLine.end()); - - const auto proglines = Wrap(prognameline.begin(), prognameline.end(), - helpParams.width - (helpParams.progindent + helpParams.progtailindent), - helpParams.width - helpParams.progindent); - auto progit = std::begin(proglines); - if (progit != std::end(proglines)) - { - help_ << std::string(helpParams.progindent, ' ') << *progit << '\n'; - ++progit; - } - for (; progit != std::end(proglines); ++progit) - { - help_ << std::string(helpParams.progtailindent, ' ') << *progit << '\n'; - } - - help_ << '\n'; - - if (!description_text.empty()) - { - for (const auto &line: description_text) - { - help_ << std::string(helpParams.descriptionindent, ' ') << line << "\n"; - } - help_ << "\n"; - } - - bool lastDescriptionIsNewline = false; - - if (!helpParams.optionsString.empty()) - { - help_ << std::string(helpParams.progindent, ' ') << helpParams.optionsString << "\n\n"; - } - - for (const auto &desc: command.GetDescription(helpParams, 0)) - { - lastDescriptionIsNewline = std::get<0>(desc).empty() && std::get<1>(desc).empty(); - const auto groupindent = std::get<2>(desc) * helpParams.eachgroupindent; - const auto flags = Wrap(std::get<0>(desc), helpParams.width - (helpParams.flagindent + helpParams.helpindent + helpParams.gutter)); - const auto info = Wrap(std::get<1>(desc), helpParams.width - (helpParams.helpindent + groupindent)); - - std::string::size_type flagssize = 0; - for (auto flagsit = std::begin(flags); flagsit != std::end(flags); ++flagsit) - { - if (flagsit != std::begin(flags)) - { - help_ << '\n'; - } - help_ << std::string(groupindent + helpParams.flagindent, ' ') << *flagsit; - flagssize = Glyphs(*flagsit); - } - - auto infoit = std::begin(info); - // groupindent is on both sides of this inequality, and therefore can be removed - if ((helpParams.flagindent + flagssize + helpParams.gutter) > helpParams.helpindent || infoit == std::end(info) || helpParams.addNewlineBeforeDescription) - { - help_ << '\n'; - } else - { - // groupindent is on both sides of the minus sign, and therefore doesn't actually need to be in here - help_ << std::string(helpParams.helpindent - (helpParams.flagindent + flagssize), ' ') << *infoit << '\n'; - ++infoit; - } - for (; infoit != std::end(info); ++infoit) - { - help_ << std::string(groupindent + helpParams.helpindent, ' ') << *infoit << '\n'; - } - } - if (hasoptions && hasarguments && helpParams.showTerminator) - { - lastDescriptionIsNewline = false; - for (const auto &item: Wrap(std::string("\"") + terminator + "\" can be used to terminate flag options and force all following arguments to be treated as positional options", helpParams.width - helpParams.flagindent)) - { - help_ << std::string(helpParams.flagindent, ' ') << item << '\n'; - } - } - - if (!lastDescriptionIsNewline) - { - help_ << "\n"; - } - - for (const auto &line: epilog_text) - { - help_ << std::string(helpParams.descriptionindent, ' ') << line << "\n"; - } - } - - /** Generate a help menu as a string. - * - * \return the help text as a single string - */ - std::string Help() const - { - std::ostringstream help_; - Help(help_); - return help_.str(); - } - - virtual void Reset() noexcept override - { - Command::Reset(); - matched = true; - readCompletion = false; - } - - /** Parse all arguments. - * - * \param begin an iterator to the beginning of the argument list - * \param end an iterator to the past-the-end element of the argument list - * \return the iterator after the last parsed value. Only useful for kick-out - */ - template - It ParseArgs(It begin, It end) - { - // Reset all Matched statuses and errors - Reset(); -#ifdef ARGS_NOEXCEPT - error = GetError(); - if (error != Error::None) - { - return end; - } -#endif - return Parse(begin, end); - } - - /** Parse all arguments. - * - * \param args an iterable of the arguments - * \return the iterator after the last parsed value. Only useful for kick-out - */ - template - auto ParseArgs(const T &args) -> decltype(std::begin(args)) - { - return ParseArgs(std::begin(args), std::end(args)); - } - - /** Convenience function to parse the CLI from argc and argv - * - * Just assigns the program name and vectorizes arguments for passing into ParseArgs() - * - * \return whether or not all arguments were parsed. This works for detecting kick-out, but is generally useless as it can't do anything with it. - */ - bool ParseCLI(const int argc, const char * const * argv) - { - if (Prog().empty()) - { - Prog(argv[0]); - } - const std::vector args(argv + 1, argv + argc); - return ParseArgs(args) == std::end(args); - } - - template - bool ParseCLI(const T &args) - { - return ParseArgs(args) == std::end(args); - } - }; - - inline Command::RaiiSubparser::RaiiSubparser(ArgumentParser &parser_, std::vector args_) - : command(parser_.SelectedCommand()), parser(std::move(args_), parser_, command, parser_.helpParams), oldSubparser(command.subparser) - { - command.subparser = &parser; - } - - inline Command::RaiiSubparser::RaiiSubparser(const Command &command_, const HelpParams ¶ms_): command(command_), parser(command, params_), oldSubparser(command.subparser) - { - command.subparser = &parser; - } - - inline void Subparser::Parse() - { - isParsed = true; - Reset(); - command.subparserDescription = GetDescription(helpParams, 0); - command.subparserHasFlag = HasFlag(); - command.subparserHasPositional = HasPositional(); - command.subparserHasCommand = HasCommand(); - command.subparserProgramLine = GetProgramLine(helpParams); - if (parser == nullptr) - { -#ifndef ARGS_NOEXCEPT - throw args::SubparserError(); -#else - error = Error::Subparser; - return; -#endif - } - - auto it = parser->Parse(args.begin(), args.end()); - command.Validate(parser->ShortPrefix(), parser->LongPrefix()); - kicked.assign(it, args.end()); - -#ifdef ARGS_NOEXCEPT - command.subparserError = GetError(); -#endif - } - - inline std::ostream &operator<<(std::ostream &os, const ArgumentParser &parser) - { - parser.Help(os); - return os; - } - - /** Boolean argument matcher - */ - class Flag : public FlagBase - { - public: - Flag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_): FlagBase(name_, help_, std::move(matcher_), options_) - { - group_.Add(*this); - } - - Flag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const bool extraError_ = false): Flag(group_, name_, help_, std::move(matcher_), extraError_ ? Options::Single : Options::None) - { - } - - virtual ~Flag() {} - - /** Get whether this was matched - */ - bool Get() const - { - return Matched(); - } - - virtual Nargs NumberOfArguments() const noexcept override - { - return 0; - } - - virtual void ParseValue(const std::vector&) override - { - } - }; - - /** Help flag class - * - * Works like a regular flag, but throws an instance of Help when it is matched - */ - class HelpFlag : public Flag - { - public: - HelpFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_ = {}): Flag(group_, name_, help_, std::move(matcher_), options_) {} - - virtual ~HelpFlag() {} - - virtual void ParseValue(const std::vector &) - { -#ifdef ARGS_NOEXCEPT - error = Error::Help; - errorMsg = Name(); -#else - throw Help(Name()); -#endif - } - - /** Get whether this was matched - */ - bool Get() const noexcept - { - return Matched(); - } - }; - - /** A flag class that simply counts the number of times it's matched - */ - class CounterFlag : public Flag - { - private: - const int startcount; - int count; - - public: - CounterFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const int startcount_ = 0, Options options_ = {}): - Flag(group_, name_, help_, std::move(matcher_), options_), startcount(startcount_), count(startcount_) {} - - virtual ~CounterFlag() {} - - virtual FlagBase *Match(const EitherFlag &arg) override - { - auto me = FlagBase::Match(arg); - if (me) - { - ++count; - } - return me; - } - - /** Get the count - */ - int &Get() noexcept - { - return count; - } - - virtual void Reset() noexcept override - { - FlagBase::Reset(); - count = startcount; - } - }; - - /** A flag class that calls a function when it's matched - */ - class ActionFlag : public FlagBase - { - private: - std::function &)> action; - Nargs nargs; - - public: - ActionFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Nargs nargs_, std::function &)> action_, Options options_ = {}): - FlagBase(name_, help_, std::move(matcher_), options_), action(std::move(action_)), nargs(nargs_) - { - group_.Add(*this); - } - - ActionFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, std::function action_, Options options_ = {}): - FlagBase(name_, help_, std::move(matcher_), options_), nargs(1) - { - group_.Add(*this); - action = [action_](const std::vector &a) { return action_(a.at(0)); }; - } - - ActionFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, std::function action_, Options options_ = {}): - FlagBase(name_, help_, std::move(matcher_), options_), nargs(0) - { - group_.Add(*this); - action = [action_](const std::vector &) { return action_(); }; - } - - virtual Nargs NumberOfArguments() const noexcept override - { return nargs; } - - virtual void ParseValue(const std::vector &value) override - { action(value); } - }; - - /** A default Reader class for argument classes - * - * If destination type is assignable to std::string it uses an assignment to std::string. - * Otherwise ValueReader simply uses a std::istringstream to read into the destination type, and - * raises a ParseError if there are any characters left. - */ - struct ValueReader - { - template - typename std::enable_if::value, bool>::type - operator ()(const std::string &name, const std::string &value, T &destination) - { - std::istringstream ss(value); - bool failed = !(ss >> destination); - - if (!failed) - { - ss >> std::ws; - } - - if (ss.rdbuf()->in_avail() > 0 || failed) - { -#ifdef ARGS_NOEXCEPT - (void)name; - return false; -#else - std::ostringstream problem; - problem << "Argument '" << name << "' received invalid value type '" << value << "'"; - throw ParseError(problem.str()); -#endif - } - return true; - } - - template - typename std::enable_if::value, bool>::type - operator()(const std::string &, const std::string &value, T &destination) - { - destination = value; - return true; - } - }; - - /** An argument-accepting flag class - * - * \tparam T the type to extract the argument as - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - */ - template < - typename T, - typename Reader = ValueReader> - class ValueFlag : public ValueFlagBase - { - protected: - T value; - T defaultValue; - - virtual std::string GetDefaultString(const HelpParams&) const override - { - return detail::ToString(defaultValue); - } - - private: - Reader reader; - - public: - - ValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &defaultValue_, Options options_): ValueFlagBase(name_, help_, std::move(matcher_), options_), value(defaultValue_), defaultValue(defaultValue_) - { - group_.Add(*this); - } - - ValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &defaultValue_ = T(), const bool extraError_ = false): ValueFlag(group_, name_, help_, std::move(matcher_), defaultValue_, extraError_ ? Options::Single : Options::None) - { - } - - ValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_): ValueFlag(group_, name_, help_, std::move(matcher_), T(), options_) - { - } - - virtual ~ValueFlag() {} - - virtual void ParseValue(const std::vector &values_) override - { - const std::string &value_ = values_.at(0); - -#ifdef ARGS_NOEXCEPT - if (!reader(name, value_, this->value)) - { - error = Error::Parse; - } -#else - reader(name, value_, this->value); -#endif - } - - virtual void Reset() noexcept override - { - ValueFlagBase::Reset(); - value = defaultValue; - } - - /** Get the value - */ - T &Get() noexcept - { - return value; - } - - /** Get the default value - */ - const T &GetDefault() noexcept - { - return defaultValue; - } - }; - - /** An optional argument-accepting flag class - * - * \tparam T the type to extract the argument as - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - */ - template < - typename T, - typename Reader = ValueReader> - class ImplicitValueFlag : public ValueFlag - { - protected: - T implicitValue; - - public: - - ImplicitValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &implicitValue_, const T &defaultValue_ = T(), Options options_ = {}) - : ValueFlag(group_, name_, help_, std::move(matcher_), defaultValue_, options_), implicitValue(implicitValue_) - { - } - - ImplicitValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const T &defaultValue_ = T(), Options options_ = {}) - : ValueFlag(group_, name_, help_, std::move(matcher_), defaultValue_, options_), implicitValue(defaultValue_) - { - } - - ImplicitValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Options options_) - : ValueFlag(group_, name_, help_, std::move(matcher_), {}, options_), implicitValue() - { - } - - virtual ~ImplicitValueFlag() {} - - virtual Nargs NumberOfArguments() const noexcept override - { - return {0, 1}; - } - - virtual void ParseValue(const std::vector &value_) override - { - if (value_.empty()) - { - this->value = implicitValue; - } else - { - ValueFlag::ParseValue(value_); - } - } - }; - - /** A variadic arguments accepting flag class - * - * \tparam T the type to extract the argument as - * \tparam List the list type that houses the values - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - */ - template < - typename T, - template class List = std::vector, - typename Reader = ValueReader> - class NargsValueFlag : public FlagBase - { - protected: - - List values; - const List defaultValues; - Nargs nargs; - Reader reader; - - public: - - typedef List Container; - typedef T value_type; - typedef typename Container::allocator_type allocator_type; - typedef typename Container::pointer pointer; - typedef typename Container::const_pointer const_pointer; - typedef T& reference; - typedef const T& const_reference; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - typedef typename Container::iterator iterator; - typedef typename Container::const_iterator const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - NargsValueFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Nargs nargs_, const List &defaultValues_ = {}, Options options_ = {}) - : FlagBase(name_, help_, std::move(matcher_), options_), values(defaultValues_), defaultValues(defaultValues_),nargs(nargs_) - { - group_.Add(*this); - } - - virtual ~NargsValueFlag() {} - - virtual Nargs NumberOfArguments() const noexcept override - { - return nargs; - } - - virtual void ParseValue(const std::vector &values_) override - { - values.clear(); - - for (const std::string &value : values_) - { - T v; -#ifdef ARGS_NOEXCEPT - if (!reader(name, value, v)) - { - error = Error::Parse; - } -#else - reader(name, value, v); -#endif - values.insert(std::end(values), v); - } - } - - List &Get() noexcept - { - return values; - } - - iterator begin() noexcept - { - return values.begin(); - } - - const_iterator begin() const noexcept - { - return values.begin(); - } - - const_iterator cbegin() const noexcept - { - return values.cbegin(); - } - - iterator end() noexcept - { - return values.end(); - } - - const_iterator end() const noexcept - { - return values.end(); - } - - const_iterator cend() const noexcept - { - return values.cend(); - } - - virtual void Reset() noexcept override - { - FlagBase::Reset(); - values = defaultValues; - } - - virtual FlagBase *Match(const EitherFlag &arg) override - { - const bool wasMatched = Matched(); - auto me = FlagBase::Match(arg); - if (me && !wasMatched) - { - values.clear(); - } - return me; - } - }; - - /** An argument-accepting flag class that pushes the found values into a list - * - * \tparam T the type to extract the argument as - * \tparam List the list type that houses the values - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - */ - template < - typename T, - template class List = std::vector, - typename Reader = ValueReader> - class ValueFlagList : public ValueFlagBase - { - private: - using Container = List; - Container values; - const Container defaultValues; - Reader reader; - - public: - - typedef T value_type; - typedef typename Container::allocator_type allocator_type; - typedef typename Container::pointer pointer; - typedef typename Container::const_pointer const_pointer; - typedef T& reference; - typedef const T& const_reference; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - typedef typename Container::iterator iterator; - typedef typename Container::const_iterator const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - ValueFlagList(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Container &defaultValues_ = Container(), Options options_ = {}): - ValueFlagBase(name_, help_, std::move(matcher_), options_), values(defaultValues_), defaultValues(defaultValues_) - { - group_.Add(*this); - } - - virtual ~ValueFlagList() {} - - virtual void ParseValue(const std::vector &values_) override - { - const std::string &value_ = values_.at(0); - - T v; -#ifdef ARGS_NOEXCEPT - if (!reader(name, value_, v)) - { - error = Error::Parse; - } -#else - reader(name, value_, v); -#endif - values.insert(std::end(values), v); - } - - /** Get the values - */ - Container &Get() noexcept - { - return values; - } - - virtual std::string Name() const override - { - return name + std::string("..."); - } - - virtual void Reset() noexcept override - { - ValueFlagBase::Reset(); - values = defaultValues; - } - - virtual FlagBase *Match(const EitherFlag &arg) override - { - const bool wasMatched = Matched(); - auto me = FlagBase::Match(arg); - if (me && !wasMatched) - { - values.clear(); - } - return me; - } - - iterator begin() noexcept - { - return values.begin(); - } - - const_iterator begin() const noexcept - { - return values.begin(); - } - - const_iterator cbegin() const noexcept - { - return values.cbegin(); - } - - iterator end() noexcept - { - return values.end(); - } - - const_iterator end() const noexcept - { - return values.end(); - } - - const_iterator cend() const noexcept - { - return values.cend(); - } - }; - - /** A mapping value flag class - * - * \tparam K the type to extract the argument as - * \tparam T the type to store the result as - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - * \tparam Map The Map type. Should operate like std::map or std::unordered_map - */ - template < - typename K, - typename T, - typename Reader = ValueReader, - template class Map = std::unordered_map> - class MapFlag : public ValueFlagBase - { - private: - const Map map; - T value; - const T defaultValue; - Reader reader; - - protected: - virtual std::vector GetChoicesStrings(const HelpParams &) const override - { - return detail::MapKeysToStrings(map); - } - - public: - - MapFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map &map_, const T &defaultValue_, Options options_): ValueFlagBase(name_, help_, std::move(matcher_), options_), map(map_), value(defaultValue_), defaultValue(defaultValue_) - { - group_.Add(*this); - } - - MapFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map &map_, const T &defaultValue_ = T(), const bool extraError_ = false): MapFlag(group_, name_, help_, std::move(matcher_), map_, defaultValue_, extraError_ ? Options::Single : Options::None) - { - } - - MapFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map &map_, Options options_): MapFlag(group_, name_, help_, std::move(matcher_), map_, T(), options_) - { - } - - virtual ~MapFlag() {} - - virtual void ParseValue(const std::vector &values_) override - { - const std::string &value_ = values_.at(0); - - K key; -#ifdef ARGS_NOEXCEPT - if (!reader(name, value_, key)) - { - error = Error::Parse; - } -#else - reader(name, value_, key); -#endif - auto it = map.find(key); - if (it == std::end(map)) - { - std::ostringstream problem; - problem << "Could not find key '" << key << "' in map for arg '" << name << "'"; -#ifdef ARGS_NOEXCEPT - error = Error::Map; - errorMsg = problem.str(); -#else - throw MapError(problem.str()); -#endif - } else - { - this->value = it->second; - } - } - - /** Get the value - */ - T &Get() noexcept - { - return value; - } - - virtual void Reset() noexcept override - { - ValueFlagBase::Reset(); - value = defaultValue; - } - }; - - /** A mapping value flag list class - * - * \tparam K the type to extract the argument as - * \tparam T the type to store the result as - * \tparam List the list type that houses the values - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - * \tparam Map The Map type. Should operate like std::map or std::unordered_map - */ - template < - typename K, - typename T, - template class List = std::vector, - typename Reader = ValueReader, - template class Map = std::unordered_map> - class MapFlagList : public ValueFlagBase - { - private: - using Container = List; - const Map map; - Container values; - const Container defaultValues; - Reader reader; - - protected: - virtual std::vector GetChoicesStrings(const HelpParams &) const override - { - return detail::MapKeysToStrings(map); - } - - public: - typedef T value_type; - typedef typename Container::allocator_type allocator_type; - typedef typename Container::pointer pointer; - typedef typename Container::const_pointer const_pointer; - typedef T& reference; - typedef const T& const_reference; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - typedef typename Container::iterator iterator; - typedef typename Container::const_iterator const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - MapFlagList(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, const Map &map_, const Container &defaultValues_ = Container()): ValueFlagBase(name_, help_, std::move(matcher_)), map(map_), values(defaultValues_), defaultValues(defaultValues_) - { - group_.Add(*this); - } - - virtual ~MapFlagList() {} - - virtual void ParseValue(const std::vector &values_) override - { - const std::string &value = values_.at(0); - - K key; -#ifdef ARGS_NOEXCEPT - if (!reader(name, value, key)) - { - error = Error::Parse; - } -#else - reader(name, value, key); -#endif - auto it = map.find(key); - if (it == std::end(map)) - { - std::ostringstream problem; - problem << "Could not find key '" << key << "' in map for arg '" << name << "'"; -#ifdef ARGS_NOEXCEPT - error = Error::Map; - errorMsg = problem.str(); -#else - throw MapError(problem.str()); -#endif - } else - { - this->values.emplace_back(it->second); - } - } - - /** Get the value - */ - Container &Get() noexcept - { - return values; - } - - virtual std::string Name() const override - { - return name + std::string("..."); - } - - virtual void Reset() noexcept override - { - ValueFlagBase::Reset(); - values = defaultValues; - } - - virtual FlagBase *Match(const EitherFlag &arg) override - { - const bool wasMatched = Matched(); - auto me = FlagBase::Match(arg); - if (me && !wasMatched) - { - values.clear(); - } - return me; - } - - iterator begin() noexcept - { - return values.begin(); - } - - const_iterator begin() const noexcept - { - return values.begin(); - } - - const_iterator cbegin() const noexcept - { - return values.cbegin(); - } - - iterator end() noexcept - { - return values.end(); - } - - const_iterator end() const noexcept - { - return values.end(); - } - - const_iterator cend() const noexcept - { - return values.cend(); - } - }; - - /** A positional argument class - * - * \tparam T the type to extract the argument as - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - */ - template < - typename T, - typename Reader = ValueReader> - class Positional : public PositionalBase - { - private: - T value; - const T defaultValue; - Reader reader; - public: - Positional(Group &group_, const std::string &name_, const std::string &help_, const T &defaultValue_ = T(), Options options_ = {}): PositionalBase(name_, help_, options_), value(defaultValue_), defaultValue(defaultValue_) - { - group_.Add(*this); - } - - Positional(Group &group_, const std::string &name_, const std::string &help_, Options options_): Positional(group_, name_, help_, T(), options_) - { - } - - virtual ~Positional() {} - - virtual void ParseValue(const std::string &value_) override - { -#ifdef ARGS_NOEXCEPT - if (!reader(name, value_, this->value)) - { - error = Error::Parse; - } -#else - reader(name, value_, this->value); -#endif - ready = false; - matched = true; - } - - /** Get the value - */ - T &Get() noexcept - { - return value; - } - - virtual void Reset() noexcept override - { - PositionalBase::Reset(); - value = defaultValue; - } - }; - - /** A positional argument class that pushes the found values into a list - * - * \tparam T the type to extract the argument as - * \tparam List the list type that houses the values - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - */ - template < - typename T, - template class List = std::vector, - typename Reader = ValueReader> - class PositionalList : public PositionalBase - { - private: - using Container = List; - Container values; - const Container defaultValues; - Reader reader; - - public: - typedef T value_type; - typedef typename Container::allocator_type allocator_type; - typedef typename Container::pointer pointer; - typedef typename Container::const_pointer const_pointer; - typedef T& reference; - typedef const T& const_reference; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - typedef typename Container::iterator iterator; - typedef typename Container::const_iterator const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - PositionalList(Group &group_, const std::string &name_, const std::string &help_, const Container &defaultValues_ = Container(), Options options_ = {}): PositionalBase(name_, help_, options_), values(defaultValues_), defaultValues(defaultValues_) - { - group_.Add(*this); - } - - PositionalList(Group &group_, const std::string &name_, const std::string &help_, Options options_): PositionalList(group_, name_, help_, {}, options_) - { - } - - virtual ~PositionalList() {} - - virtual void ParseValue(const std::string &value_) override - { - T v; -#ifdef ARGS_NOEXCEPT - if (!reader(name, value_, v)) - { - error = Error::Parse; - } -#else - reader(name, value_, v); -#endif - values.insert(std::end(values), v); - matched = true; - } - - virtual std::string Name() const override - { - return name + std::string("..."); - } - - /** Get the values - */ - Container &Get() noexcept - { - return values; - } - - virtual void Reset() noexcept override - { - PositionalBase::Reset(); - values = defaultValues; - } - - virtual PositionalBase *GetNextPositional() override - { - const bool wasMatched = Matched(); - auto me = PositionalBase::GetNextPositional(); - if (me && !wasMatched) - { - values.clear(); - } - return me; - } - - iterator begin() noexcept - { - return values.begin(); - } - - const_iterator begin() const noexcept - { - return values.begin(); - } - - const_iterator cbegin() const noexcept - { - return values.cbegin(); - } - - iterator end() noexcept - { - return values.end(); - } - - const_iterator end() const noexcept - { - return values.end(); - } - - const_iterator cend() const noexcept - { - return values.cend(); - } - }; - - /** A positional argument mapping class - * - * \tparam K the type to extract the argument as - * \tparam T the type to store the result as - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - * \tparam Map The Map type. Should operate like std::map or std::unordered_map - */ - template < - typename K, - typename T, - typename Reader = ValueReader, - template class Map = std::unordered_map> - class MapPositional : public PositionalBase - { - private: - const Map map; - T value; - const T defaultValue; - Reader reader; - - protected: - virtual std::vector GetChoicesStrings(const HelpParams &) const override - { - return detail::MapKeysToStrings(map); - } - - public: - - MapPositional(Group &group_, const std::string &name_, const std::string &help_, const Map &map_, const T &defaultValue_ = T(), Options options_ = {}): - PositionalBase(name_, help_, options_), map(map_), value(defaultValue_), defaultValue(defaultValue_) - { - group_.Add(*this); - } - - virtual ~MapPositional() {} - - virtual void ParseValue(const std::string &value_) override - { - K key; -#ifdef ARGS_NOEXCEPT - if (!reader(name, value_, key)) - { - error = Error::Parse; - } -#else - reader(name, value_, key); -#endif - auto it = map.find(key); - if (it == std::end(map)) - { - std::ostringstream problem; - problem << "Could not find key '" << key << "' in map for arg '" << name << "'"; -#ifdef ARGS_NOEXCEPT - error = Error::Map; - errorMsg = problem.str(); -#else - throw MapError(problem.str()); -#endif - } else - { - this->value = it->second; - ready = false; - matched = true; - } - } - - /** Get the value - */ - T &Get() noexcept - { - return value; - } - - virtual void Reset() noexcept override - { - PositionalBase::Reset(); - value = defaultValue; - } - }; - - /** A positional argument mapping list class - * - * \tparam K the type to extract the argument as - * \tparam T the type to store the result as - * \tparam List the list type that houses the values - * \tparam Reader The functor type used to read the argument, taking the name, value, and destination reference with operator(), and returning a bool (if ARGS_NOEXCEPT is defined) - * \tparam Map The Map type. Should operate like std::map or std::unordered_map - */ - template < - typename K, - typename T, - template class List = std::vector, - typename Reader = ValueReader, - template class Map = std::unordered_map> - class MapPositionalList : public PositionalBase - { - private: - using Container = List; - - const Map map; - Container values; - const Container defaultValues; - Reader reader; - - protected: - virtual std::vector GetChoicesStrings(const HelpParams &) const override - { - return detail::MapKeysToStrings(map); - } - - public: - typedef T value_type; - typedef typename Container::allocator_type allocator_type; - typedef typename Container::pointer pointer; - typedef typename Container::const_pointer const_pointer; - typedef T& reference; - typedef const T& const_reference; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - typedef typename Container::iterator iterator; - typedef typename Container::const_iterator const_iterator; - typedef std::reverse_iterator reverse_iterator; - typedef std::reverse_iterator const_reverse_iterator; - - MapPositionalList(Group &group_, const std::string &name_, const std::string &help_, const Map &map_, const Container &defaultValues_ = Container(), Options options_ = {}): - PositionalBase(name_, help_, options_), map(map_), values(defaultValues_), defaultValues(defaultValues_) - { - group_.Add(*this); - } - - virtual ~MapPositionalList() {} - - virtual void ParseValue(const std::string &value_) override - { - K key; -#ifdef ARGS_NOEXCEPT - if (!reader(name, value_, key)) - { - error = Error::Parse; - } -#else - reader(name, value_, key); -#endif - auto it = map.find(key); - if (it == std::end(map)) - { - std::ostringstream problem; - problem << "Could not find key '" << key << "' in map for arg '" << name << "'"; -#ifdef ARGS_NOEXCEPT - error = Error::Map; - errorMsg = problem.str(); -#else - throw MapError(problem.str()); -#endif - } else - { - this->values.emplace_back(it->second); - matched = true; - } - } - - /** Get the value - */ - Container &Get() noexcept - { - return values; - } - - virtual std::string Name() const override - { - return name + std::string("..."); - } - - virtual void Reset() noexcept override - { - PositionalBase::Reset(); - values = defaultValues; - } - - virtual PositionalBase *GetNextPositional() override - { - const bool wasMatched = Matched(); - auto me = PositionalBase::GetNextPositional(); - if (me && !wasMatched) - { - values.clear(); - } - return me; - } - - iterator begin() noexcept - { - return values.begin(); - } - - const_iterator begin() const noexcept - { - return values.begin(); - } - - const_iterator cbegin() const noexcept - { - return values.cbegin(); - } - - iterator end() noexcept - { - return values.end(); - } - - const_iterator end() const noexcept - { - return values.end(); - } - - const_iterator cend() const noexcept - { - return values.cend(); - } - }; -} - -#endif diff --git a/deps/geometry-central b/deps/geometry-central new file mode 160000 index 000000000..b5fc9700b --- /dev/null +++ b/deps/geometry-central @@ -0,0 +1 @@ +Subproject commit b5fc9700b7e55d1c39b696c22030dd2640ec658e diff --git a/deps/glad/CMakeLists.txt b/deps/glad/CMakeLists.txt deleted file mode 100644 index febd4f0ab..000000000 --- a/deps/glad/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(src) diff --git a/deps/glad/LICENSE b/deps/glad/LICENSE deleted file mode 100644 index 00fb54181..000000000 --- a/deps/glad/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -This file is not distributed by the glad authors. It is a placeholder to explain the licensing situation for -this subdirectory. - -These source files are not the "glad" project, they are outputs _generated_ by the glad project. - -As of Apr 13, 2020, the Readme in the glad repository https://github.com/Dav1dde/glad states that generated files -can be licensed as Public Domain. Quote: "The glad generated code itself is any of Public Domain, WTFPL or CC0" diff --git a/deps/glad/include/KHR/khrplatform.h b/deps/glad/include/KHR/khrplatform.h deleted file mode 100644 index dd22d9270..000000000 --- a/deps/glad/include/KHR/khrplatform.h +++ /dev/null @@ -1,290 +0,0 @@ -#ifndef __khrplatform_h_ -#define __khrplatform_h_ - -/* -** Copyright (c) 2008-2018 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are furnished to do so, subject to -** the following conditions: -** -** The above copyright notice and this permission notice shall be included -** in all copies or substantial portions of the Materials. -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* Khronos platform-specific types and definitions. - * - * The master copy of khrplatform.h is maintained in the Khronos EGL - * Registry repository at https://github.com/KhronosGroup/EGL-Registry - * The last semantic modification to khrplatform.h was at commit ID: - * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 - * - * Adopters may modify this file to suit their platform. Adopters are - * encouraged to submit platform specific modifications to the Khronos - * group so that they can be included in future versions of this file. - * Please submit changes by filing pull requests or issues on - * the EGL Registry repository linked above. - * - * - * See the Implementer's Guidelines for information about where this file - * should be located on your system and for more details of its use: - * http://www.khronos.org/registry/implementers_guide.pdf - * - * This file should be included as - * #include - * by Khronos client API header files that use its types and defines. - * - * The types in khrplatform.h should only be used to define API-specific types. - * - * Types defined in khrplatform.h: - * khronos_int8_t signed 8 bit - * khronos_uint8_t unsigned 8 bit - * khronos_int16_t signed 16 bit - * khronos_uint16_t unsigned 16 bit - * khronos_int32_t signed 32 bit - * khronos_uint32_t unsigned 32 bit - * khronos_int64_t signed 64 bit - * khronos_uint64_t unsigned 64 bit - * khronos_intptr_t signed same number of bits as a pointer - * khronos_uintptr_t unsigned same number of bits as a pointer - * khronos_ssize_t signed size - * khronos_usize_t unsigned size - * khronos_float_t signed 32 bit floating point - * khronos_time_ns_t unsigned 64 bit time in nanoseconds - * khronos_utime_nanoseconds_t unsigned time interval or absolute time in - * nanoseconds - * khronos_stime_nanoseconds_t signed time interval in nanoseconds - * khronos_boolean_enum_t enumerated boolean type. This should - * only be used as a base type when a client API's boolean type is - * an enum. Client APIs which use an integer or other type for - * booleans cannot use this as the base type for their boolean. - * - * Tokens defined in khrplatform.h: - * - * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. - * - * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. - * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. - * - * Calling convention macros defined in this file: - * KHRONOS_APICALL - * KHRONOS_APIENTRY - * KHRONOS_APIATTRIBUTES - * - * These may be used in function prototypes as: - * - * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( - * int arg1, - * int arg2) KHRONOS_APIATTRIBUTES; - */ - -#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) -# define KHRONOS_STATIC 1 -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APICALL - *------------------------------------------------------------------------- - * This precedes the return type of the function in the function prototype. - */ -#if defined(KHRONOS_STATIC) - /* If the preprocessor constant KHRONOS_STATIC is defined, make the - * header compatible with static linking. */ -# define KHRONOS_APICALL -#elif defined(_WIN32) -# define KHRONOS_APICALL __declspec(dllimport) -#elif defined (__SYMBIAN32__) -# define KHRONOS_APICALL IMPORT_C -#elif defined(__ANDROID__) -# define KHRONOS_APICALL __attribute__((visibility("default"))) -#else -# define KHRONOS_APICALL -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APIENTRY - *------------------------------------------------------------------------- - * This follows the return type of the function and precedes the function - * name in the function prototype. - */ -#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) - /* Win32 but not WinCE */ -# define KHRONOS_APIENTRY __stdcall -#else -# define KHRONOS_APIENTRY -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APIATTRIBUTES - *------------------------------------------------------------------------- - * This follows the closing parenthesis of the function prototype arguments. - */ -#if defined (__ARMCC_2__) -#define KHRONOS_APIATTRIBUTES __softfp -#else -#define KHRONOS_APIATTRIBUTES -#endif - -/*------------------------------------------------------------------------- - * basic type definitions - *-----------------------------------------------------------------------*/ -#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) - - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__VMS ) || defined(__sgi) - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) - -/* - * Win32 - */ -typedef __int32 khronos_int32_t; -typedef unsigned __int32 khronos_uint32_t; -typedef __int64 khronos_int64_t; -typedef unsigned __int64 khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__sun__) || defined(__digital__) - -/* - * Sun or Digital - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#if defined(__arch64__) || defined(_LP64) -typedef long int khronos_int64_t; -typedef unsigned long int khronos_uint64_t; -#else -typedef long long int khronos_int64_t; -typedef unsigned long long int khronos_uint64_t; -#endif /* __arch64__ */ -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif 0 - -/* - * Hypothetical platform with no float or int64 support - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#define KHRONOS_SUPPORT_INT64 0 -#define KHRONOS_SUPPORT_FLOAT 0 - -#else - -/* - * Generic fallback - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#endif - - -/* - * Types that are (so far) the same on all platforms - */ -typedef signed char khronos_int8_t; -typedef unsigned char khronos_uint8_t; -typedef signed short int khronos_int16_t; -typedef unsigned short int khronos_uint16_t; - -/* - * Types that differ between LLP64 and LP64 architectures - in LLP64, - * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears - * to be the only LLP64 architecture in current use. - */ -#ifdef _WIN64 -typedef signed long long int khronos_intptr_t; -typedef unsigned long long int khronos_uintptr_t; -typedef signed long long int khronos_ssize_t; -typedef unsigned long long int khronos_usize_t; -#else -typedef signed long int khronos_intptr_t; -typedef unsigned long int khronos_uintptr_t; -typedef signed long int khronos_ssize_t; -typedef unsigned long int khronos_usize_t; -#endif - -#if KHRONOS_SUPPORT_FLOAT -/* - * Float type - */ -typedef float khronos_float_t; -#endif - -#if KHRONOS_SUPPORT_INT64 -/* Time types - * - * These types can be used to represent a time interval in nanoseconds or - * an absolute Unadjusted System Time. Unadjusted System Time is the number - * of nanoseconds since some arbitrary system event (e.g. since the last - * time the system booted). The Unadjusted System Time is an unsigned - * 64 bit value that wraps back to 0 every 584 years. Time intervals - * may be either signed or unsigned. - */ -typedef khronos_uint64_t khronos_utime_nanoseconds_t; -typedef khronos_int64_t khronos_stime_nanoseconds_t; -#endif - -/* - * Dummy value used to pad enum types to 32 bits. - */ -#ifndef KHRONOS_MAX_ENUM -#define KHRONOS_MAX_ENUM 0x7FFFFFFF -#endif - -/* - * Enumerated boolean type - * - * Values other than zero should be considered to be true. Therefore - * comparisons should not be made against KHRONOS_TRUE. - */ -typedef enum { - KHRONOS_FALSE = 0, - KHRONOS_TRUE = 1, - KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM -} khronos_boolean_enum_t; - -#endif /* __khrplatform_h_ */ diff --git a/deps/glad/include/glad/glad.h b/deps/glad/include/glad/glad.h deleted file mode 100644 index 1e718abd4..000000000 --- a/deps/glad/include/glad/glad.h +++ /dev/null @@ -1,2129 +0,0 @@ -/* - - OpenGL loader generated by glad 0.1.34 on Sat Aug 14 14:33:57 2021. - - Language/Generator: C/C++ - Specification: gl - APIs: gl=3.3 - Profile: core - Extensions: - - Loader: True - Local files: False - Omit khrplatform: False - Reproducible: False - - Commandline: - --profile="core" --api="gl=3.3" --generator="c" --spec="gl" --extensions="" - Online: - https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D3.3 -*/ - - -#ifndef __glad_h_ -#define __glad_h_ - -#ifdef __gl_h_ -#error OpenGL header already included, remove this include, glad already provides it -#endif -#define __gl_h_ - -#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) -#define APIENTRY __stdcall -#endif - -#ifndef APIENTRY -#define APIENTRY -#endif -#ifndef APIENTRYP -#define APIENTRYP APIENTRY * -#endif - -#ifndef GLAPIENTRY -#define GLAPIENTRY APIENTRY -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -struct gladGLversionStruct { - int major; - int minor; -}; - -typedef void* (* GLADloadproc)(const char *name); - -#ifndef GLAPI -# if defined(GLAD_GLAPI_EXPORT) -# if defined(_WIN32) || defined(__CYGWIN__) -# if defined(GLAD_GLAPI_EXPORT_BUILD) -# if defined(__GNUC__) -# define GLAPI __attribute__ ((dllexport)) extern -# else -# define GLAPI __declspec(dllexport) extern -# endif -# else -# if defined(__GNUC__) -# define GLAPI __attribute__ ((dllimport)) extern -# else -# define GLAPI __declspec(dllimport) extern -# endif -# endif -# elif defined(__GNUC__) && defined(GLAD_GLAPI_EXPORT_BUILD) -# define GLAPI __attribute__ ((visibility ("default"))) extern -# else -# define GLAPI extern -# endif -# else -# define GLAPI extern -# endif -#endif - -GLAPI struct gladGLversionStruct GLVersion; - -GLAPI int gladLoadGL(void); - -GLAPI int gladLoadGLLoader(GLADloadproc); - -#include -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLbitfield; -typedef void GLvoid; -typedef khronos_int8_t GLbyte; -typedef khronos_uint8_t GLubyte; -typedef khronos_int16_t GLshort; -typedef khronos_uint16_t GLushort; -typedef int GLint; -typedef unsigned int GLuint; -typedef khronos_int32_t GLclampx; -typedef int GLsizei; -typedef khronos_float_t GLfloat; -typedef khronos_float_t GLclampf; -typedef double GLdouble; -typedef double GLclampd; -typedef void *GLeglClientBufferEXT; -typedef void *GLeglImageOES; -typedef char GLchar; -typedef char GLcharARB; -#ifdef __APPLE__ -typedef void *GLhandleARB; -#else -typedef unsigned int GLhandleARB; -#endif -typedef khronos_uint16_t GLhalf; -typedef khronos_uint16_t GLhalfARB; -typedef khronos_int32_t GLfixed; -typedef khronos_intptr_t GLintptr; -typedef khronos_intptr_t GLintptrARB; -typedef khronos_ssize_t GLsizeiptr; -typedef khronos_ssize_t GLsizeiptrARB; -typedef khronos_int64_t GLint64; -typedef khronos_int64_t GLint64EXT; -typedef khronos_uint64_t GLuint64; -typedef khronos_uint64_t GLuint64EXT; -typedef struct __GLsync *GLsync; -struct _cl_context; -struct _cl_event; -typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); -typedef unsigned short GLhalfNV; -typedef GLintptr GLvdpauSurfaceNV; -typedef void (APIENTRY *GLVULKANPROCNV)(void); -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_FALSE 0 -#define GL_TRUE 1 -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -#define GL_NONE 0 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_CW 0x0900 -#define GL_CCW 0x0901 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_VIEWPORT 0x0BA2 -#define GL_DITHER 0x0BD0 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND 0x0BE2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_READ_BUFFER 0x0C02 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F -#define GL_TEXTURE 0x1702 -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 -#define GL_STENCIL_INDEX 0x1901 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -#define GL_REPEAT 0x2901 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_DOUBLE 0x140A -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 -#define GL_R3_G3_B2 0x2A10 -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_UNSIGNED_BYTE_3_3_2 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2 0x8036 -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_PACK_SKIP_IMAGES 0x806B -#define GL_PACK_IMAGE_HEIGHT 0x806C -#define GL_UNPACK_SKIP_IMAGES 0x806D -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#define GL_TEXTURE_3D 0x806F -#define GL_PROXY_TEXTURE_3D 0x8070 -#define GL_TEXTURE_DEPTH 0x8071 -#define GL_TEXTURE_WRAP_R 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 -#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 -#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 -#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 -#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 -#define GL_BGR 0x80E0 -#define GL_BGRA 0x80E1 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_TEXTURE_MIN_LOD 0x813A -#define GL_TEXTURE_MAX_LOD 0x813B -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_MAX_LEVEL 0x813D -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_MULTISAMPLE 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_TEXTURE_CUBE_MAP 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_COMPRESSED_RGB 0x84ED -#define GL_COMPRESSED_RGBA 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 -#define GL_TEXTURE_COMPRESSED 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CLAMP_TO_BORDER 0x812D -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32 0x81A7 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_TEXTURE_LOD_BIAS 0x8501 -#define GL_INCR_WRAP 0x8507 -#define GL_DECR_WRAP 0x8508 -#define GL_TEXTURE_DEPTH_SIZE 0x884A -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_BLEND_COLOR 0x8005 -#define GL_BLEND_EQUATION 0x8009 -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_FUNC_ADD 0x8006 -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_FUNC_SUBTRACT 0x800A -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_QUERY_COUNTER_BITS 0x8864 -#define GL_CURRENT_QUERY 0x8865 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_READ_ONLY 0x88B8 -#define GL_WRITE_ONLY 0x88B9 -#define GL_READ_WRITE 0x88BA -#define GL_BUFFER_ACCESS 0x88BB -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_STREAM_COPY 0x88E2 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STATIC_COPY 0x88E6 -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_SAMPLES_PASSED 0x8914 -#define GL_SRC1_ALPHA 0x8589 -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -#define GL_PIXEL_PACK_BUFFER 0x88EB -#define GL_PIXEL_UNPACK_BUFFER 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_SRGB 0x8C40 -#define GL_SRGB8 0x8C41 -#define GL_SRGB_ALPHA 0x8C42 -#define GL_SRGB8_ALPHA8 0x8C43 -#define GL_COMPRESSED_SRGB 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_CLIP_DISTANCE0 0x3000 -#define GL_CLIP_DISTANCE1 0x3001 -#define GL_CLIP_DISTANCE2 0x3002 -#define GL_CLIP_DISTANCE3 0x3003 -#define GL_CLIP_DISTANCE4 0x3004 -#define GL_CLIP_DISTANCE5 0x3005 -#define GL_CLIP_DISTANCE6 0x3006 -#define GL_CLIP_DISTANCE7 0x3007 -#define GL_MAX_CLIP_DISTANCES 0x0D32 -#define GL_MAJOR_VERSION 0x821B -#define GL_MINOR_VERSION 0x821C -#define GL_NUM_EXTENSIONS 0x821D -#define GL_CONTEXT_FLAGS 0x821E -#define GL_COMPRESSED_RED 0x8225 -#define GL_COMPRESSED_RG 0x8226 -#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 -#define GL_RGBA32F 0x8814 -#define GL_RGB32F 0x8815 -#define GL_RGBA16F 0x881A -#define GL_RGB16F 0x881B -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_CLAMP_READ_COLOR 0x891C -#define GL_FIXED_ONLY 0x891D -#define GL_MAX_VARYING_COMPONENTS 0x8B4B -#define GL_TEXTURE_1D_ARRAY 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_RGB9_E5 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E -#define GL_TEXTURE_SHARED_SIZE 0x8C3F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 -#define GL_PRIMITIVES_GENERATED 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_RASTERIZER_DISCARD 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F -#define GL_RGBA32UI 0x8D70 -#define GL_RGB32UI 0x8D71 -#define GL_RGBA16UI 0x8D76 -#define GL_RGB16UI 0x8D77 -#define GL_RGBA8UI 0x8D7C -#define GL_RGB8UI 0x8D7D -#define GL_RGBA32I 0x8D82 -#define GL_RGB32I 0x8D83 -#define GL_RGBA16I 0x8D88 -#define GL_RGB16I 0x8D89 -#define GL_RGBA8I 0x8D8E -#define GL_RGB8I 0x8D8F -#define GL_RED_INTEGER 0x8D94 -#define GL_GREEN_INTEGER 0x8D95 -#define GL_BLUE_INTEGER 0x8D96 -#define GL_RGB_INTEGER 0x8D98 -#define GL_RGBA_INTEGER 0x8D99 -#define GL_BGR_INTEGER 0x8D9A -#define GL_BGRA_INTEGER 0x8D9B -#define GL_SAMPLER_1D_ARRAY 0x8DC0 -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_UNSIGNED_INT_VEC2 0x8DC6 -#define GL_UNSIGNED_INT_VEC3 0x8DC7 -#define GL_UNSIGNED_INT_VEC4 0x8DC8 -#define GL_INT_SAMPLER_1D 0x8DC9 -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_QUERY_WAIT 0x8E13 -#define GL_QUERY_NO_WAIT 0x8E14 -#define GL_QUERY_BY_REGION_WAIT 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH32F_STENCIL8 0x8CAD -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_UNSIGNED_INT_24_8 0x84FA -#define GL_DEPTH24_STENCIL8 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE 0x88F1 -#define GL_TEXTURE_RED_TYPE 0x8C10 -#define GL_TEXTURE_GREEN_TYPE 0x8C11 -#define GL_TEXTURE_BLUE_TYPE 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE 0x8C13 -#define GL_TEXTURE_DEPTH_TYPE 0x8C16 -#define GL_UNSIGNED_NORMALIZED 0x8C17 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_READ_FRAMEBUFFER 0x8CA8 -#define GL_DRAW_FRAMEBUFFER 0x8CA9 -#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_COLOR_ATTACHMENT16 0x8CF0 -#define GL_COLOR_ATTACHMENT17 0x8CF1 -#define GL_COLOR_ATTACHMENT18 0x8CF2 -#define GL_COLOR_ATTACHMENT19 0x8CF3 -#define GL_COLOR_ATTACHMENT20 0x8CF4 -#define GL_COLOR_ATTACHMENT21 0x8CF5 -#define GL_COLOR_ATTACHMENT22 0x8CF6 -#define GL_COLOR_ATTACHMENT23 0x8CF7 -#define GL_COLOR_ATTACHMENT24 0x8CF8 -#define GL_COLOR_ATTACHMENT25 0x8CF9 -#define GL_COLOR_ATTACHMENT26 0x8CFA -#define GL_COLOR_ATTACHMENT27 0x8CFB -#define GL_COLOR_ATTACHMENT28 0x8CFC -#define GL_COLOR_ATTACHMENT29 0x8CFD -#define GL_COLOR_ATTACHMENT30 0x8CFE -#define GL_COLOR_ATTACHMENT31 0x8CFF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_STENCIL_INDEX1 0x8D46 -#define GL_STENCIL_INDEX4 0x8D47 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_INDEX16 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_MAX_SAMPLES 0x8D57 -#define GL_FRAMEBUFFER_SRGB 0x8DB9 -#define GL_HALF_FLOAT 0x140B -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#define GL_COMPRESSED_RED_RGTC1 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define GL_COMPRESSED_RG_RGTC2 0x8DBD -#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER 0x8F37 -#define GL_UNIFORM_BUFFER 0x8A11 -#define GL_UNIFORM_BUFFER_BINDING 0x8A28 -#define GL_UNIFORM_BUFFER_START 0x8A29 -#define GL_UNIFORM_BUFFER_SIZE 0x8A2A -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F -#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 -#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 -#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 -#define GL_UNIFORM_TYPE 0x8A37 -#define GL_UNIFORM_SIZE 0x8A38 -#define GL_UNIFORM_NAME_LENGTH 0x8A39 -#define GL_UNIFORM_BLOCK_INDEX 0x8A3A -#define GL_UNIFORM_OFFSET 0x8A3B -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D -#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E -#define GL_UNIFORM_BLOCK_BINDING 0x8A3F -#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 -#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 -#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 -#define GL_INVALID_INDEX 0xFFFFFFFF -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -#define GL_DEPTH_CLAMP 0x864F -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION 0x8E4D -#define GL_LAST_VERTEX_CONVENTION 0x8E4E -#define GL_PROVOKING_VERTEX 0x8E4F -#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_OBJECT_TYPE 0x9112 -#define GL_SYNC_CONDITION 0x9113 -#define GL_SYNC_STATUS 0x9114 -#define GL_SYNC_FLAGS 0x9115 -#define GL_SYNC_FENCE 0x9116 -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#define GL_UNSIGNALED 0x9118 -#define GL_SIGNALED 0x9119 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_TIMEOUT_EXPIRED 0x911B -#define GL_CONDITION_SATISFIED 0x911C -#define GL_WAIT_FAILED 0x911D -#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 -#define GL_SAMPLE_POSITION 0x8E50 -#define GL_SAMPLE_MASK 0x8E51 -#define GL_SAMPLE_MASK_VALUE 0x8E52 -#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 -#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 -#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 -#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 -#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 -#define GL_TEXTURE_SAMPLES 0x9106 -#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 -#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 -#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A -#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B -#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C -#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D -#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E -#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F -#define GL_MAX_INTEGER_SAMPLES 0x9110 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_SRC1_COLOR 0x88F9 -#define GL_ONE_MINUS_SRC1_COLOR 0x88FA -#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB -#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#define GL_SAMPLER_BINDING 0x8919 -#define GL_RGB10_A2UI 0x906F -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#define GL_TIME_ELAPSED 0x88BF -#define GL_TIMESTAMP 0x8E28 -#define GL_INT_2_10_10_10_REV 0x8D9F -#ifndef GL_VERSION_1_0 -#define GL_VERSION_1_0 1 -GLAPI int GLAD_GL_VERSION_1_0; -typedef void (APIENTRYP PFNGLCULLFACEPROC)(GLenum mode); -GLAPI PFNGLCULLFACEPROC glad_glCullFace; -#define glCullFace glad_glCullFace -typedef void (APIENTRYP PFNGLFRONTFACEPROC)(GLenum mode); -GLAPI PFNGLFRONTFACEPROC glad_glFrontFace; -#define glFrontFace glad_glFrontFace -typedef void (APIENTRYP PFNGLHINTPROC)(GLenum target, GLenum mode); -GLAPI PFNGLHINTPROC glad_glHint; -#define glHint glad_glHint -typedef void (APIENTRYP PFNGLLINEWIDTHPROC)(GLfloat width); -GLAPI PFNGLLINEWIDTHPROC glad_glLineWidth; -#define glLineWidth glad_glLineWidth -typedef void (APIENTRYP PFNGLPOINTSIZEPROC)(GLfloat size); -GLAPI PFNGLPOINTSIZEPROC glad_glPointSize; -#define glPointSize glad_glPointSize -typedef void (APIENTRYP PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); -GLAPI PFNGLPOLYGONMODEPROC glad_glPolygonMode; -#define glPolygonMode glad_glPolygonMode -typedef void (APIENTRYP PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI PFNGLSCISSORPROC glad_glScissor; -#define glScissor glad_glScissor -typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); -GLAPI PFNGLTEXPARAMETERFPROC glad_glTexParameterf; -#define glTexParameterf glad_glTexParameterf -typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat *params); -GLAPI PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; -#define glTexParameterfv glad_glTexParameterfv -typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); -GLAPI PFNGLTEXPARAMETERIPROC glad_glTexParameteri; -#define glTexParameteri glad_glTexParameteri -typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint *params); -GLAPI PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; -#define glTexParameteriv glad_glTexParameteriv -typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXIMAGE1DPROC glad_glTexImage1D; -#define glTexImage1D glad_glTexImage1D -typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXIMAGE2DPROC glad_glTexImage2D; -#define glTexImage2D glad_glTexImage2D -typedef void (APIENTRYP PFNGLDRAWBUFFERPROC)(GLenum buf); -GLAPI PFNGLDRAWBUFFERPROC glad_glDrawBuffer; -#define glDrawBuffer glad_glDrawBuffer -typedef void (APIENTRYP PFNGLCLEARPROC)(GLbitfield mask); -GLAPI PFNGLCLEARPROC glad_glClear; -#define glClear glad_glClear -typedef void (APIENTRYP PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI PFNGLCLEARCOLORPROC glad_glClearColor; -#define glClearColor glad_glClearColor -typedef void (APIENTRYP PFNGLCLEARSTENCILPROC)(GLint s); -GLAPI PFNGLCLEARSTENCILPROC glad_glClearStencil; -#define glClearStencil glad_glClearStencil -typedef void (APIENTRYP PFNGLCLEARDEPTHPROC)(GLdouble depth); -GLAPI PFNGLCLEARDEPTHPROC glad_glClearDepth; -#define glClearDepth glad_glClearDepth -typedef void (APIENTRYP PFNGLSTENCILMASKPROC)(GLuint mask); -GLAPI PFNGLSTENCILMASKPROC glad_glStencilMask; -#define glStencilMask glad_glStencilMask -typedef void (APIENTRYP PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -GLAPI PFNGLCOLORMASKPROC glad_glColorMask; -#define glColorMask glad_glColorMask -typedef void (APIENTRYP PFNGLDEPTHMASKPROC)(GLboolean flag); -GLAPI PFNGLDEPTHMASKPROC glad_glDepthMask; -#define glDepthMask glad_glDepthMask -typedef void (APIENTRYP PFNGLDISABLEPROC)(GLenum cap); -GLAPI PFNGLDISABLEPROC glad_glDisable; -#define glDisable glad_glDisable -typedef void (APIENTRYP PFNGLENABLEPROC)(GLenum cap); -GLAPI PFNGLENABLEPROC glad_glEnable; -#define glEnable glad_glEnable -typedef void (APIENTRYP PFNGLFINISHPROC)(void); -GLAPI PFNGLFINISHPROC glad_glFinish; -#define glFinish glad_glFinish -typedef void (APIENTRYP PFNGLFLUSHPROC)(void); -GLAPI PFNGLFLUSHPROC glad_glFlush; -#define glFlush glad_glFlush -typedef void (APIENTRYP PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); -GLAPI PFNGLBLENDFUNCPROC glad_glBlendFunc; -#define glBlendFunc glad_glBlendFunc -typedef void (APIENTRYP PFNGLLOGICOPPROC)(GLenum opcode); -GLAPI PFNGLLOGICOPPROC glad_glLogicOp; -#define glLogicOp glad_glLogicOp -typedef void (APIENTRYP PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); -GLAPI PFNGLSTENCILFUNCPROC glad_glStencilFunc; -#define glStencilFunc glad_glStencilFunc -typedef void (APIENTRYP PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); -GLAPI PFNGLSTENCILOPPROC glad_glStencilOp; -#define glStencilOp glad_glStencilOp -typedef void (APIENTRYP PFNGLDEPTHFUNCPROC)(GLenum func); -GLAPI PFNGLDEPTHFUNCPROC glad_glDepthFunc; -#define glDepthFunc glad_glDepthFunc -typedef void (APIENTRYP PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); -GLAPI PFNGLPIXELSTOREFPROC glad_glPixelStoref; -#define glPixelStoref glad_glPixelStoref -typedef void (APIENTRYP PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); -GLAPI PFNGLPIXELSTOREIPROC glad_glPixelStorei; -#define glPixelStorei glad_glPixelStorei -typedef void (APIENTRYP PFNGLREADBUFFERPROC)(GLenum src); -GLAPI PFNGLREADBUFFERPROC glad_glReadBuffer; -#define glReadBuffer glad_glReadBuffer -typedef void (APIENTRYP PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); -GLAPI PFNGLREADPIXELSPROC glad_glReadPixels; -#define glReadPixels glad_glReadPixels -typedef void (APIENTRYP PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean *data); -GLAPI PFNGLGETBOOLEANVPROC glad_glGetBooleanv; -#define glGetBooleanv glad_glGetBooleanv -typedef void (APIENTRYP PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble *data); -GLAPI PFNGLGETDOUBLEVPROC glad_glGetDoublev; -#define glGetDoublev glad_glGetDoublev -typedef GLenum (APIENTRYP PFNGLGETERRORPROC)(void); -GLAPI PFNGLGETERRORPROC glad_glGetError; -#define glGetError glad_glGetError -typedef void (APIENTRYP PFNGLGETFLOATVPROC)(GLenum pname, GLfloat *data); -GLAPI PFNGLGETFLOATVPROC glad_glGetFloatv; -#define glGetFloatv glad_glGetFloatv -typedef void (APIENTRYP PFNGLGETINTEGERVPROC)(GLenum pname, GLint *data); -GLAPI PFNGLGETINTEGERVPROC glad_glGetIntegerv; -#define glGetIntegerv glad_glGetIntegerv -typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC)(GLenum name); -GLAPI PFNGLGETSTRINGPROC glad_glGetString; -#define glGetString glad_glGetString -typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void *pixels); -GLAPI PFNGLGETTEXIMAGEPROC glad_glGetTexImage; -#define glGetTexImage glad_glGetTexImage -typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat *params); -GLAPI PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; -#define glGetTexParameterfv glad_glGetTexParameterfv -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; -#define glGetTexParameteriv glad_glGetTexParameteriv -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; -#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; -#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv -typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC)(GLenum cap); -GLAPI PFNGLISENABLEDPROC glad_glIsEnabled; -#define glIsEnabled glad_glIsEnabled -typedef void (APIENTRYP PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); -GLAPI PFNGLDEPTHRANGEPROC glad_glDepthRange; -#define glDepthRange glad_glDepthRange -typedef void (APIENTRYP PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI PFNGLVIEWPORTPROC glad_glViewport; -#define glViewport glad_glViewport -#endif -#ifndef GL_VERSION_1_1 -#define GL_VERSION_1_1 1 -GLAPI int GLAD_GL_VERSION_1_1; -typedef void (APIENTRYP PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); -GLAPI PFNGLDRAWARRAYSPROC glad_glDrawArrays; -#define glDrawArrays glad_glDrawArrays -typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices); -GLAPI PFNGLDRAWELEMENTSPROC glad_glDrawElements; -#define glDrawElements glad_glDrawElements -typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); -GLAPI PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; -#define glPolygonOffset glad_glPolygonOffset -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; -#define glCopyTexImage1D glad_glCopyTexImage1D -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; -#define glCopyTexImage2D glad_glCopyTexImage2D -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; -#define glCopyTexSubImage1D glad_glCopyTexSubImage1D -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; -#define glCopyTexSubImage2D glad_glCopyTexSubImage2D -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; -#define glTexSubImage1D glad_glTexSubImage1D -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; -#define glTexSubImage2D glad_glTexSubImage2D -typedef void (APIENTRYP PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); -GLAPI PFNGLBINDTEXTUREPROC glad_glBindTexture; -#define glBindTexture glad_glBindTexture -typedef void (APIENTRYP PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint *textures); -GLAPI PFNGLDELETETEXTURESPROC glad_glDeleteTextures; -#define glDeleteTextures glad_glDeleteTextures -typedef void (APIENTRYP PFNGLGENTEXTURESPROC)(GLsizei n, GLuint *textures); -GLAPI PFNGLGENTEXTURESPROC glad_glGenTextures; -#define glGenTextures glad_glGenTextures -typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC)(GLuint texture); -GLAPI PFNGLISTEXTUREPROC glad_glIsTexture; -#define glIsTexture glad_glIsTexture -#endif -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -GLAPI int GLAD_GL_VERSION_1_2; -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); -GLAPI PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; -#define glDrawRangeElements glad_glDrawRangeElements -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXIMAGE3DPROC glad_glTexImage3D; -#define glTexImage3D glad_glTexImage3D -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); -GLAPI PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; -#define glTexSubImage3D glad_glTexSubImage3D -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; -#define glCopyTexSubImage3D glad_glCopyTexSubImage3D -#endif -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -GLAPI int GLAD_GL_VERSION_1_3; -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC)(GLenum texture); -GLAPI PFNGLACTIVETEXTUREPROC glad_glActiveTexture; -#define glActiveTexture glad_glActiveTexture -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); -GLAPI PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; -#define glSampleCoverage glad_glSampleCoverage -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; -#define glCompressedTexImage3D glad_glCompressedTexImage3D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; -#define glCompressedTexImage2D glad_glCompressedTexImage2D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; -#define glCompressedTexImage1D glad_glCompressedTexImage1D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; -#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; -#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); -GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; -#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void *img); -GLAPI PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; -#define glGetCompressedTexImage glad_glGetCompressedTexImage -#endif -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -GLAPI int GLAD_GL_VERSION_1_4; -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GLAPI PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; -#define glBlendFuncSeparate glad_glBlendFuncSeparate -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -GLAPI PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; -#define glMultiDrawArrays glad_glMultiDrawArrays -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); -GLAPI PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; -#define glMultiDrawElements glad_glMultiDrawElements -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); -GLAPI PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; -#define glPointParameterf glad_glPointParameterf -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat *params); -GLAPI PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; -#define glPointParameterfv glad_glPointParameterfv -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); -GLAPI PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; -#define glPointParameteri glad_glPointParameteri -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint *params); -GLAPI PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; -#define glPointParameteriv glad_glPointParameteriv -typedef void (APIENTRYP PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI PFNGLBLENDCOLORPROC glad_glBlendColor; -#define glBlendColor glad_glBlendColor -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC)(GLenum mode); -GLAPI PFNGLBLENDEQUATIONPROC glad_glBlendEquation; -#define glBlendEquation glad_glBlendEquation -#endif -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -GLAPI int GLAD_GL_VERSION_1_5; -typedef void (APIENTRYP PFNGLGENQUERIESPROC)(GLsizei n, GLuint *ids); -GLAPI PFNGLGENQUERIESPROC glad_glGenQueries; -#define glGenQueries glad_glGenQueries -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint *ids); -GLAPI PFNGLDELETEQUERIESPROC glad_glDeleteQueries; -#define glDeleteQueries glad_glDeleteQueries -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC)(GLuint id); -GLAPI PFNGLISQUERYPROC glad_glIsQuery; -#define glIsQuery glad_glIsQuery -typedef void (APIENTRYP PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); -GLAPI PFNGLBEGINQUERYPROC glad_glBeginQuery; -#define glBeginQuery glad_glBeginQuery -typedef void (APIENTRYP PFNGLENDQUERYPROC)(GLenum target); -GLAPI PFNGLENDQUERYPROC glad_glEndQuery; -#define glEndQuery glad_glEndQuery -typedef void (APIENTRYP PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETQUERYIVPROC glad_glGetQueryiv; -#define glGetQueryiv glad_glGetQueryiv -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint *params); -GLAPI PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; -#define glGetQueryObjectiv glad_glGetQueryObjectiv -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint *params); -GLAPI PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; -#define glGetQueryObjectuiv glad_glGetQueryObjectuiv -typedef void (APIENTRYP PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); -GLAPI PFNGLBINDBUFFERPROC glad_glBindBuffer; -#define glBindBuffer glad_glBindBuffer -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint *buffers); -GLAPI PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; -#define glDeleteBuffers glad_glDeleteBuffers -typedef void (APIENTRYP PFNGLGENBUFFERSPROC)(GLsizei n, GLuint *buffers); -GLAPI PFNGLGENBUFFERSPROC glad_glGenBuffers; -#define glGenBuffers glad_glGenBuffers -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC)(GLuint buffer); -GLAPI PFNGLISBUFFERPROC glad_glIsBuffer; -#define glIsBuffer glad_glIsBuffer -typedef void (APIENTRYP PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void *data, GLenum usage); -GLAPI PFNGLBUFFERDATAPROC glad_glBufferData; -#define glBufferData glad_glBufferData -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void *data); -GLAPI PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; -#define glBufferSubData glad_glBufferSubData -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void *data); -GLAPI PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; -#define glGetBufferSubData glad_glGetBufferSubData -typedef void * (APIENTRYP PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); -GLAPI PFNGLMAPBUFFERPROC glad_glMapBuffer; -#define glMapBuffer glad_glMapBuffer -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC)(GLenum target); -GLAPI PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; -#define glUnmapBuffer glad_glUnmapBuffer -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; -#define glGetBufferParameteriv glad_glGetBufferParameteriv -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void **params); -GLAPI PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; -#define glGetBufferPointerv glad_glGetBufferPointerv -#endif -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -GLAPI int GLAD_GL_VERSION_2_0; -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); -GLAPI PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; -#define glBlendEquationSeparate glad_glBlendEquationSeparate -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum *bufs); -GLAPI PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; -#define glDrawBuffers glad_glDrawBuffers -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; -#define glStencilOpSeparate glad_glStencilOpSeparate -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); -GLAPI PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; -#define glStencilFuncSeparate glad_glStencilFuncSeparate -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); -GLAPI PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; -#define glStencilMaskSeparate glad_glStencilMaskSeparate -typedef void (APIENTRYP PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); -GLAPI PFNGLATTACHSHADERPROC glad_glAttachShader; -#define glAttachShader glad_glAttachShader -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar *name); -GLAPI PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; -#define glBindAttribLocation glad_glBindAttribLocation -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC)(GLuint shader); -GLAPI PFNGLCOMPILESHADERPROC glad_glCompileShader; -#define glCompileShader glad_glCompileShader -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC)(void); -GLAPI PFNGLCREATEPROGRAMPROC glad_glCreateProgram; -#define glCreateProgram glad_glCreateProgram -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC)(GLenum type); -GLAPI PFNGLCREATESHADERPROC glad_glCreateShader; -#define glCreateShader glad_glCreateShader -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC)(GLuint program); -GLAPI PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; -#define glDeleteProgram glad_glDeleteProgram -typedef void (APIENTRYP PFNGLDELETESHADERPROC)(GLuint shader); -GLAPI PFNGLDELETESHADERPROC glad_glDeleteShader; -#define glDeleteShader glad_glDeleteShader -typedef void (APIENTRYP PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); -GLAPI PFNGLDETACHSHADERPROC glad_glDetachShader; -#define glDetachShader glad_glDetachShader -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); -GLAPI PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; -#define glDisableVertexAttribArray glad_glDisableVertexAttribArray -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); -GLAPI PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; -#define glEnableVertexAttribArray glad_glEnableVertexAttribArray -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; -#define glGetActiveAttrib glad_glGetActiveAttrib -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; -#define glGetActiveUniform glad_glGetActiveUniform -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); -GLAPI PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; -#define glGetAttachedShaders glad_glGetAttachedShaders -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar *name); -GLAPI PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; -#define glGetAttribLocation glad_glGetAttribLocation -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint *params); -GLAPI PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; -#define glGetProgramiv glad_glGetProgramiv -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; -#define glGetProgramInfoLog glad_glGetProgramInfoLog -typedef void (APIENTRYP PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params); -GLAPI PFNGLGETSHADERIVPROC glad_glGetShaderiv; -#define glGetShaderiv glad_glGetShaderiv -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; -#define glGetShaderInfoLog glad_glGetShaderInfoLog -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GLAPI PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; -#define glGetShaderSource glad_glGetShaderSource -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar *name); -GLAPI PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; -#define glGetUniformLocation glad_glGetUniformLocation -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat *params); -GLAPI PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; -#define glGetUniformfv glad_glGetUniformfv -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint *params); -GLAPI PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; -#define glGetUniformiv glad_glGetUniformiv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble *params); -GLAPI PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; -#define glGetVertexAttribdv glad_glGetVertexAttribdv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat *params); -GLAPI PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; -#define glGetVertexAttribfv glad_glGetVertexAttribfv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint *params); -GLAPI PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; -#define glGetVertexAttribiv glad_glGetVertexAttribiv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void **pointer); -GLAPI PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; -#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC)(GLuint program); -GLAPI PFNGLISPROGRAMPROC glad_glIsProgram; -#define glIsProgram glad_glIsProgram -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC)(GLuint shader); -GLAPI PFNGLISSHADERPROC glad_glIsShader; -#define glIsShader glad_glIsShader -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC)(GLuint program); -GLAPI PFNGLLINKPROGRAMPROC glad_glLinkProgram; -#define glLinkProgram glad_glLinkProgram -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); -GLAPI PFNGLSHADERSOURCEPROC glad_glShaderSource; -#define glShaderSource glad_glShaderSource -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC)(GLuint program); -GLAPI PFNGLUSEPROGRAMPROC glad_glUseProgram; -#define glUseProgram glad_glUseProgram -typedef void (APIENTRYP PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); -GLAPI PFNGLUNIFORM1FPROC glad_glUniform1f; -#define glUniform1f glad_glUniform1f -typedef void (APIENTRYP PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); -GLAPI PFNGLUNIFORM2FPROC glad_glUniform2f; -#define glUniform2f glad_glUniform2f -typedef void (APIENTRYP PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI PFNGLUNIFORM3FPROC glad_glUniform3f; -#define glUniform3f glad_glUniform3f -typedef void (APIENTRYP PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI PFNGLUNIFORM4FPROC glad_glUniform4f; -#define glUniform4f glad_glUniform4f -typedef void (APIENTRYP PFNGLUNIFORM1IPROC)(GLint location, GLint v0); -GLAPI PFNGLUNIFORM1IPROC glad_glUniform1i; -#define glUniform1i glad_glUniform1i -typedef void (APIENTRYP PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); -GLAPI PFNGLUNIFORM2IPROC glad_glUniform2i; -#define glUniform2i glad_glUniform2i -typedef void (APIENTRYP PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); -GLAPI PFNGLUNIFORM3IPROC glad_glUniform3i; -#define glUniform3i glad_glUniform3i -typedef void (APIENTRYP PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI PFNGLUNIFORM4IPROC glad_glUniform4i; -#define glUniform4i glad_glUniform4i -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLUNIFORM1FVPROC glad_glUniform1fv; -#define glUniform1fv glad_glUniform1fv -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLUNIFORM2FVPROC glad_glUniform2fv; -#define glUniform2fv glad_glUniform2fv -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLUNIFORM3FVPROC glad_glUniform3fv; -#define glUniform3fv glad_glUniform3fv -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat *value); -GLAPI PFNGLUNIFORM4FVPROC glad_glUniform4fv; -#define glUniform4fv glad_glUniform4fv -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLUNIFORM1IVPROC glad_glUniform1iv; -#define glUniform1iv glad_glUniform1iv -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLUNIFORM2IVPROC glad_glUniform2iv; -#define glUniform2iv glad_glUniform2iv -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLUNIFORM3IVPROC glad_glUniform3iv; -#define glUniform3iv glad_glUniform3iv -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint *value); -GLAPI PFNGLUNIFORM4IVPROC glad_glUniform4iv; -#define glUniform4iv glad_glUniform4iv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; -#define glUniformMatrix2fv glad_glUniformMatrix2fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; -#define glUniformMatrix3fv glad_glUniformMatrix3fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; -#define glUniformMatrix4fv glad_glUniformMatrix4fv -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC)(GLuint program); -GLAPI PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; -#define glValidateProgram glad_glValidateProgram -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); -GLAPI PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; -#define glVertexAttrib1d glad_glVertexAttrib1d -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble *v); -GLAPI PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; -#define glVertexAttrib1dv glad_glVertexAttrib1dv -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); -GLAPI PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; -#define glVertexAttrib1f glad_glVertexAttrib1f -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat *v); -GLAPI PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; -#define glVertexAttrib1fv glad_glVertexAttrib1fv -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); -GLAPI PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; -#define glVertexAttrib1s glad_glVertexAttrib1s -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; -#define glVertexAttrib1sv glad_glVertexAttrib1sv -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); -GLAPI PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; -#define glVertexAttrib2d glad_glVertexAttrib2d -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble *v); -GLAPI PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; -#define glVertexAttrib2dv glad_glVertexAttrib2dv -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); -GLAPI PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; -#define glVertexAttrib2f glad_glVertexAttrib2f -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat *v); -GLAPI PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; -#define glVertexAttrib2fv glad_glVertexAttrib2fv -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); -GLAPI PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; -#define glVertexAttrib2s glad_glVertexAttrib2s -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; -#define glVertexAttrib2sv glad_glVertexAttrib2sv -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; -#define glVertexAttrib3d glad_glVertexAttrib3d -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble *v); -GLAPI PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; -#define glVertexAttrib3dv glad_glVertexAttrib3dv -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; -#define glVertexAttrib3f glad_glVertexAttrib3f -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat *v); -GLAPI PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; -#define glVertexAttrib3fv glad_glVertexAttrib3fv -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; -#define glVertexAttrib3s glad_glVertexAttrib3s -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; -#define glVertexAttrib3sv glad_glVertexAttrib3sv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte *v); -GLAPI PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; -#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; -#define glVertexAttrib4Niv glad_glVertexAttrib4Niv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; -#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; -#define glVertexAttrib4Nub glad_glVertexAttrib4Nub -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte *v); -GLAPI PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; -#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; -#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort *v); -GLAPI PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; -#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte *v); -GLAPI PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; -#define glVertexAttrib4bv glad_glVertexAttrib4bv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; -#define glVertexAttrib4d glad_glVertexAttrib4d -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble *v); -GLAPI PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; -#define glVertexAttrib4dv glad_glVertexAttrib4dv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; -#define glVertexAttrib4f glad_glVertexAttrib4f -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat *v); -GLAPI PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; -#define glVertexAttrib4fv glad_glVertexAttrib4fv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; -#define glVertexAttrib4iv glad_glVertexAttrib4iv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; -#define glVertexAttrib4s glad_glVertexAttrib4s -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; -#define glVertexAttrib4sv glad_glVertexAttrib4sv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte *v); -GLAPI PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; -#define glVertexAttrib4ubv glad_glVertexAttrib4ubv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; -#define glVertexAttrib4uiv glad_glVertexAttrib4uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort *v); -GLAPI PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; -#define glVertexAttrib4usv glad_glVertexAttrib4usv -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); -GLAPI PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; -#define glVertexAttribPointer glad_glVertexAttribPointer -#endif -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -GLAPI int GLAD_GL_VERSION_2_1; -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; -#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; -#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; -#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; -#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; -#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; -#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv -#endif -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 -GLAPI int GLAD_GL_VERSION_3_0; -typedef void (APIENTRYP PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI PFNGLCOLORMASKIPROC glad_glColorMaski; -#define glColorMaski glad_glColorMaski -typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean *data); -GLAPI PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; -#define glGetBooleani_v glad_glGetBooleani_v -typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint *data); -GLAPI PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; -#define glGetIntegeri_v glad_glGetIntegeri_v -typedef void (APIENTRYP PFNGLENABLEIPROC)(GLenum target, GLuint index); -GLAPI PFNGLENABLEIPROC glad_glEnablei; -#define glEnablei glad_glEnablei -typedef void (APIENTRYP PFNGLDISABLEIPROC)(GLenum target, GLuint index); -GLAPI PFNGLDISABLEIPROC glad_glDisablei; -#define glDisablei glad_glDisablei -typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC)(GLenum target, GLuint index); -GLAPI PFNGLISENABLEDIPROC glad_glIsEnabledi; -#define glIsEnabledi glad_glIsEnabledi -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); -GLAPI PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; -#define glBeginTransformFeedback glad_glBeginTransformFeedback -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC)(void); -GLAPI PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; -#define glEndTransformFeedback glad_glEndTransformFeedback -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; -#define glBindBufferRange glad_glBindBufferRange -typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); -GLAPI PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; -#define glBindBufferBase glad_glBindBufferBase -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); -GLAPI PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; -#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; -#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying -typedef void (APIENTRYP PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); -GLAPI PFNGLCLAMPCOLORPROC glad_glClampColor; -#define glClampColor glad_glClampColor -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); -GLAPI PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; -#define glBeginConditionalRender glad_glBeginConditionalRender -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC)(void); -GLAPI PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; -#define glEndConditionalRender glad_glEndConditionalRender -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); -GLAPI PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; -#define glVertexAttribIPointer glad_glVertexAttribIPointer -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint *params); -GLAPI PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; -#define glGetVertexAttribIiv glad_glGetVertexAttribIiv -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint *params); -GLAPI PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; -#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); -GLAPI PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; -#define glVertexAttribI1i glad_glVertexAttribI1i -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); -GLAPI PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; -#define glVertexAttribI2i glad_glVertexAttribI2i -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); -GLAPI PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; -#define glVertexAttribI3i glad_glVertexAttribI3i -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; -#define glVertexAttribI4i glad_glVertexAttribI4i -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); -GLAPI PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; -#define glVertexAttribI1ui glad_glVertexAttribI1ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); -GLAPI PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; -#define glVertexAttribI2ui glad_glVertexAttribI2ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; -#define glVertexAttribI3ui glad_glVertexAttribI3ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; -#define glVertexAttribI4ui glad_glVertexAttribI4ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; -#define glVertexAttribI1iv glad_glVertexAttribI1iv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; -#define glVertexAttribI2iv glad_glVertexAttribI2iv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; -#define glVertexAttribI3iv glad_glVertexAttribI3iv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint *v); -GLAPI PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; -#define glVertexAttribI4iv glad_glVertexAttribI4iv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; -#define glVertexAttribI1uiv glad_glVertexAttribI1uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; -#define glVertexAttribI2uiv glad_glVertexAttribI2uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; -#define glVertexAttribI3uiv glad_glVertexAttribI3uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint *v); -GLAPI PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; -#define glVertexAttribI4uiv glad_glVertexAttribI4uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte *v); -GLAPI PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; -#define glVertexAttribI4bv glad_glVertexAttribI4bv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort *v); -GLAPI PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; -#define glVertexAttribI4sv glad_glVertexAttribI4sv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte *v); -GLAPI PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; -#define glVertexAttribI4ubv glad_glVertexAttribI4ubv -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort *v); -GLAPI PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; -#define glVertexAttribI4usv glad_glVertexAttribI4usv -typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint *params); -GLAPI PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; -#define glGetUniformuiv glad_glGetUniformuiv -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar *name); -GLAPI PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; -#define glBindFragDataLocation glad_glBindFragDataLocation -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar *name); -GLAPI PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; -#define glGetFragDataLocation glad_glGetFragDataLocation -typedef void (APIENTRYP PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); -GLAPI PFNGLUNIFORM1UIPROC glad_glUniform1ui; -#define glUniform1ui glad_glUniform1ui -typedef void (APIENTRYP PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); -GLAPI PFNGLUNIFORM2UIPROC glad_glUniform2ui; -#define glUniform2ui glad_glUniform2ui -typedef void (APIENTRYP PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI PFNGLUNIFORM3UIPROC glad_glUniform3ui; -#define glUniform3ui glad_glUniform3ui -typedef void (APIENTRYP PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI PFNGLUNIFORM4UIPROC glad_glUniform4ui; -#define glUniform4ui glad_glUniform4ui -typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; -#define glUniform1uiv glad_glUniform1uiv -typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; -#define glUniform2uiv glad_glUniform2uiv -typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; -#define glUniform3uiv glad_glUniform3uiv -typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint *value); -GLAPI PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; -#define glUniform4uiv glad_glUniform4uiv -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint *params); -GLAPI PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; -#define glTexParameterIiv glad_glTexParameterIiv -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint *params); -GLAPI PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; -#define glTexParameterIuiv glad_glTexParameterIuiv -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; -#define glGetTexParameterIiv glad_glGetTexParameterIiv -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint *params); -GLAPI PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; -#define glGetTexParameterIuiv glad_glGetTexParameterIuiv -typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; -#define glClearBufferiv glad_glClearBufferiv -typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; -#define glClearBufferuiv glad_glClearBufferuiv -typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; -#define glClearBufferfv glad_glClearBufferfv -typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; -#define glClearBufferfi glad_glClearBufferfi -typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); -GLAPI PFNGLGETSTRINGIPROC glad_glGetStringi; -#define glGetStringi glad_glGetStringi -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); -GLAPI PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; -#define glIsRenderbuffer glad_glIsRenderbuffer -typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); -GLAPI PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; -#define glBindRenderbuffer glad_glBindRenderbuffer -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers); -GLAPI PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; -#define glDeleteRenderbuffers glad_glDeleteRenderbuffers -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers); -GLAPI PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; -#define glGenRenderbuffers glad_glGenRenderbuffers -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; -#define glRenderbufferStorage glad_glRenderbufferStorage -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); -GLAPI PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; -#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); -GLAPI PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; -#define glIsFramebuffer glad_glIsFramebuffer -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); -GLAPI PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; -#define glBindFramebuffer glad_glBindFramebuffer -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers); -GLAPI PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; -#define glDeleteFramebuffers glad_glDeleteFramebuffers -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers); -GLAPI PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; -#define glGenFramebuffers glad_glGenFramebuffers -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); -GLAPI PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; -#define glCheckFramebufferStatus glad_glCheckFramebufferStatus -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; -#define glFramebufferTexture1D glad_glFramebufferTexture1D -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; -#define glFramebufferTexture2D glad_glFramebufferTexture2D -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; -#define glFramebufferTexture3D glad_glFramebufferTexture3D -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; -#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; -#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv -typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC)(GLenum target); -GLAPI PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; -#define glGenerateMipmap glad_glGenerateMipmap -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; -#define glBlitFramebuffer glad_glBlitFramebuffer -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; -#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; -#define glFramebufferTextureLayer glad_glFramebufferTextureLayer -typedef void * (APIENTRYP PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; -#define glMapBufferRange glad_glMapBufferRange -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); -GLAPI PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; -#define glFlushMappedBufferRange glad_glFlushMappedBufferRange -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC)(GLuint array); -GLAPI PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; -#define glBindVertexArray glad_glBindVertexArray -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint *arrays); -GLAPI PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; -#define glDeleteVertexArrays glad_glDeleteVertexArrays -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint *arrays); -GLAPI PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; -#define glGenVertexArrays glad_glGenVertexArrays -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC)(GLuint array); -GLAPI PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; -#define glIsVertexArray glad_glIsVertexArray -#endif -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 -GLAPI int GLAD_GL_VERSION_3_1; -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -GLAPI PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; -#define glDrawArraysInstanced glad_glDrawArraysInstanced -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); -GLAPI PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; -#define glDrawElementsInstanced glad_glDrawElementsInstanced -typedef void (APIENTRYP PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); -GLAPI PFNGLTEXBUFFERPROC glad_glTexBuffer; -#define glTexBuffer glad_glTexBuffer -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); -GLAPI PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; -#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex -typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; -#define glCopyBufferSubData glad_glCopyBufferSubData -typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); -GLAPI PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; -#define glGetUniformIndices glad_glGetUniformIndices -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -GLAPI PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; -#define glGetActiveUniformsiv glad_glGetActiveUniformsiv -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -GLAPI PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; -#define glGetActiveUniformName glad_glGetActiveUniformName -typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar *uniformBlockName); -GLAPI PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; -#define glGetUniformBlockIndex glad_glGetUniformBlockIndex -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -GLAPI PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; -#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -GLAPI PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; -#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName -typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -GLAPI PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; -#define glUniformBlockBinding glad_glUniformBlockBinding -#endif -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 -GLAPI int GLAD_GL_VERSION_3_2; -typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GLAPI PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; -#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); -GLAPI PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; -#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); -GLAPI PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; -#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); -GLAPI PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; -#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC)(GLenum mode); -GLAPI PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; -#define glProvokingVertex glad_glProvokingVertex -typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); -GLAPI PFNGLFENCESYNCPROC glad_glFenceSync; -#define glFenceSync glad_glFenceSync -typedef GLboolean (APIENTRYP PFNGLISSYNCPROC)(GLsync sync); -GLAPI PFNGLISSYNCPROC glad_glIsSync; -#define glIsSync glad_glIsSync -typedef void (APIENTRYP PFNGLDELETESYNCPROC)(GLsync sync); -GLAPI PFNGLDELETESYNCPROC glad_glDeleteSync; -#define glDeleteSync glad_glDeleteSync -typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; -#define glClientWaitSync glad_glClientWaitSync -typedef void (APIENTRYP PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI PFNGLWAITSYNCPROC glad_glWaitSync; -#define glWaitSync glad_glWaitSync -typedef void (APIENTRYP PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 *data); -GLAPI PFNGLGETINTEGER64VPROC glad_glGetInteger64v; -#define glGetInteger64v glad_glGetInteger64v -typedef void (APIENTRYP PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); -GLAPI PFNGLGETSYNCIVPROC glad_glGetSynciv; -#define glGetSynciv glad_glGetSynciv -typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 *data); -GLAPI PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; -#define glGetInteger64i_v glad_glGetInteger64i_v -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 *params); -GLAPI PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; -#define glGetBufferParameteri64v glad_glGetBufferParameteri64v -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; -#define glFramebufferTexture glad_glFramebufferTexture -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; -#define glTexImage2DMultisample glad_glTexImage2DMultisample -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; -#define glTexImage3DMultisample glad_glTexImage3DMultisample -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat *val); -GLAPI PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; -#define glGetMultisamplefv glad_glGetMultisamplefv -typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); -GLAPI PFNGLSAMPLEMASKIPROC glad_glSampleMaski; -#define glSampleMaski glad_glSampleMaski -#endif -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 -GLAPI int GLAD_GL_VERSION_3_3; -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -GLAPI PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; -#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed -typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar *name); -GLAPI PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; -#define glGetFragDataIndex glad_glGetFragDataIndex -typedef void (APIENTRYP PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint *samplers); -GLAPI PFNGLGENSAMPLERSPROC glad_glGenSamplers; -#define glGenSamplers glad_glGenSamplers -typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint *samplers); -GLAPI PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; -#define glDeleteSamplers glad_glDeleteSamplers -typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC)(GLuint sampler); -GLAPI PFNGLISSAMPLERPROC glad_glIsSampler; -#define glIsSampler glad_glIsSampler -typedef void (APIENTRYP PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); -GLAPI PFNGLBINDSAMPLERPROC glad_glBindSampler; -#define glBindSampler glad_glBindSampler -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); -GLAPI PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; -#define glSamplerParameteri glad_glSamplerParameteri -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint *param); -GLAPI PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; -#define glSamplerParameteriv glad_glSamplerParameteriv -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); -GLAPI PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; -#define glSamplerParameterf glad_glSamplerParameterf -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat *param); -GLAPI PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; -#define glSamplerParameterfv glad_glSamplerParameterfv -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint *param); -GLAPI PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; -#define glSamplerParameterIiv glad_glSamplerParameterIiv -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint *param); -GLAPI PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; -#define glSamplerParameterIuiv glad_glSamplerParameterIuiv -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint *params); -GLAPI PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; -#define glGetSamplerParameteriv glad_glGetSamplerParameteriv -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint *params); -GLAPI PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; -#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat *params); -GLAPI PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; -#define glGetSamplerParameterfv glad_glGetSamplerParameterfv -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint *params); -GLAPI PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; -#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv -typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); -GLAPI PFNGLQUERYCOUNTERPROC glad_glQueryCounter; -#define glQueryCounter glad_glQueryCounter -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 *params); -GLAPI PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; -#define glGetQueryObjecti64v glad_glGetQueryObjecti64v -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 *params); -GLAPI PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; -#define glGetQueryObjectui64v glad_glGetQueryObjectui64v -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); -GLAPI PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; -#define glVertexAttribDivisor glad_glVertexAttribDivisor -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; -#define glVertexAttribP1ui glad_glVertexAttribP1ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; -#define glVertexAttribP1uiv glad_glVertexAttribP1uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; -#define glVertexAttribP2ui glad_glVertexAttribP2ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; -#define glVertexAttribP2uiv glad_glVertexAttribP2uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; -#define glVertexAttribP3ui glad_glVertexAttribP3ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; -#define glVertexAttribP3uiv glad_glVertexAttribP3uiv -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; -#define glVertexAttribP4ui glad_glVertexAttribP4ui -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; -#define glVertexAttribP4uiv glad_glVertexAttribP4uiv -typedef void (APIENTRYP PFNGLVERTEXP2UIPROC)(GLenum type, GLuint value); -GLAPI PFNGLVERTEXP2UIPROC glad_glVertexP2ui; -#define glVertexP2ui glad_glVertexP2ui -typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC)(GLenum type, const GLuint *value); -GLAPI PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv; -#define glVertexP2uiv glad_glVertexP2uiv -typedef void (APIENTRYP PFNGLVERTEXP3UIPROC)(GLenum type, GLuint value); -GLAPI PFNGLVERTEXP3UIPROC glad_glVertexP3ui; -#define glVertexP3ui glad_glVertexP3ui -typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC)(GLenum type, const GLuint *value); -GLAPI PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv; -#define glVertexP3uiv glad_glVertexP3uiv -typedef void (APIENTRYP PFNGLVERTEXP4UIPROC)(GLenum type, GLuint value); -GLAPI PFNGLVERTEXP4UIPROC glad_glVertexP4ui; -#define glVertexP4ui glad_glVertexP4ui -typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC)(GLenum type, const GLuint *value); -GLAPI PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv; -#define glVertexP4uiv glad_glVertexP4uiv -typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui; -#define glTexCoordP1ui glad_glTexCoordP1ui -typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv; -#define glTexCoordP1uiv glad_glTexCoordP1uiv -typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui; -#define glTexCoordP2ui glad_glTexCoordP2ui -typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv; -#define glTexCoordP2uiv glad_glTexCoordP2uiv -typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui; -#define glTexCoordP3ui glad_glTexCoordP3ui -typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv; -#define glTexCoordP3uiv glad_glTexCoordP3uiv -typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui; -#define glTexCoordP4ui glad_glTexCoordP4ui -typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv; -#define glTexCoordP4uiv glad_glTexCoordP4uiv -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC)(GLenum texture, GLenum type, GLuint coords); -GLAPI PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui; -#define glMultiTexCoordP1ui glad_glMultiTexCoordP1ui -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); -GLAPI PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv; -#define glMultiTexCoordP1uiv glad_glMultiTexCoordP1uiv -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC)(GLenum texture, GLenum type, GLuint coords); -GLAPI PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui; -#define glMultiTexCoordP2ui glad_glMultiTexCoordP2ui -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); -GLAPI PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv; -#define glMultiTexCoordP2uiv glad_glMultiTexCoordP2uiv -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC)(GLenum texture, GLenum type, GLuint coords); -GLAPI PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui; -#define glMultiTexCoordP3ui glad_glMultiTexCoordP3ui -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); -GLAPI PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv; -#define glMultiTexCoordP3uiv glad_glMultiTexCoordP3uiv -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC)(GLenum texture, GLenum type, GLuint coords); -GLAPI PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui; -#define glMultiTexCoordP4ui glad_glMultiTexCoordP4ui -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); -GLAPI PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv; -#define glMultiTexCoordP4uiv glad_glMultiTexCoordP4uiv -typedef void (APIENTRYP PFNGLNORMALP3UIPROC)(GLenum type, GLuint coords); -GLAPI PFNGLNORMALP3UIPROC glad_glNormalP3ui; -#define glNormalP3ui glad_glNormalP3ui -typedef void (APIENTRYP PFNGLNORMALP3UIVPROC)(GLenum type, const GLuint *coords); -GLAPI PFNGLNORMALP3UIVPROC glad_glNormalP3uiv; -#define glNormalP3uiv glad_glNormalP3uiv -typedef void (APIENTRYP PFNGLCOLORP3UIPROC)(GLenum type, GLuint color); -GLAPI PFNGLCOLORP3UIPROC glad_glColorP3ui; -#define glColorP3ui glad_glColorP3ui -typedef void (APIENTRYP PFNGLCOLORP3UIVPROC)(GLenum type, const GLuint *color); -GLAPI PFNGLCOLORP3UIVPROC glad_glColorP3uiv; -#define glColorP3uiv glad_glColorP3uiv -typedef void (APIENTRYP PFNGLCOLORP4UIPROC)(GLenum type, GLuint color); -GLAPI PFNGLCOLORP4UIPROC glad_glColorP4ui; -#define glColorP4ui glad_glColorP4ui -typedef void (APIENTRYP PFNGLCOLORP4UIVPROC)(GLenum type, const GLuint *color); -GLAPI PFNGLCOLORP4UIVPROC glad_glColorP4uiv; -#define glColorP4uiv glad_glColorP4uiv -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC)(GLenum type, GLuint color); -GLAPI PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui; -#define glSecondaryColorP3ui glad_glSecondaryColorP3ui -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint *color); -GLAPI PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv; -#define glSecondaryColorP3uiv glad_glSecondaryColorP3uiv -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/deps/glad/src/CMakeLists.txt b/deps/glad/src/CMakeLists.txt deleted file mode 100644 index a7a08b3e5..000000000 --- a/deps/glad/src/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -cmake_minimum_required(VERSION 3.5) - -# Create a library for the viewer code -add_library( - glad - glad.c - ) - -# Are we building a shared library? -get_target_property(library_type glad TYPE) -if (library_type STREQUAL SHARED_LIBRARY) - # If so, define the macro GLAD_API_EXPORT on the command line. - target_compile_definitions(glad PUBLIC GLAD_GLAPI_EXPORT PRIVATE GLAD_GLAPI_EXPORT_BUILD) -endif() - -target_include_directories(glad PUBLIC "../include") - -set_target_properties(glad PROPERTIES POSITION_INDEPENDENT_CODE TRUE) diff --git a/deps/glad/src/glad.c b/deps/glad/src/glad.c deleted file mode 100644 index b2b3aef20..000000000 --- a/deps/glad/src/glad.c +++ /dev/null @@ -1,1140 +0,0 @@ -/* - - OpenGL loader generated by glad 0.1.34 on Sat Aug 14 14:33:57 2021. - - Language/Generator: C/C++ - Specification: gl - APIs: gl=3.3 - Profile: core - Extensions: - - Loader: True - Local files: False - Omit khrplatform: False - Reproducible: False - - Commandline: - --profile="core" --api="gl=3.3" --generator="c" --spec="gl" --extensions="" - Online: - https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D3.3 -*/ - -#include -#include -#include -#include - -static void* get_proc(const char *namez); - -#if defined(_WIN32) || defined(__CYGWIN__) -#ifndef _WINDOWS_ -#undef APIENTRY -#endif -#include -static HMODULE libGL; - -typedef void* (APIENTRYP PFNWGLGETPROCADDRESSPROC_PRIVATE)(const char*); -static PFNWGLGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr; - -#ifdef _MSC_VER -#ifdef __has_include - #if __has_include() - #define HAVE_WINAPIFAMILY 1 - #endif -#elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ - #define HAVE_WINAPIFAMILY 1 -#endif -#endif - -#ifdef HAVE_WINAPIFAMILY - #include - #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) - #define IS_UWP 1 - #endif -#endif - -static -int open_gl(void) { -#ifndef IS_UWP - libGL = LoadLibraryW(L"opengl32.dll"); - if(libGL != NULL) { - void (* tmp)(void); - tmp = (void(*)(void)) GetProcAddress(libGL, "wglGetProcAddress"); - gladGetProcAddressPtr = (PFNWGLGETPROCADDRESSPROC_PRIVATE) tmp; - return gladGetProcAddressPtr != NULL; - } -#endif - - return 0; -} - -static -void close_gl(void) { - if(libGL != NULL) { - FreeLibrary((HMODULE) libGL); - libGL = NULL; - } -} -#else -#include -static void* libGL; - -#if !defined(__APPLE__) && !defined(__HAIKU__) -typedef void* (APIENTRYP PFNGLXGETPROCADDRESSPROC_PRIVATE)(const char*); -static PFNGLXGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr; -#endif - -static -int open_gl(void) { -#ifdef __APPLE__ - static const char *NAMES[] = { - "../Frameworks/OpenGL.framework/OpenGL", - "/Library/Frameworks/OpenGL.framework/OpenGL", - "/System/Library/Frameworks/OpenGL.framework/OpenGL", - "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" - }; -#else - static const char *NAMES[] = {"libGL.so.1", "libGL.so"}; -#endif - - unsigned int index = 0; - for(index = 0; index < (sizeof(NAMES) / sizeof(NAMES[0])); index++) { - libGL = dlopen(NAMES[index], RTLD_NOW | RTLD_GLOBAL); - - if(libGL != NULL) { -#if defined(__APPLE__) || defined(__HAIKU__) - return 1; -#else - gladGetProcAddressPtr = (PFNGLXGETPROCADDRESSPROC_PRIVATE)dlsym(libGL, - "glXGetProcAddressARB"); - return gladGetProcAddressPtr != NULL; -#endif - } - } - - return 0; -} - -static -void close_gl(void) { - if(libGL != NULL) { - dlclose(libGL); - libGL = NULL; - } -} -#endif - -static -void* get_proc(const char *namez) { - void* result = NULL; - if(libGL == NULL) return NULL; - -#if !defined(__APPLE__) && !defined(__HAIKU__) - if(gladGetProcAddressPtr != NULL) { - result = gladGetProcAddressPtr(namez); - } -#endif - if(result == NULL) { -#if defined(_WIN32) || defined(__CYGWIN__) - result = (void*)GetProcAddress((HMODULE) libGL, namez); -#else - result = dlsym(libGL, namez); -#endif - } - - return result; -} - -int gladLoadGL(void) { - int status = 0; - - if(open_gl()) { - status = gladLoadGLLoader(&get_proc); - close_gl(); - } - - return status; -} - -struct gladGLversionStruct GLVersion = { 0, 0 }; - -#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) -#define _GLAD_IS_SOME_NEW_VERSION 1 -#endif - -static int max_loaded_major; -static int max_loaded_minor; - -static const char *exts = NULL; -static int num_exts_i = 0; -static char **exts_i = NULL; - -static int get_exts(void) { -#ifdef _GLAD_IS_SOME_NEW_VERSION - if(max_loaded_major < 3) { -#endif - exts = (const char *)glGetString(GL_EXTENSIONS); -#ifdef _GLAD_IS_SOME_NEW_VERSION - } else { - unsigned int index; - - num_exts_i = 0; - glGetIntegerv(GL_NUM_EXTENSIONS, &num_exts_i); - if (num_exts_i > 0) { - exts_i = (char **)malloc((size_t)num_exts_i * (sizeof *exts_i)); - } - - if (exts_i == NULL) { - return 0; - } - - for(index = 0; index < (unsigned)num_exts_i; index++) { - const char *gl_str_tmp = (const char*)glGetStringi(GL_EXTENSIONS, index); - size_t len = strlen(gl_str_tmp); - - char *local_str = (char*)malloc((len+1) * sizeof(char)); - if(local_str != NULL) { - memcpy(local_str, gl_str_tmp, (len+1) * sizeof(char)); - } - exts_i[index] = local_str; - } - } -#endif - return 1; -} - -static void free_exts(void) { - if (exts_i != NULL) { - int index; - for(index = 0; index < num_exts_i; index++) { - free((char *)exts_i[index]); - } - free((void *)exts_i); - exts_i = NULL; - } -} - -static int has_ext(const char *ext) { -#ifdef _GLAD_IS_SOME_NEW_VERSION - if(max_loaded_major < 3) { -#endif - const char *extensions; - const char *loc; - const char *terminator; - extensions = exts; - if(extensions == NULL || ext == NULL) { - return 0; - } - - while(1) { - loc = strstr(extensions, ext); - if(loc == NULL) { - return 0; - } - - terminator = loc + strlen(ext); - if((loc == extensions || *(loc - 1) == ' ') && - (*terminator == ' ' || *terminator == '\0')) { - return 1; - } - extensions = terminator; - } -#ifdef _GLAD_IS_SOME_NEW_VERSION - } else { - int index; - if(exts_i == NULL) return 0; - for(index = 0; index < num_exts_i; index++) { - const char *e = exts_i[index]; - - if(exts_i[index] != NULL && strcmp(e, ext) == 0) { - return 1; - } - } - } -#endif - - return 0; -} -int GLAD_GL_VERSION_1_0 = 0; -int GLAD_GL_VERSION_1_1 = 0; -int GLAD_GL_VERSION_1_2 = 0; -int GLAD_GL_VERSION_1_3 = 0; -int GLAD_GL_VERSION_1_4 = 0; -int GLAD_GL_VERSION_1_5 = 0; -int GLAD_GL_VERSION_2_0 = 0; -int GLAD_GL_VERSION_2_1 = 0; -int GLAD_GL_VERSION_3_0 = 0; -int GLAD_GL_VERSION_3_1 = 0; -int GLAD_GL_VERSION_3_2 = 0; -int GLAD_GL_VERSION_3_3 = 0; -PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; -PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; -PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL; -PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; -PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; -PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; -PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; -PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL; -PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; -PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL; -PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL; -PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; -PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; -PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; -PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; -PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; -PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; -PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; -PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; -PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; -PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; -PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; -PFNGLBUFFERDATAPROC glad_glBufferData = NULL; -PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; -PFNGLCLAMPCOLORPROC glad_glClampColor = NULL; -PFNGLCLEARPROC glad_glClear = NULL; -PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; -PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; -PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; -PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; -PFNGLCLEARCOLORPROC glad_glClearColor = NULL; -PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL; -PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; -PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; -PFNGLCOLORMASKPROC glad_glColorMask = NULL; -PFNGLCOLORMASKIPROC glad_glColorMaski = NULL; -PFNGLCOLORP3UIPROC glad_glColorP3ui = NULL; -PFNGLCOLORP3UIVPROC glad_glColorP3uiv = NULL; -PFNGLCOLORP4UIPROC glad_glColorP4ui = NULL; -PFNGLCOLORP4UIVPROC glad_glColorP4uiv = NULL; -PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; -PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; -PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; -PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL; -PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; -PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL; -PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; -PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; -PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; -PFNGLCREATESHADERPROC glad_glCreateShader = NULL; -PFNGLCULLFACEPROC glad_glCullFace = NULL; -PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; -PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; -PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; -PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; -PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; -PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; -PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; -PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; -PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; -PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; -PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; -PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; -PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL; -PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; -PFNGLDISABLEPROC glad_glDisable = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; -PFNGLDISABLEIPROC glad_glDisablei = NULL; -PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; -PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; -PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL; -PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; -PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; -PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL; -PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; -PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL; -PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; -PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL; -PFNGLENABLEPROC glad_glEnable = NULL; -PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; -PFNGLENABLEIPROC glad_glEnablei = NULL; -PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL; -PFNGLENDQUERYPROC glad_glEndQuery = NULL; -PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; -PFNGLFENCESYNCPROC glad_glFenceSync = NULL; -PFNGLFINISHPROC glad_glFinish = NULL; -PFNGLFLUSHPROC glad_glFlush = NULL; -PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; -PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; -PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL; -PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL; -PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; -PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; -PFNGLFRONTFACEPROC glad_glFrontFace = NULL; -PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; -PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; -PFNGLGENQUERIESPROC glad_glGenQueries = NULL; -PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; -PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; -PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; -PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; -PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; -PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; -PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; -PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; -PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; -PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName = NULL; -PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL; -PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; -PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; -PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v = NULL; -PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; -PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL; -PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; -PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; -PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL; -PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL; -PFNGLGETERRORPROC glad_glGetError = NULL; -PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; -PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL; -PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; -PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; -PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; -PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; -PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; -PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL; -PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; -PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; -PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL; -PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL; -PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL; -PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL; -PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; -PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv = NULL; -PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL; -PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; -PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; -PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; -PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; -PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; -PFNGLGETSTRINGPROC glad_glGetString = NULL; -PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; -PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; -PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL; -PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL; -PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL; -PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv = NULL; -PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv = NULL; -PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; -PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; -PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; -PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; -PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; -PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; -PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; -PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; -PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; -PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; -PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; -PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL; -PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; -PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; -PFNGLHINTPROC glad_glHint = NULL; -PFNGLISBUFFERPROC glad_glIsBuffer = NULL; -PFNGLISENABLEDPROC glad_glIsEnabled = NULL; -PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL; -PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; -PFNGLISPROGRAMPROC glad_glIsProgram = NULL; -PFNGLISQUERYPROC glad_glIsQuery = NULL; -PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; -PFNGLISSAMPLERPROC glad_glIsSampler = NULL; -PFNGLISSHADERPROC glad_glIsShader = NULL; -PFNGLISSYNCPROC glad_glIsSync = NULL; -PFNGLISTEXTUREPROC glad_glIsTexture = NULL; -PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; -PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; -PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; -PFNGLLOGICOPPROC glad_glLogicOp = NULL; -PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL; -PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; -PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL; -PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL; -PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL; -PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui = NULL; -PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv = NULL; -PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui = NULL; -PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv = NULL; -PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui = NULL; -PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv = NULL; -PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui = NULL; -PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv = NULL; -PFNGLNORMALP3UIPROC glad_glNormalP3ui = NULL; -PFNGLNORMALP3UIVPROC glad_glNormalP3uiv = NULL; -PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL; -PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; -PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL; -PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL; -PFNGLPOINTPARAMETERIPROC glad_glPointParameteri = NULL; -PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL; -PFNGLPOINTSIZEPROC glad_glPointSize = NULL; -PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL; -PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; -PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL; -PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL; -PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL; -PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; -PFNGLREADPIXELSPROC glad_glReadPixels = NULL; -PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; -PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; -PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL; -PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL; -PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv = NULL; -PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL; -PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; -PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; -PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; -PFNGLSCISSORPROC glad_glScissor = NULL; -PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui = NULL; -PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv = NULL; -PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; -PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; -PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; -PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; -PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; -PFNGLSTENCILOPPROC glad_glStencilOp = NULL; -PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; -PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL; -PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui = NULL; -PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv = NULL; -PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui = NULL; -PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv = NULL; -PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui = NULL; -PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv = NULL; -PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui = NULL; -PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv = NULL; -PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL; -PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; -PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample = NULL; -PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL; -PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample = NULL; -PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv = NULL; -PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv = NULL; -PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; -PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; -PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; -PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; -PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL; -PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; -PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; -PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; -PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; -PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; -PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; -PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; -PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; -PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; -PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; -PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; -PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; -PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; -PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; -PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; -PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; -PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; -PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; -PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; -PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; -PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; -PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; -PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; -PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; -PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; -PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; -PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; -PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; -PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; -PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; -PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; -PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; -PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; -PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; -PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; -PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; -PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; -PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; -PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; -PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL; -PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL; -PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; -PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; -PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL; -PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL; -PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL; -PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL; -PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; -PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; -PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL; -PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL; -PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL; -PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL; -PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; -PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; -PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL; -PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL; -PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL; -PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL; -PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL; -PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL; -PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL; -PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL; -PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL; -PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL; -PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL; -PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL; -PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; -PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; -PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL; -PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL; -PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL; -PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL; -PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL; -PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL; -PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; -PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL; -PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL; -PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL; -PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv = NULL; -PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i = NULL; -PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv = NULL; -PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui = NULL; -PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv = NULL; -PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i = NULL; -PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv = NULL; -PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui = NULL; -PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv = NULL; -PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv = NULL; -PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL; -PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL; -PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv = NULL; -PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL; -PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; -PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; -PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL; -PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; -PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL; -PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL; -PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL; -PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv = NULL; -PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui = NULL; -PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL; -PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL; -PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL; -PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; -PFNGLVERTEXP2UIPROC glad_glVertexP2ui = NULL; -PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv = NULL; -PFNGLVERTEXP3UIPROC glad_glVertexP3ui = NULL; -PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv = NULL; -PFNGLVERTEXP4UIPROC glad_glVertexP4ui = NULL; -PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv = NULL; -PFNGLVIEWPORTPROC glad_glViewport = NULL; -PFNGLWAITSYNCPROC glad_glWaitSync = NULL; -static void load_GL_VERSION_1_0(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_0) return; - glad_glCullFace = (PFNGLCULLFACEPROC)load("glCullFace"); - glad_glFrontFace = (PFNGLFRONTFACEPROC)load("glFrontFace"); - glad_glHint = (PFNGLHINTPROC)load("glHint"); - glad_glLineWidth = (PFNGLLINEWIDTHPROC)load("glLineWidth"); - glad_glPointSize = (PFNGLPOINTSIZEPROC)load("glPointSize"); - glad_glPolygonMode = (PFNGLPOLYGONMODEPROC)load("glPolygonMode"); - glad_glScissor = (PFNGLSCISSORPROC)load("glScissor"); - glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC)load("glTexParameterf"); - glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC)load("glTexParameterfv"); - glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC)load("glTexParameteri"); - glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC)load("glTexParameteriv"); - glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC)load("glTexImage1D"); - glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC)load("glTexImage2D"); - glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC)load("glDrawBuffer"); - glad_glClear = (PFNGLCLEARPROC)load("glClear"); - glad_glClearColor = (PFNGLCLEARCOLORPROC)load("glClearColor"); - glad_glClearStencil = (PFNGLCLEARSTENCILPROC)load("glClearStencil"); - glad_glClearDepth = (PFNGLCLEARDEPTHPROC)load("glClearDepth"); - glad_glStencilMask = (PFNGLSTENCILMASKPROC)load("glStencilMask"); - glad_glColorMask = (PFNGLCOLORMASKPROC)load("glColorMask"); - glad_glDepthMask = (PFNGLDEPTHMASKPROC)load("glDepthMask"); - glad_glDisable = (PFNGLDISABLEPROC)load("glDisable"); - glad_glEnable = (PFNGLENABLEPROC)load("glEnable"); - glad_glFinish = (PFNGLFINISHPROC)load("glFinish"); - glad_glFlush = (PFNGLFLUSHPROC)load("glFlush"); - glad_glBlendFunc = (PFNGLBLENDFUNCPROC)load("glBlendFunc"); - glad_glLogicOp = (PFNGLLOGICOPPROC)load("glLogicOp"); - glad_glStencilFunc = (PFNGLSTENCILFUNCPROC)load("glStencilFunc"); - glad_glStencilOp = (PFNGLSTENCILOPPROC)load("glStencilOp"); - glad_glDepthFunc = (PFNGLDEPTHFUNCPROC)load("glDepthFunc"); - glad_glPixelStoref = (PFNGLPIXELSTOREFPROC)load("glPixelStoref"); - glad_glPixelStorei = (PFNGLPIXELSTOREIPROC)load("glPixelStorei"); - glad_glReadBuffer = (PFNGLREADBUFFERPROC)load("glReadBuffer"); - glad_glReadPixels = (PFNGLREADPIXELSPROC)load("glReadPixels"); - glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC)load("glGetBooleanv"); - glad_glGetDoublev = (PFNGLGETDOUBLEVPROC)load("glGetDoublev"); - glad_glGetError = (PFNGLGETERRORPROC)load("glGetError"); - glad_glGetFloatv = (PFNGLGETFLOATVPROC)load("glGetFloatv"); - glad_glGetIntegerv = (PFNGLGETINTEGERVPROC)load("glGetIntegerv"); - glad_glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); - glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC)load("glGetTexImage"); - glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC)load("glGetTexParameterfv"); - glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC)load("glGetTexParameteriv"); - glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC)load("glGetTexLevelParameterfv"); - glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC)load("glGetTexLevelParameteriv"); - glad_glIsEnabled = (PFNGLISENABLEDPROC)load("glIsEnabled"); - glad_glDepthRange = (PFNGLDEPTHRANGEPROC)load("glDepthRange"); - glad_glViewport = (PFNGLVIEWPORTPROC)load("glViewport"); -} -static void load_GL_VERSION_1_1(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_1) return; - glad_glDrawArrays = (PFNGLDRAWARRAYSPROC)load("glDrawArrays"); - glad_glDrawElements = (PFNGLDRAWELEMENTSPROC)load("glDrawElements"); - glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC)load("glPolygonOffset"); - glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)load("glCopyTexImage1D"); - glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)load("glCopyTexImage2D"); - glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)load("glCopyTexSubImage1D"); - glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)load("glCopyTexSubImage2D"); - glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)load("glTexSubImage1D"); - glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)load("glTexSubImage2D"); - glad_glBindTexture = (PFNGLBINDTEXTUREPROC)load("glBindTexture"); - glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC)load("glDeleteTextures"); - glad_glGenTextures = (PFNGLGENTEXTURESPROC)load("glGenTextures"); - glad_glIsTexture = (PFNGLISTEXTUREPROC)load("glIsTexture"); -} -static void load_GL_VERSION_1_2(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_2) return; - glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)load("glDrawRangeElements"); - glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC)load("glTexImage3D"); - glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)load("glTexSubImage3D"); - glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)load("glCopyTexSubImage3D"); -} -static void load_GL_VERSION_1_3(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_3) return; - glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)load("glActiveTexture"); - glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)load("glSampleCoverage"); - glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)load("glCompressedTexImage3D"); - glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)load("glCompressedTexImage2D"); - glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)load("glCompressedTexImage1D"); - glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)load("glCompressedTexSubImage3D"); - glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)load("glCompressedTexSubImage2D"); - glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)load("glCompressedTexSubImage1D"); - glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)load("glGetCompressedTexImage"); -} -static void load_GL_VERSION_1_4(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_4) return; - glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)load("glBlendFuncSeparate"); - glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)load("glMultiDrawArrays"); - glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)load("glMultiDrawElements"); - glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC)load("glPointParameterf"); - glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)load("glPointParameterfv"); - glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC)load("glPointParameteri"); - glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)load("glPointParameteriv"); - glad_glBlendColor = (PFNGLBLENDCOLORPROC)load("glBlendColor"); - glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)load("glBlendEquation"); -} -static void load_GL_VERSION_1_5(GLADloadproc load) { - if(!GLAD_GL_VERSION_1_5) return; - glad_glGenQueries = (PFNGLGENQUERIESPROC)load("glGenQueries"); - glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC)load("glDeleteQueries"); - glad_glIsQuery = (PFNGLISQUERYPROC)load("glIsQuery"); - glad_glBeginQuery = (PFNGLBEGINQUERYPROC)load("glBeginQuery"); - glad_glEndQuery = (PFNGLENDQUERYPROC)load("glEndQuery"); - glad_glGetQueryiv = (PFNGLGETQUERYIVPROC)load("glGetQueryiv"); - glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)load("glGetQueryObjectiv"); - glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)load("glGetQueryObjectuiv"); - glad_glBindBuffer = (PFNGLBINDBUFFERPROC)load("glBindBuffer"); - glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)load("glDeleteBuffers"); - glad_glGenBuffers = (PFNGLGENBUFFERSPROC)load("glGenBuffers"); - glad_glIsBuffer = (PFNGLISBUFFERPROC)load("glIsBuffer"); - glad_glBufferData = (PFNGLBUFFERDATAPROC)load("glBufferData"); - glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)load("glBufferSubData"); - glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)load("glGetBufferSubData"); - glad_glMapBuffer = (PFNGLMAPBUFFERPROC)load("glMapBuffer"); - glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)load("glUnmapBuffer"); - glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)load("glGetBufferParameteriv"); - glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)load("glGetBufferPointerv"); -} -static void load_GL_VERSION_2_0(GLADloadproc load) { - if(!GLAD_GL_VERSION_2_0) return; - glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)load("glBlendEquationSeparate"); - glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC)load("glDrawBuffers"); - glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)load("glStencilOpSeparate"); - glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)load("glStencilFuncSeparate"); - glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)load("glStencilMaskSeparate"); - glad_glAttachShader = (PFNGLATTACHSHADERPROC)load("glAttachShader"); - glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)load("glBindAttribLocation"); - glad_glCompileShader = (PFNGLCOMPILESHADERPROC)load("glCompileShader"); - glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)load("glCreateProgram"); - glad_glCreateShader = (PFNGLCREATESHADERPROC)load("glCreateShader"); - glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC)load("glDeleteProgram"); - glad_glDeleteShader = (PFNGLDELETESHADERPROC)load("glDeleteShader"); - glad_glDetachShader = (PFNGLDETACHSHADERPROC)load("glDetachShader"); - glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)load("glDisableVertexAttribArray"); - glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)load("glEnableVertexAttribArray"); - glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)load("glGetActiveAttrib"); - glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)load("glGetActiveUniform"); - glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)load("glGetAttachedShaders"); - glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)load("glGetAttribLocation"); - glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC)load("glGetProgramiv"); - glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)load("glGetProgramInfoLog"); - glad_glGetShaderiv = (PFNGLGETSHADERIVPROC)load("glGetShaderiv"); - glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)load("glGetShaderInfoLog"); - glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)load("glGetShaderSource"); - glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)load("glGetUniformLocation"); - glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)load("glGetUniformfv"); - glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)load("glGetUniformiv"); - glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)load("glGetVertexAttribdv"); - glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)load("glGetVertexAttribfv"); - glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)load("glGetVertexAttribiv"); - glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)load("glGetVertexAttribPointerv"); - glad_glIsProgram = (PFNGLISPROGRAMPROC)load("glIsProgram"); - glad_glIsShader = (PFNGLISSHADERPROC)load("glIsShader"); - glad_glLinkProgram = (PFNGLLINKPROGRAMPROC)load("glLinkProgram"); - glad_glShaderSource = (PFNGLSHADERSOURCEPROC)load("glShaderSource"); - glad_glUseProgram = (PFNGLUSEPROGRAMPROC)load("glUseProgram"); - glad_glUniform1f = (PFNGLUNIFORM1FPROC)load("glUniform1f"); - glad_glUniform2f = (PFNGLUNIFORM2FPROC)load("glUniform2f"); - glad_glUniform3f = (PFNGLUNIFORM3FPROC)load("glUniform3f"); - glad_glUniform4f = (PFNGLUNIFORM4FPROC)load("glUniform4f"); - glad_glUniform1i = (PFNGLUNIFORM1IPROC)load("glUniform1i"); - glad_glUniform2i = (PFNGLUNIFORM2IPROC)load("glUniform2i"); - glad_glUniform3i = (PFNGLUNIFORM3IPROC)load("glUniform3i"); - glad_glUniform4i = (PFNGLUNIFORM4IPROC)load("glUniform4i"); - glad_glUniform1fv = (PFNGLUNIFORM1FVPROC)load("glUniform1fv"); - glad_glUniform2fv = (PFNGLUNIFORM2FVPROC)load("glUniform2fv"); - glad_glUniform3fv = (PFNGLUNIFORM3FVPROC)load("glUniform3fv"); - glad_glUniform4fv = (PFNGLUNIFORM4FVPROC)load("glUniform4fv"); - glad_glUniform1iv = (PFNGLUNIFORM1IVPROC)load("glUniform1iv"); - glad_glUniform2iv = (PFNGLUNIFORM2IVPROC)load("glUniform2iv"); - glad_glUniform3iv = (PFNGLUNIFORM3IVPROC)load("glUniform3iv"); - glad_glUniform4iv = (PFNGLUNIFORM4IVPROC)load("glUniform4iv"); - glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)load("glUniformMatrix2fv"); - glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)load("glUniformMatrix3fv"); - glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)load("glUniformMatrix4fv"); - glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)load("glValidateProgram"); - glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)load("glVertexAttrib1d"); - glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)load("glVertexAttrib1dv"); - glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)load("glVertexAttrib1f"); - glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)load("glVertexAttrib1fv"); - glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)load("glVertexAttrib1s"); - glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)load("glVertexAttrib1sv"); - glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)load("glVertexAttrib2d"); - glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)load("glVertexAttrib2dv"); - glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)load("glVertexAttrib2f"); - glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)load("glVertexAttrib2fv"); - glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)load("glVertexAttrib2s"); - glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)load("glVertexAttrib2sv"); - glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)load("glVertexAttrib3d"); - glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)load("glVertexAttrib3dv"); - glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)load("glVertexAttrib3f"); - glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)load("glVertexAttrib3fv"); - glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)load("glVertexAttrib3s"); - glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)load("glVertexAttrib3sv"); - glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)load("glVertexAttrib4Nbv"); - glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)load("glVertexAttrib4Niv"); - glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)load("glVertexAttrib4Nsv"); - glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)load("glVertexAttrib4Nub"); - glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)load("glVertexAttrib4Nubv"); - glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)load("glVertexAttrib4Nuiv"); - glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)load("glVertexAttrib4Nusv"); - glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)load("glVertexAttrib4bv"); - glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)load("glVertexAttrib4d"); - glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)load("glVertexAttrib4dv"); - glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)load("glVertexAttrib4f"); - glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)load("glVertexAttrib4fv"); - glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)load("glVertexAttrib4iv"); - glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)load("glVertexAttrib4s"); - glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)load("glVertexAttrib4sv"); - glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)load("glVertexAttrib4ubv"); - glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)load("glVertexAttrib4uiv"); - glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)load("glVertexAttrib4usv"); - glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)load("glVertexAttribPointer"); -} -static void load_GL_VERSION_2_1(GLADloadproc load) { - if(!GLAD_GL_VERSION_2_1) return; - glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)load("glUniformMatrix2x3fv"); - glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)load("glUniformMatrix3x2fv"); - glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)load("glUniformMatrix2x4fv"); - glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)load("glUniformMatrix4x2fv"); - glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)load("glUniformMatrix3x4fv"); - glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)load("glUniformMatrix4x3fv"); -} -static void load_GL_VERSION_3_0(GLADloadproc load) { - if(!GLAD_GL_VERSION_3_0) return; - glad_glColorMaski = (PFNGLCOLORMASKIPROC)load("glColorMaski"); - glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)load("glGetBooleani_v"); - glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)load("glGetIntegeri_v"); - glad_glEnablei = (PFNGLENABLEIPROC)load("glEnablei"); - glad_glDisablei = (PFNGLDISABLEIPROC)load("glDisablei"); - glad_glIsEnabledi = (PFNGLISENABLEDIPROC)load("glIsEnabledi"); - glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)load("glBeginTransformFeedback"); - glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)load("glEndTransformFeedback"); - glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)load("glBindBufferRange"); - glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)load("glBindBufferBase"); - glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)load("glTransformFeedbackVaryings"); - glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)load("glGetTransformFeedbackVarying"); - glad_glClampColor = (PFNGLCLAMPCOLORPROC)load("glClampColor"); - glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)load("glBeginConditionalRender"); - glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)load("glEndConditionalRender"); - glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)load("glVertexAttribIPointer"); - glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)load("glGetVertexAttribIiv"); - glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)load("glGetVertexAttribIuiv"); - glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)load("glVertexAttribI1i"); - glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)load("glVertexAttribI2i"); - glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)load("glVertexAttribI3i"); - glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)load("glVertexAttribI4i"); - glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)load("glVertexAttribI1ui"); - glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)load("glVertexAttribI2ui"); - glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)load("glVertexAttribI3ui"); - glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)load("glVertexAttribI4ui"); - glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)load("glVertexAttribI1iv"); - glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)load("glVertexAttribI2iv"); - glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)load("glVertexAttribI3iv"); - glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)load("glVertexAttribI4iv"); - glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)load("glVertexAttribI1uiv"); - glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)load("glVertexAttribI2uiv"); - glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)load("glVertexAttribI3uiv"); - glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)load("glVertexAttribI4uiv"); - glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)load("glVertexAttribI4bv"); - glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)load("glVertexAttribI4sv"); - glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)load("glVertexAttribI4ubv"); - glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)load("glVertexAttribI4usv"); - glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)load("glGetUniformuiv"); - glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)load("glBindFragDataLocation"); - glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)load("glGetFragDataLocation"); - glad_glUniform1ui = (PFNGLUNIFORM1UIPROC)load("glUniform1ui"); - glad_glUniform2ui = (PFNGLUNIFORM2UIPROC)load("glUniform2ui"); - glad_glUniform3ui = (PFNGLUNIFORM3UIPROC)load("glUniform3ui"); - glad_glUniform4ui = (PFNGLUNIFORM4UIPROC)load("glUniform4ui"); - glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC)load("glUniform1uiv"); - glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC)load("glUniform2uiv"); - glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC)load("glUniform3uiv"); - glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC)load("glUniform4uiv"); - glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)load("glTexParameterIiv"); - glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)load("glTexParameterIuiv"); - glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)load("glGetTexParameterIiv"); - glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)load("glGetTexParameterIuiv"); - glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)load("glClearBufferiv"); - glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)load("glClearBufferuiv"); - glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)load("glClearBufferfv"); - glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)load("glClearBufferfi"); - glad_glGetStringi = (PFNGLGETSTRINGIPROC)load("glGetStringi"); - glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)load("glIsRenderbuffer"); - glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)load("glBindRenderbuffer"); - glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)load("glDeleteRenderbuffers"); - glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)load("glGenRenderbuffers"); - glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)load("glRenderbufferStorage"); - glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)load("glGetRenderbufferParameteriv"); - glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)load("glIsFramebuffer"); - glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)load("glBindFramebuffer"); - glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)load("glDeleteFramebuffers"); - glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)load("glGenFramebuffers"); - glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)load("glCheckFramebufferStatus"); - glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)load("glFramebufferTexture1D"); - glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)load("glFramebufferTexture2D"); - glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)load("glFramebufferTexture3D"); - glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)load("glFramebufferRenderbuffer"); - glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)load("glGetFramebufferAttachmentParameteriv"); - glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)load("glGenerateMipmap"); - glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)load("glBlitFramebuffer"); - glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)load("glRenderbufferStorageMultisample"); - glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)load("glFramebufferTextureLayer"); - glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)load("glMapBufferRange"); - glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)load("glFlushMappedBufferRange"); - glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)load("glBindVertexArray"); - glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)load("glDeleteVertexArrays"); - glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)load("glGenVertexArrays"); - glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC)load("glIsVertexArray"); -} -static void load_GL_VERSION_3_1(GLADloadproc load) { - if(!GLAD_GL_VERSION_3_1) return; - glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)load("glDrawArraysInstanced"); - glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)load("glDrawElementsInstanced"); - glad_glTexBuffer = (PFNGLTEXBUFFERPROC)load("glTexBuffer"); - glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)load("glPrimitiveRestartIndex"); - glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)load("glCopyBufferSubData"); - glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)load("glGetUniformIndices"); - glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)load("glGetActiveUniformsiv"); - glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)load("glGetActiveUniformName"); - glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)load("glGetUniformBlockIndex"); - glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)load("glGetActiveUniformBlockiv"); - glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)load("glGetActiveUniformBlockName"); - glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)load("glUniformBlockBinding"); - glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)load("glBindBufferRange"); - glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)load("glBindBufferBase"); - glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)load("glGetIntegeri_v"); -} -static void load_GL_VERSION_3_2(GLADloadproc load) { - if(!GLAD_GL_VERSION_3_2) return; - glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)load("glDrawElementsBaseVertex"); - glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)load("glDrawRangeElementsBaseVertex"); - glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)load("glDrawElementsInstancedBaseVertex"); - glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)load("glMultiDrawElementsBaseVertex"); - glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)load("glProvokingVertex"); - glad_glFenceSync = (PFNGLFENCESYNCPROC)load("glFenceSync"); - glad_glIsSync = (PFNGLISSYNCPROC)load("glIsSync"); - glad_glDeleteSync = (PFNGLDELETESYNCPROC)load("glDeleteSync"); - glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)load("glClientWaitSync"); - glad_glWaitSync = (PFNGLWAITSYNCPROC)load("glWaitSync"); - glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC)load("glGetInteger64v"); - glad_glGetSynciv = (PFNGLGETSYNCIVPROC)load("glGetSynciv"); - glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)load("glGetInteger64i_v"); - glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)load("glGetBufferParameteri64v"); - glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)load("glFramebufferTexture"); - glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)load("glTexImage2DMultisample"); - glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)load("glTexImage3DMultisample"); - glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)load("glGetMultisamplefv"); - glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC)load("glSampleMaski"); -} -static void load_GL_VERSION_3_3(GLADloadproc load) { - if(!GLAD_GL_VERSION_3_3) return; - glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)load("glBindFragDataLocationIndexed"); - glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)load("glGetFragDataIndex"); - glad_glGenSamplers = (PFNGLGENSAMPLERSPROC)load("glGenSamplers"); - glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)load("glDeleteSamplers"); - glad_glIsSampler = (PFNGLISSAMPLERPROC)load("glIsSampler"); - glad_glBindSampler = (PFNGLBINDSAMPLERPROC)load("glBindSampler"); - glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)load("glSamplerParameteri"); - glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)load("glSamplerParameteriv"); - glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)load("glSamplerParameterf"); - glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)load("glSamplerParameterfv"); - glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)load("glSamplerParameterIiv"); - glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)load("glSamplerParameterIuiv"); - glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)load("glGetSamplerParameteriv"); - glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)load("glGetSamplerParameterIiv"); - glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)load("glGetSamplerParameterfv"); - glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)load("glGetSamplerParameterIuiv"); - glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC)load("glQueryCounter"); - glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)load("glGetQueryObjecti64v"); - glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)load("glGetQueryObjectui64v"); - glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)load("glVertexAttribDivisor"); - glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)load("glVertexAttribP1ui"); - glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)load("glVertexAttribP1uiv"); - glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)load("glVertexAttribP2ui"); - glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)load("glVertexAttribP2uiv"); - glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)load("glVertexAttribP3ui"); - glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)load("glVertexAttribP3uiv"); - glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)load("glVertexAttribP4ui"); - glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)load("glVertexAttribP4uiv"); - glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC)load("glVertexP2ui"); - glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)load("glVertexP2uiv"); - glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC)load("glVertexP3ui"); - glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)load("glVertexP3uiv"); - glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC)load("glVertexP4ui"); - glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)load("glVertexP4uiv"); - glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)load("glTexCoordP1ui"); - glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)load("glTexCoordP1uiv"); - glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)load("glTexCoordP2ui"); - glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)load("glTexCoordP2uiv"); - glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)load("glTexCoordP3ui"); - glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)load("glTexCoordP3uiv"); - glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)load("glTexCoordP4ui"); - glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)load("glTexCoordP4uiv"); - glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)load("glMultiTexCoordP1ui"); - glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)load("glMultiTexCoordP1uiv"); - glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)load("glMultiTexCoordP2ui"); - glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)load("glMultiTexCoordP2uiv"); - glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)load("glMultiTexCoordP3ui"); - glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)load("glMultiTexCoordP3uiv"); - glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)load("glMultiTexCoordP4ui"); - glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)load("glMultiTexCoordP4uiv"); - glad_glNormalP3ui = (PFNGLNORMALP3UIPROC)load("glNormalP3ui"); - glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC)load("glNormalP3uiv"); - glad_glColorP3ui = (PFNGLCOLORP3UIPROC)load("glColorP3ui"); - glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC)load("glColorP3uiv"); - glad_glColorP4ui = (PFNGLCOLORP4UIPROC)load("glColorP4ui"); - glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC)load("glColorP4uiv"); - glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)load("glSecondaryColorP3ui"); - glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)load("glSecondaryColorP3uiv"); -} -static int find_extensionsGL(void) { - if (!get_exts()) return 0; - (void)&has_ext; - free_exts(); - return 1; -} - -static void find_coreGL(void) { - - /* Thank you @elmindreda - * https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176 - * https://github.com/glfw/glfw/blob/master/src/context.c#L36 - */ - int i, major, minor; - - const char* version; - const char* prefixes[] = { - "OpenGL ES-CM ", - "OpenGL ES-CL ", - "OpenGL ES ", - NULL - }; - - version = (const char*) glGetString(GL_VERSION); - if (!version) return; - - for (i = 0; prefixes[i]; i++) { - const size_t length = strlen(prefixes[i]); - if (strncmp(version, prefixes[i], length) == 0) { - version += length; - break; - } - } - -/* PR #18 */ -#ifdef _MSC_VER - sscanf_s(version, "%d.%d", &major, &minor); -#else - sscanf(version, "%d.%d", &major, &minor); -#endif - - GLVersion.major = major; GLVersion.minor = minor; - max_loaded_major = major; max_loaded_minor = minor; - GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; - GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; - GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; - GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; - GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; - GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; - GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; - GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; - GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; - GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; - GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; - GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; - if (GLVersion.major > 3 || (GLVersion.major >= 3 && GLVersion.minor >= 3)) { - max_loaded_major = 3; - max_loaded_minor = 3; - } -} - -int gladLoadGLLoader(GLADloadproc load) { - GLVersion.major = 0; GLVersion.minor = 0; - glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); - if(glGetString == NULL) return 0; - if(glGetString(GL_VERSION) == NULL) return 0; - find_coreGL(); - load_GL_VERSION_1_0(load); - load_GL_VERSION_1_1(load); - load_GL_VERSION_1_2(load); - load_GL_VERSION_1_3(load); - load_GL_VERSION_1_4(load); - load_GL_VERSION_1_5(load); - load_GL_VERSION_2_0(load); - load_GL_VERSION_2_1(load); - load_GL_VERSION_3_0(load); - load_GL_VERSION_3_1(load); - load_GL_VERSION_3_2(load); - load_GL_VERSION_3_3(load); - - if (!find_extensionsGL()) return 0; - return GLVersion.major != 0 || GLVersion.minor != 0; -} - diff --git a/deps/glfw b/deps/glfw deleted file mode 160000 index e2c926454..000000000 --- a/deps/glfw +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e2c92645460f680fd272fd2eed591efb2be7dc31 diff --git a/deps/glm b/deps/glm deleted file mode 160000 index 0af55ccec..000000000 --- a/deps/glm +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0af55ccecd98d4e5a8d1fad7de25ba429d60e863 diff --git a/deps/imgui/CMakeLists.txt b/deps/imgui/CMakeLists.txt deleted file mode 100644 index ec877e5fe..000000000 --- a/deps/imgui/CMakeLists.txt +++ /dev/null @@ -1,76 +0,0 @@ -cmake_minimum_required(VERSION 3.5) - -# Maybe stop from CMAKEing in the wrong place -if (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) - message(FATAL_ERROR "Source and build directories cannot be the same. Go use the /build directory.") -endif() - - -# Append Wno-error to avoid compiling imgui with Werror; imgui seems to trigger lots of warnings -if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error") - - # apparently, this stronger command is needed to accomplish the same in Clang - if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-everything") - endif() -endif() - - -if("${POLYSCOPE_BACKEND_OPENGL3_GLFW}") - - set(SRCS imgui/imgui.cpp imgui/imgui_draw.cpp imgui/imgui_tables.cpp imgui/imgui_widgets.cpp imgui/imgui_demo.cpp imgui/backends/imgui_impl_glfw.cpp imgui/backends/imgui_impl_opengl3.cpp) - - add_library( - imgui - ${SRCS} - ) - - target_include_directories(imgui PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/imgui/") - target_include_directories(imgui PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../glfw/include/") - target_include_directories(imgui PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../glad/include/") - - target_link_libraries(imgui PRIVATE glfw) - - if(APPLE) - # On macOS, get openGL & friends from Frameworks; do not use GLAD at all - - add_definitions(-DGLFW_INCLUDE_GLCOREARB) - - # NOTE: This code is essentially duplicated here and in polyscope/src/CMakeLists.txt - - # Apple is playing hardball and deprecating openGL... we'll cross that bridge when we come to it - # Silence warnings about openGL deprecation - add_definitions(-DGL_SILENCE_DEPRECATION) - find_library(opengl_library OpenGL) - target_link_libraries(imgui PRIVATE ${opengl_library}) - else() - # On Windows/Linux, use the glad openGL loader - - add_definitions(-DIMGUI_IMPL_OPENGL_LOADER_GLAD) - target_link_libraries(imgui PRIVATE glad) - endif() - -elseif("${POLYSCOPE_BACKEND_OPENGL_MOCK}") - - # Disable every platform-specific thing I can find in imgui - add_definitions(-DIMGUI_DISABLE_OSX_FUNCTIONS) - add_definitions(-DIMGUI_DISABLE_WIN32_FUNCTIONS) - add_definitions(-DIMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) - add_definitions(-DIMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) - - set(SRCS imgui/imgui.cpp imgui/imgui_draw.cpp imgui/imgui_tables.cpp imgui/imgui_widgets.cpp imgui/imgui_demo.cpp) - - add_library( - imgui - ${SRCS} - ) - - target_include_directories(imgui PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/imgui/") - -endif() - - -target_compile_features(imgui PUBLIC cxx_std_11) - -set_target_properties(imgui PROPERTIES POSITION_INDEPENDENT_CODE TRUE) diff --git a/deps/imgui/imgui b/deps/imgui/imgui deleted file mode 160000 index 277ae93c4..000000000 --- a/deps/imgui/imgui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 277ae93c41314ba5f4c7444f37c4319cdf07e8cf diff --git a/deps/json/CMakeLists.txt b/deps/json/CMakeLists.txt deleted file mode 100644 index 613708fec..000000000 --- a/deps/json/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -add_library(nlohmann_json INTERFACE) -add_library(nlohmann_json::nlohmann_json ALIAS nlohmann_json) - -target_include_directories(nlohmann_json INTERFACE include) -target_compile_features(nlohmann_json INTERFACE cxx_std_11) diff --git a/deps/json/LICENSE.MIT b/deps/json/LICENSE.MIT deleted file mode 100644 index 00599afe6..000000000 --- a/deps/json/LICENSE.MIT +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2013-2017 Niels Lohmann - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/deps/json/README.md b/deps/json/README.md deleted file mode 100644 index 60be52987..000000000 --- a/deps/json/README.md +++ /dev/null @@ -1,952 +0,0 @@ -[![JSON for Modern C++](https://raw.githubusercontent.com/nlohmann/json/master/doc/json.gif)](https://github.com/nlohmann/json/releases) - -[![Build Status](https://travis-ci.org/nlohmann/json.svg?branch=master)](https://travis-ci.org/nlohmann/json) -[![Build Status](https://ci.appveyor.com/api/projects/status/1acb366xfyg3qybk/branch/develop?svg=true)](https://ci.appveyor.com/project/nlohmann/json) -[![Coverage Status](https://img.shields.io/coveralls/nlohmann/json.svg)](https://coveralls.io/r/nlohmann/json) -[![Coverity Scan Build Status](https://scan.coverity.com/projects/5550/badge.svg)](https://scan.coverity.com/projects/nlohmann-json) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/f3732b3327e34358a0e9d1fe9f661f08)](https://www.codacy.com/app/nlohmann/json?utm_source=github.com&utm_medium=referral&utm_content=nlohmann/json&utm_campaign=Badge_Grade) -[![Try online](https://img.shields.io/badge/try-online-blue.svg)](https://wandbox.org/permlink/yCTCvQi0ZVxGuL3L) -[![Documentation](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json) -[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/nlohmann/json/master/LICENSE.MIT) -[![Github Releases](https://img.shields.io/github/release/nlohmann/json.svg)](https://github.com/nlohmann/json/releases) -[![Github Issues](https://img.shields.io/github/issues/nlohmann/json.svg)](http://github.com/nlohmann/json/issues) -[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/nlohmann/json.svg)](http://isitmaintained.com/project/nlohmann/json "Average time to resolve an issue") -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/289/badge)](https://bestpractices.coreinfrastructure.org/projects/289) - -- [Design goals](#design-goals) -- [Integration](#integration) -- [Examples](#examples) - - [JSON as first-class data type](#json-as-first-class-data-type) - - [Serialization / Deserialization](#serialization--deserialization) - - [STL-like access](#stl-like-access) - - [Conversion from STL containers](#conversion-from-stl-containers) - - [JSON Pointer and JSON Patch](#json-pointer-and-json-patch) - - [Implicit conversions](#implicit-conversions) - - [Conversions to/from arbitrary types](#arbitrary-types-conversions) - - [Binary formats (CBOR and MessagePack)](#binary-formats-cbor-and-messagepack) -- [Supported compilers](#supported-compilers) -- [License](#license) -- [Contact](#contact) -- [Thanks](#thanks) -- [Used third-party tools](#used-third-party-tools) -- [Projects using JSON for Modern C++](#projects-using-json-for-modern-c) -- [Notes](#notes) -- [Execute unit tests](#execute-unit-tests) - -## Design goals - -There are myriads of [JSON](http://json.org) libraries out there, and each may even have its reason to exist. Our class had these design goals: - -- **Intuitive syntax**. In languages such as Python, JSON feels like a first class data type. We used all the operator magic of modern C++ to achieve the same feeling in your code. Check out the [examples below](#examples) and you'll know what I mean. - -- **Trivial integration**. Our whole code consists of a single header file [`json.hpp`](https://github.com/nlohmann/json/blob/develop/src/json.hpp). That's it. No library, no subproject, no dependencies, no complex build system. The class is written in vanilla C++11. All in all, everything should require no adjustment of your compiler flags or project settings. - -- **Serious testing**. Our class is heavily [unit-tested](https://github.com/nlohmann/json/blob/master/test/src/unit.cpp) and covers [100%](https://coveralls.io/r/nlohmann/json) of the code, including all exceptional behavior. Furthermore, we checked with [Valgrind](http://valgrind.org) that there are no memory leaks. To maintain high quality, the project is following the [Core Infrastructure Initiative (CII) best practices](https://bestpractices.coreinfrastructure.org/projects/289). - -Other aspects were not so important to us: - -- **Memory efficiency**. Each JSON object has an overhead of one pointer (the maximal size of a union) and one enumeration element (1 byte). The default generalization uses the following C++ data types: `std::string` for strings, `int64_t`, `uint64_t` or `double` for numbers, `std::map` for objects, `std::vector` for arrays, and `bool` for Booleans. However, you can template the generalized class `basic_json` to your needs. - -- **Speed**. There are certainly [faster JSON libraries](https://github.com/miloyip/nativejson-benchmark#parsing-time) out there. However, if your goal is to speed up your development by adding JSON support with a single header, then this library is the way to go. If you know how to use a `std::vector` or `std::map`, you are already set. - -See the [contribution guidelines](https://github.com/nlohmann/json/blob/master/.github/CONTRIBUTING.md#please-dont) for more information. - - -## Integration - -The single required source, file `json.hpp` is in the `src` directory or [released here](https://github.com/nlohmann/json/releases). All you need to do is add - -```cpp -#include "json.hpp" - -// for convenience -using json = nlohmann::json; -``` - -to the files you want to use JSON objects. That's it. Do not forget to set the necessary switches to enable C++11 (e.g., `-std=c++11` for GCC and Clang). - -:beer: If you are using OS X and [Homebrew](http://brew.sh), just type `brew tap nlohmann/json` and `brew install nlohmann_json` and you're set. If you want the bleeding edge rather than the latest release, use `brew install nlohmann_json --HEAD`. - -If you are using the [Meson Build System](http://mesonbuild.com), then you can wrap this repo as a subproject. - -If you are using [Conan](https://www.conan.io/) to manage your dependencies, merely add `jsonformoderncpp/x.y.z@vthiery/stable` to your `conanfile.py`'s requires, where `x.y.z` is the release version you want to use. Please file issues [here](https://github.com/vthiery/conan-jsonformoderncpp/issues) if you experience problems with the packages. - -If you are using [hunter](https://github.com/ruslo/hunter/) on your project for external dependencies, then you can use the [nlohmann_json package](https://docs.hunter.sh/en/latest/packages/pkg/nlohmann_json.html). Please see the hunter project for any issues regarding the packaging. - -If you are using [vcpkg](https://github.com/Microsoft/vcpkg/) on your project for external dependencies, then you can use the [nlohmann-json package](https://github.com/Microsoft/vcpkg/tree/master/ports/nlohmann-json). Please see the vcpkg project for any issues regarding the packaging. - -:warning: [Version 3.0.0](https://github.com/nlohmann/json/wiki/Road-toward-3.0.0) is currently under development. Branch `develop` is used for the ongoing work and is probably **unstable**. Please use the `master` branch for the last stable version 2.1.1. - - -## Examples - -Beside the examples below, you may want to check the [documentation](https://nlohmann.github.io/json/) where each function contains a separate code example (e.g., check out [`emplace()`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a602f275f0359ab181221384989810604.html#a602f275f0359ab181221384989810604)). All [example files](https://github.com/nlohmann/json/tree/develop/doc/examples) can be compiled and executed on their own (e.g., file [emplace.cpp](https://github.com/nlohmann/json/blob/develop/doc/examples/emplace.cpp)). - -### JSON as first-class data type - -Here are some examples to give you an idea how to use the class. - -Assume you want to create the JSON object - -```json -{ - "pi": 3.141, - "happy": true, - "name": "Niels", - "nothing": null, - "answer": { - "everything": 42 - }, - "list": [1, 0, 2], - "object": { - "currency": "USD", - "value": 42.99 - } -} -``` - -With the JSON class, you could write: - -```cpp -// create an empty structure (null) -json j; - -// add a number that is stored as double (note the implicit conversion of j to an object) -j["pi"] = 3.141; - -// add a Boolean that is stored as bool -j["happy"] = true; - -// add a string that is stored as std::string -j["name"] = "Niels"; - -// add another null object by passing nullptr -j["nothing"] = nullptr; - -// add an object inside the object -j["answer"]["everything"] = 42; - -// add an array that is stored as std::vector (using an initializer list) -j["list"] = { 1, 0, 2 }; - -// add another object (using an initializer list of pairs) -j["object"] = { {"currency", "USD"}, {"value", 42.99} }; - -// instead, you could also write (which looks very similar to the JSON above) -json j2 = { - {"pi", 3.141}, - {"happy", true}, - {"name", "Niels"}, - {"nothing", nullptr}, - {"answer", { - {"everything", 42} - }}, - {"list", {1, 0, 2}}, - {"object", { - {"currency", "USD"}, - {"value", 42.99} - }} -}; -``` - -Note that in all these cases, you never need to "tell" the compiler which JSON value you want to use. If you want to be explicit or express some edge cases, the functions `json::array` and `json::object` will help: - -```cpp -// a way to express the empty array [] -json empty_array_explicit = json::array(); - -// ways to express the empty object {} -json empty_object_implicit = json({}); -json empty_object_explicit = json::object(); - -// a way to express an _array_ of key/value pairs [["currency", "USD"], ["value", 42.99]] -json array_not_object = { json::array({"currency", "USD"}), json::array({"value", 42.99}) }; -``` - - -### Serialization / Deserialization - -#### To/from strings - -You can create an object (deserialization) by appending `_json` to a string literal: - -```cpp -// create object from string literal -json j = "{ \"happy\": true, \"pi\": 3.141 }"_json; - -// or even nicer with a raw string literal -auto j2 = R"( - { - "happy": true, - "pi": 3.141 - } -)"_json; -``` - -Note that without appending the `_json` suffix, the passed string literal is not parsed, but just used as JSON string value. That is, `json j = "{ \"happy\": true, \"pi\": 3.141 }"` would just store the string `"{ "happy": true, "pi": 3.141 }"` rather than parsing the actual object. - -The above example can also be expressed explicitly using `json::parse()`: - -```cpp -// parse explicitly -auto j3 = json::parse("{ \"happy\": true, \"pi\": 3.141 }"); -``` - -You can also get a string representation (serialize): - -```cpp -// explicit conversion to string -std::string s = j.dump(); // {\"happy\":true,\"pi\":3.141} - -// serialization with pretty printing -// pass in the amount of spaces to indent -std::cout << j.dump(4) << std::endl; -// { -// "happy": true, -// "pi": 3.141 -// } -``` - -#### To/from streams (e.g. files, string streams) - -You can also use streams to serialize and deserialize: - -```cpp -// deserialize from standard input -json j; -std::cin >> j; - -// serialize to standard output -std::cout << j; - -// the setw manipulator was overloaded to set the indentation for pretty printing -std::cout << std::setw(4) << j << std::endl; -``` - -These operators work for any subclasses of `std::istream` or `std::ostream`. Here is the same example with files: - -```cpp -// read a JSON file -std::ifstream i("file.json"); -json j; -i >> j; - -// write prettified JSON to another file -std::ofstream o("pretty.json"); -o << std::setw(4) << j << std::endl; -``` - -Please note that setting the exception bit for `failbit` is inappropriate for this use case. It will result in program termination due to the `noexcept` specifier in use. - -#### Read from iterator range - -You can also read JSON from an iterator range; that is, from any container accessible by iterators whose content is stored as contiguous byte sequence, for instance a `std::vector`: - -```cpp -std::vector v = {'t', 'r', 'u', 'e'}; -json j = json::parse(v.begin(), v.end()); -``` - -You may leave the iterators for the range [begin, end): - -```cpp -std::vector v = {'t', 'r', 'u', 'e'}; -json j = json::parse(v); -``` - - -### STL-like access - -We designed the JSON class to behave just like an STL container. In fact, it satisfies the [**ReversibleContainer**](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirement. - -```cpp -// create an array using push_back -json j; -j.push_back("foo"); -j.push_back(1); -j.push_back(true); - -// also use emplace_back -j.emplace_back(1.78); - -// iterate the array -for (json::iterator it = j.begin(); it != j.end(); ++it) { - std::cout << *it << '\n'; -} - -// range-based for -for (auto& element : j) { - std::cout << element << '\n'; -} - -// getter/setter -const std::string tmp = j[0]; -j[1] = 42; -bool foo = j.at(2); - -// comparison -j == "[\"foo\", 1, true]"_json; // true - -// other stuff -j.size(); // 3 entries -j.empty(); // false -j.type(); // json::value_t::array -j.clear(); // the array is empty again - -// convenience type checkers -j.is_null(); -j.is_boolean(); -j.is_number(); -j.is_object(); -j.is_array(); -j.is_string(); - -// create an object -json o; -o["foo"] = 23; -o["bar"] = false; -o["baz"] = 3.141; - -// also use emplace -o.emplace("weather", "sunny"); - -// special iterator member functions for objects -for (json::iterator it = o.begin(); it != o.end(); ++it) { - std::cout << it.key() << " : " << it.value() << "\n"; -} - -// find an entry -if (o.find("foo") != o.end()) { - // there is an entry with key "foo" -} - -// or simpler using count() -int foo_present = o.count("foo"); // 1 -int fob_present = o.count("fob"); // 0 - -// delete an entry -o.erase("foo"); -``` - - -### Conversion from STL containers - -Any sequence container (`std::array`, `std::vector`, `std::deque`, `std::forward_list`, `std::list`) whose values can be used to construct JSON types (e.g., integers, floating point numbers, Booleans, string types, or again STL containers described in this section) can be used to create a JSON array. The same holds for similar associative containers (`std::set`, `std::multiset`, `std::unordered_set`, `std::unordered_multiset`), but in these cases the order of the elements of the array depends on how the elements are ordered in the respective STL container. - -```cpp -std::vector c_vector {1, 2, 3, 4}; -json j_vec(c_vector); -// [1, 2, 3, 4] - -std::deque c_deque {1.2, 2.3, 3.4, 5.6}; -json j_deque(c_deque); -// [1.2, 2.3, 3.4, 5.6] - -std::list c_list {true, true, false, true}; -json j_list(c_list); -// [true, true, false, true] - -std::forward_list c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543}; -json j_flist(c_flist); -// [12345678909876, 23456789098765, 34567890987654, 45678909876543] - -std::array c_array {{1, 2, 3, 4}}; -json j_array(c_array); -// [1, 2, 3, 4] - -std::set c_set {"one", "two", "three", "four", "one"}; -json j_set(c_set); // only one entry for "one" is used -// ["four", "one", "three", "two"] - -std::unordered_set c_uset {"one", "two", "three", "four", "one"}; -json j_uset(c_uset); // only one entry for "one" is used -// maybe ["two", "three", "four", "one"] - -std::multiset c_mset {"one", "two", "one", "four"}; -json j_mset(c_mset); // both entries for "one" are used -// maybe ["one", "two", "one", "four"] - -std::unordered_multiset c_umset {"one", "two", "one", "four"}; -json j_umset(c_umset); // both entries for "one" are used -// maybe ["one", "two", "one", "four"] -``` - -Likewise, any associative key-value containers (`std::map`, `std::multimap`, `std::unordered_map`, `std::unordered_multimap`) whose keys can construct an `std::string` and whose values can be used to construct JSON types (see examples above) can be used to create a JSON object. Note that in case of multimaps only one key is used in the JSON object and the value depends on the internal order of the STL container. - -```cpp -std::map c_map { {"one", 1}, {"two", 2}, {"three", 3} }; -json j_map(c_map); -// {"one": 1, "three": 3, "two": 2 } - -std::unordered_map c_umap { {"one", 1.2}, {"two", 2.3}, {"three", 3.4} }; -json j_umap(c_umap); -// {"one": 1.2, "two": 2.3, "three": 3.4} - -std::multimap c_mmap { {"one", true}, {"two", true}, {"three", false}, {"three", true} }; -json j_mmap(c_mmap); // only one entry for key "three" is used -// maybe {"one": true, "two": true, "three": true} - -std::unordered_multimap c_ummap { {"one", true}, {"two", true}, {"three", false}, {"three", true} }; -json j_ummap(c_ummap); // only one entry for key "three" is used -// maybe {"one": true, "two": true, "three": true} -``` - -### JSON Pointer and JSON Patch - -The library supports **JSON Pointer** ([RFC 6901](https://tools.ietf.org/html/rfc6901)) as alternative means to address structured values. On top of this, **JSON Patch** ([RFC 6902](https://tools.ietf.org/html/rfc6902)) allows to describe differences between two JSON values - effectively allowing patch and diff operations known from Unix. - -```cpp -// a JSON value -json j_original = R"({ - "baz": ["one", "two", "three"], - "foo": "bar" -})"_json; - -// access members with a JSON pointer (RFC 6901) -j_original["/baz/1"_json_pointer]; -// "two" - -// a JSON patch (RFC 6902) -json j_patch = R"([ - { "op": "replace", "path": "/baz", "value": "boo" }, - { "op": "add", "path": "/hello", "value": ["world"] }, - { "op": "remove", "path": "/foo"} -])"_json; - -// apply the patch -json j_result = j_original.patch(j_patch); -// { -// "baz": "boo", -// "hello": ["world"] -// } - -// calculate a JSON patch from two JSON values -json::diff(j_result, j_original); -// [ -// { "op":" replace", "path": "/baz", "value": ["one", "two", "three"] }, -// { "op": "remove","path": "/hello" }, -// { "op": "add", "path": "/foo", "value": "bar" } -// ] -``` - - -### Implicit conversions - -The type of the JSON object is determined automatically by the expression to store. Likewise, the stored value is implicitly converted. - -```cpp -// strings -std::string s1 = "Hello, world!"; -json js = s1; -std::string s2 = js; - -// Booleans -bool b1 = true; -json jb = b1; -bool b2 = jb; - -// numbers -int i = 42; -json jn = i; -double f = jn; - -// etc. -``` - -You can also explicitly ask for the value: - -```cpp -std::string vs = js.get(); -bool vb = jb.get(); -int vi = jn.get(); - -// etc. -``` - -### Arbitrary types conversions - -Every type can be serialized in JSON, not just STL-containers and scalar types. Usually, you would do something along those lines: - -```cpp -namespace ns { - // a simple struct to model a person - struct person { - std::string name; - std::string address; - int age; - }; -} - -ns::person p = {"Ned Flanders", "744 Evergreen Terrace", 60}; - -// convert to JSON: copy each value into the JSON object -json j; -j["name"] = p.name; -j["address"] = p.address; -j["age"] = p.age; - -// ... - -// convert from JSON: copy each value from the JSON object -ns::person p { - j["name"].get(), - j["address"].get(), - j["age"].get() -}; -``` - -It works, but that's quite a lot of boilerplate... Fortunately, there's a better way: - -```cpp -// create a person -ns::person p {"Ned Flanders", "744 Evergreen Terrace", 60}; - -// conversion: person -> json -json j = p; - -std::cout << j << std::endl; -// {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"} - -// conversion: json -> person -ns::person p2 = j; - -// that's it -assert(p == p2); -``` - -#### Basic usage - -To make this work with one of your types, you only need to provide two functions: - -```cpp -using nlohmann::json; - -namespace ns { - void to_json(json& j, const person& p) { - j = json{{"name", p.name}, {"address", p.address}, {"age", p.age}}; - } - - void from_json(const json& j, person& p) { - p.name = j.at("name").get(); - p.address = j.at("address").get(); - p.age = j.at("age").get(); - } -} // namespace ns -``` - -That's all! When calling the `json` constructor with your type, your custom `to_json` method will be automatically called. -Likewise, when calling `get()`, the `from_json` method will be called. - -Some important things: - -* Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined). -* When using `get()`, `your_type` **MUST** be [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). (There is a way to bypass this requirement described later.) -* In function `from_json`, use function [`at()`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a93403e803947b86f4da2d1fb3345cf2c.html#a93403e803947b86f4da2d1fb3345cf2c) to access the object values rather than `operator[]`. In case a key does not exist, `at` throws an exception that you can handle, whereas `operator[]` exhibits undefined behavior. -* In case your type contains several `operator=` definitions, code like `your_variable = your_json;` [may not compile](https://github.com/nlohmann/json/issues/667). You need to write `your_variable = your_json.get();` instead. -* You do not need to add serializers or deserializers for STL types like `std::vector`: the library already implements these. -* Be careful with the definition order of the `from_json`/`to_json` functions: If a type `B` has a member of type `A`, you **MUST** define `to_json(A)` before `to_json(B)`. Look at [issue 561](https://github.com/nlohmann/json/issues/561) for more details. - - -#### How do I convert third-party types? - -This requires a bit more advanced technique. But first, let's see how this conversion mechanism works: - -The library uses **JSON Serializers** to convert types to json. -The default serializer for `nlohmann::json` is `nlohmann::adl_serializer` (ADL means [Argument-Dependent Lookup](http://en.cppreference.com/w/cpp/language/adl)). - -It is implemented like this (simplified): - -```cpp -template -struct adl_serializer { - static void to_json(json& j, const T& value) { - // calls the "to_json" method in T's namespace - } - - static void from_json(const json& j, T& value) { - // same thing, but with the "from_json" method - } -}; -``` - -This serializer works fine when you have control over the type's namespace. However, what about `boost::optional`, or `std::filesystem::path` (C++17)? Hijacking the `boost` namespace is pretty bad, and it's illegal to add something other than template specializations to `std`... - -To solve this, you need to add a specialization of `adl_serializer` to the `nlohmann` namespace, here's an example: - -```cpp -// partial specialization (full specialization works too) -namespace nlohmann { - template - struct adl_serializer> { - static void to_json(json& j, const boost::optional& opt) { - if (opt == boost::none) { - j = nullptr; - } else { - j = *opt; // this will call adl_serializer::to_json which will - // find the free function to_json in T's namespace! - } - } - - static void from_json(const json& j, boost::optional& opt) { - if (j.is_null()) { - opt = boost::none; - } else { - opt = j.get(); // same as above, but with - // adl_serializer::from_json - } - } - }; -} -``` - -#### How can I use `get()` for non-default constructible/non-copyable types? - -There is a way, if your type is [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible). You will need to specialize the `adl_serializer` as well, but with a special `from_json` overload: - -```cpp -struct move_only_type { - move_only_type() = delete; - move_only_type(int ii): i(ii) {} - move_only_type(const move_only_type&) = delete; - move_only_type(move_only_type&&) = default; - - int i; -}; - -namespace nlohmann { - template <> - struct adl_serializer { - // note: the return type is no longer 'void', and the method only takes - // one argument - static move_only_type from_json(const json& j) { - return {j.get()}; - } - - // Here's the catch! You must provide a to_json method! Otherwise you - // will not be able to convert move_only_type to json, since you fully - // specialized adl_serializer on that type - static void to_json(json& j, move_only_type t) { - j = t.i; - } - }; -} -``` - -#### Can I write my own serializer? (Advanced use) - -Yes. You might want to take a look at [`unit-udt.cpp`](https://github.com/nlohmann/json/blob/develop/test/src/unit-udt.cpp) in the test suite, to see a few examples. - -If you write your own serializer, you'll need to do a few things: - -* use a different `basic_json` alias than `nlohmann::json` (the last template parameter of `basic_json` is the `JSONSerializer`) -* use your `basic_json` alias (or a template parameter) in all your `to_json`/`from_json` methods -* use `nlohmann::to_json` and `nlohmann::from_json` when you need ADL - -Here is an example, without simplifications, that only accepts types with a size <= 32, and uses ADL. - -```cpp -// You should use void as a second template argument -// if you don't need compile-time checks on T -template::type> -struct less_than_32_serializer { - template - static void to_json(BasicJsonType& j, T value) { - // we want to use ADL, and call the correct to_json overload - using nlohmann::to_json; // this method is called by adl_serializer, - // this is where the magic happens - to_json(j, value); - } - - template - static void from_json(const BasicJsonType& j, T& value) { - // same thing here - using nlohmann::from_json; - from_json(j, value); - } -}; -``` - -Be **very** careful when reimplementing your serializer, you can stack overflow if you don't pay attention: - -```cpp -template -struct bad_serializer -{ - template - static void to_json(BasicJsonType& j, const T& value) { - // this calls BasicJsonType::json_serializer::to_json(j, value); - // if BasicJsonType::json_serializer == bad_serializer ... oops! - j = value; - } - - template - static void to_json(const BasicJsonType& j, T& value) { - // this calls BasicJsonType::json_serializer::from_json(j, value); - // if BasicJsonType::json_serializer == bad_serializer ... oops! - value = j.template get(); // oops! - } -}; -``` - -### Binary formats (CBOR and MessagePack) - -Though JSON is a ubiquitous data format, it is not a very compact format suitable for data exchange, for instance over a network. Hence, the library supports [CBOR](http://cbor.io) (Concise Binary Object Representation) and [MessagePack](http://msgpack.org) to efficiently encode JSON values to byte vectors and to decode such vectors. - -```cpp -// create a JSON value -json j = R"({"compact": true, "schema": 0})"_json; - -// serialize to CBOR -std::vector v_cbor = json::to_cbor(j); - -// 0xa2, 0x67, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0xf5, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x00 - -// roundtrip -json j_from_cbor = json::from_cbor(v_cbor); - -// serialize to MessagePack -std::vector v_msgpack = json::to_msgpack(j); - -// 0x82, 0xa7, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0xc3, 0xa6, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x00 - -// roundtrip -json j_from_msgpack = json::from_msgpack(v_msgpack); -``` - - -## Supported compilers - -Though it's 2016 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work: - -- GCC 4.9 - 7.1 (and possibly later) -- Clang 3.4 - 5.0 (and possibly later) -- Intel C++ Compiler 17.0.2 (and possibly later) -- Microsoft Visual C++ 2015 / Build Tools 14.0.25123.0 (and possibly later) -- Microsoft Visual C++ 2017 / Build Tools 15.1.548.43366 (and possibly later) - -I would be happy to learn about other compilers/versions. - -Please note: - -- GCC 4.8 does not work because of two bugs ([55817](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55817) and [57824](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824)) in the C++11 support. Note there is a [pull request](https://github.com/nlohmann/json/pull/212) to fix some of the issues. -- Android defaults to using very old compilers and C++ libraries. To fix this, add the following to your `Application.mk`. This will switch to the LLVM C++ library, the Clang compiler, and enable C++11 and other features disabled by default. - - ``` - APP_STL := c++_shared - NDK_TOOLCHAIN_VERSION := clang3.6 - APP_CPPFLAGS += -frtti -fexceptions - ``` - - The code compiles successfully with [Android NDK](https://developer.android.com/ndk/index.html?hl=ml), Revision 9 - 11 (and possibly later) and [CrystaX's Android NDK](https://www.crystax.net/en/android/ndk) version 10. - -- For GCC running on MinGW or Android SDK, the error `'to_string' is not a member of 'std'` (or similarly, for `strtod`) may occur. Note this is not an issue with the code, but rather with the compiler itself. On Android, see above to build with a newer environment. For MinGW, please refer to [this site](http://tehsausage.com/mingw-to-string) and [this discussion](https://github.com/nlohmann/json/issues/136) for information on how to fix this bug. For Android NDK using `APP_STL := gnustl_static`, please refer to [this discussion](https://github.com/nlohmann/json/issues/219). - -The following compilers are currently used in continuous integration at [Travis](https://travis-ci.org/nlohmann/json) and [AppVeyor](https://ci.appveyor.com/project/nlohmann/json): - -| Compiler | Operating System | Version String | -|-----------------|------------------------------|----------------| -| GCC 4.9.4 | Ubuntu 14.04.5 LTS | g++-4.9 (Ubuntu 4.9.4-2ubuntu1~14.04.1) 4.9.4 | -| GCC 5.4.1 | Ubuntu 14.04.5 LTS | g++-5 (Ubuntu 5.4.1-2ubuntu1~14.04) 5.4.1 20160904 | -| GCC 6.3.0 | Ubuntu 14.04.5 LTS | g++-6 (Ubuntu/Linaro 6.3.0-18ubuntu2~14.04) 6.3.0 20170519 | -| GCC 7.1.0 | Ubuntu 14.04.5 LTS | g++-7 (Ubuntu 7.1.0-5ubuntu2~14.04) 7.1.0 -| Clang 3.5.0 | Ubuntu 14.04.5 LTS | clang version 3.5.0-4ubuntu2~trusty2 (tags/RELEASE_350/final) | -| Clang 3.6.2 | Ubuntu 14.04.5 LTS | clang version 3.6.2-svn240577-1~exp1 (branches/release_36) | -| Clang 3.7.1 | Ubuntu 14.04.5 LTS | clang version 3.7.1-svn253571-1~exp1 (branches/release_37) | -| Clang 3.8.0 | Ubuntu 14.04.5 LTS | clang version 3.8.0-2ubuntu3~trusty5 (tags/RELEASE_380/final) | -| Clang 3.9.1 | Ubuntu 14.04.5 LTS | clang version 3.9.1-4ubuntu3~14.04.2 (tags/RELEASE_391/rc2) | -| Clang 4.0.1 | Ubuntu 14.04.5 LTS | clang version 4.0.1-svn305264-1~exp1 (branches/release_40) | -| Clang 5.0.0 | Ubuntu 14.04.5 LTS | clang version 5.0.0-svn310902-1~exp1 (branches/release_50) | -| Clang Xcode 6.4 | Darwin Kernel Version 14.3.0 (OSX 10.10.3) | Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) | -| Clang Xcode 7.3 | Darwin Kernel Version 15.0.0 (OSX 10.10.5) | Apple LLVM version 7.3.0 (clang-703.0.29) | -| Clang Xcode 8.0 | Darwin Kernel Version 15.6.0 | Apple LLVM version 8.0.0 (clang-800.0.38) | -| Clang Xcode 8.1 | Darwin Kernel Version 16.1.0 (macOS 10.12.1) | Apple LLVM version 8.0.0 (clang-800.0.42.1) | -| Clang Xcode 8.2 | Darwin Kernel Version 16.1.0 (macOS 10.12.1) | Apple LLVM version 8.0.0 (clang-800.0.42.1) | -| Clang Xcode 8.3 | Darwin Kernel Version 16.5.0 (macOS 10.12.4) | Apple LLVM version 8.1.0 (clang-802.0.38) | -| Clang Xcode 9 beta | Darwin Kernel Version 16.6.0 (macOS 10.12.5) | Apple LLVM version 9.0.0 (clang-900.0.26) | -| Visual Studio 14 2015 | Windows Server 2012 R2 (x64) | Microsoft (R) Build Engine version 14.0.25420.1 | -| Visual Studio 2017 | Windows Server 2016 | Microsoft (R) Build Engine version 15.1.1012.6693 | - -## License - - - -The class is licensed under the [MIT License](http://opensource.org/licenses/MIT): - -Copyright © 2013-2017 [Niels Lohmann](http://nlohmann.me) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -## Contact - -If you have questions regarding the library, I would like to invite you to [open an issue at Github](https://github.com/nlohmann/json/issues/new). Please describe your request, problem, or question as detailed as possible, and also mention the version of the library you are using as well as the version of your compiler and operating system. Opening an issue at Github allows other users and contributors to this library to collaborate. For instance, I have little experience with MSVC, and most issues in this regard have been solved by a growing community. If you have a look at the [closed issues](https://github.com/nlohmann/json/issues?q=is%3Aissue+is%3Aclosed), you will see that we react quite timely in most cases. - -Only if your request would contain confidential information, please [send me an email](mailto:mail@nlohmann.me). - - -## Thanks - -I deeply appreciate the help of the following people. - -- [Teemperor](https://github.com/Teemperor) implemented CMake support and lcov integration, realized escape and Unicode handling in the string parser, and fixed the JSON serialization. -- [elliotgoodrich](https://github.com/elliotgoodrich) fixed an issue with double deletion in the iterator classes. -- [kirkshoop](https://github.com/kirkshoop) made the iterators of the class composable to other libraries. -- [wancw](https://github.com/wanwc) fixed a bug that hindered the class to compile with Clang. -- Tomas Åblad found a bug in the iterator implementation. -- [Joshua C. Randall](https://github.com/jrandall) fixed a bug in the floating-point serialization. -- [Aaron Burghardt](https://github.com/aburgh) implemented code to parse streams incrementally. Furthermore, he greatly improved the parser class by allowing the definition of a filter function to discard undesired elements while parsing. -- [Daniel Kopeček](https://github.com/dkopecek) fixed a bug in the compilation with GCC 5.0. -- [Florian Weber](https://github.com/Florianjw) fixed a bug in and improved the performance of the comparison operators. -- [Eric Cornelius](https://github.com/EricMCornelius) pointed out a bug in the handling with NaN and infinity values. He also improved the performance of the string escaping. -- [易思龙](https://github.com/likebeta) implemented a conversion from anonymous enums. -- [kepkin](https://github.com/kepkin) patiently pushed forward the support for Microsoft Visual studio. -- [gregmarr](https://github.com/gregmarr) simplified the implementation of reverse iterators and helped with numerous hints and improvements. In particular, he pushed forward the implementation of user-defined types. -- [Caio Luppi](https://github.com/caiovlp) fixed a bug in the Unicode handling. -- [dariomt](https://github.com/dariomt) fixed some typos in the examples. -- [Daniel Frey](https://github.com/d-frey) cleaned up some pointers and implemented exception-safe memory allocation. -- [Colin Hirsch](https://github.com/ColinH) took care of a small namespace issue. -- [Huu Nguyen](https://github.com/whoshuu) correct a variable name in the documentation. -- [Silverweed](https://github.com/silverweed) overloaded `parse()` to accept an rvalue reference. -- [dariomt](https://github.com/dariomt) fixed a subtlety in MSVC type support and implemented the `get_ref()` function to get a reference to stored values. -- [ZahlGraf](https://github.com/ZahlGraf) added a workaround that allows compilation using Android NDK. -- [whackashoe](https://github.com/whackashoe) replaced a function that was marked as unsafe by Visual Studio. -- [406345](https://github.com/406345) fixed two small warnings. -- [Glen Fernandes](https://github.com/glenfe) noted a potential portability problem in the `has_mapped_type` function. -- [Corbin Hughes](https://github.com/nibroc) fixed some typos in the contribution guidelines. -- [twelsby](https://github.com/twelsby) fixed the array subscript operator, an issue that failed the MSVC build, and floating-point parsing/dumping. He further added support for unsigned integer numbers and implemented better roundtrip support for parsed numbers. -- [Volker Diels-Grabsch](https://github.com/vog) fixed a link in the README file. -- [msm-](https://github.com/msm-) added support for american fuzzy lop. -- [Annihil](https://github.com/Annihil) fixed an example in the README file. -- [Themercee](https://github.com/Themercee) noted a wrong URL in the README file. -- [Lv Zheng](https://github.com/lv-zheng) fixed a namespace issue with `int64_t` and `uint64_t`. -- [abc100m](https://github.com/abc100m) analyzed the issues with GCC 4.8 and proposed a [partial solution](https://github.com/nlohmann/json/pull/212). -- [zewt](https://github.com/zewt) added useful notes to the README file about Android. -- [Róbert Márki](https://github.com/robertmrk) added a fix to use move iterators and improved the integration via CMake. -- [Chris Kitching](https://github.com/ChrisKitching) cleaned up the CMake files. -- [Tom Needham](https://github.com/06needhamt) fixed a subtle bug with MSVC 2015 which was also proposed by [Michael K.](https://github.com/Epidal). -- [Mário Feroldi](https://github.com/thelostt) fixed a small typo. -- [duncanwerner](https://github.com/duncanwerner) found a really embarrassing performance regression in the 2.0.0 release. -- [Damien](https://github.com/dtoma) fixed one of the last conversion warnings. -- [Thomas Braun](https://github.com/t-b) fixed a warning in a test case. -- [Théo DELRIEU](https://github.com/theodelrieu) patiently and constructively oversaw the long way toward [iterator-range parsing](https://github.com/nlohmann/json/issues/290). He also implemented the magic behind the serialization/deserialization of user-defined types. -- [Stefan](https://github.com/5tefan) fixed a minor issue in the documentation. -- [Vasil Dimov](https://github.com/vasild) fixed the documentation regarding conversions from `std::multiset`. -- [ChristophJud](https://github.com/ChristophJud) overworked the CMake files to ease project inclusion. -- [Vladimir Petrigo](https://github.com/vpetrigo) made a SFINAE hack more readable and added Visual Studio 17 to the build matrix. -- [Denis Andrejew](https://github.com/seeekr) fixed a grammar issue in the README file. -- [Pierre-Antoine Lacaze](https://github.com/palacaze) found a subtle bug in the `dump()` function. -- [TurpentineDistillery](https://github.com/TurpentineDistillery) pointed to [`std::locale::classic()`](http://en.cppreference.com/w/cpp/locale/locale/classic) to avoid too much locale joggling, found some nice performance improvements in the parser, improved the benchmarking code, and realized locale-independent number parsing and printing. -- [cgzones](https://github.com/cgzones) had an idea how to fix the Coverity scan. -- [Jared Grubb](https://github.com/jaredgrubb) silenced a nasty documentation warning. -- [Yixin Zhang](https://github.com/qwename) fixed an integer overflow check. -- [Bosswestfalen](https://github.com/Bosswestfalen) merged two iterator classes into a smaller one. -- [Daniel599](https://github.com/Daniel599) helped to get Travis execute the tests with Clang's sanitizers. -- [Jonathan Lee](https://github.com/vjon) fixed an example in the README file. -- [gnzlbg](https://github.com/gnzlbg) supported the implementation of user-defined types. -- [Alexej Harm](https://github.com/qis) helped to get the user-defined types working with Visual Studio. -- [Jared Grubb](https://github.com/jaredgrubb) supported the implementation of user-defined types. -- [EnricoBilla](https://github.com/EnricoBilla) noted a typo in an example. -- [Martin Hořeňovský](https://github.com/horenmar) found a way for a 2x speedup for the compilation time of the test suite. -- [ukhegg](https://github.com/ukhegg) found proposed an improvement for the examples section. -- [rswanson-ihi](https://github.com/rswanson-ihi) noted a typo in the README. -- [Mihai Stan](https://github.com/stanmihai4) fixed a bug in the comparison with `nullptr`s. -- [Tushar Maheshwari](https://github.com/tusharpm) added [cotire](https://github.com/sakra/cotire) support to speed up the compilation. -- [TedLyngmo](https://github.com/TedLyngmo) noted a typo in the README, removed unnecessary bit arithmetic, and fixed some `-Weffc++` warnings. -- [Krzysztof Woś](https://github.com/krzysztofwos) made exceptions more visible. -- [ftillier](https://github.com/ftillier) fixed a compiler warning. -- [tinloaf](https://github.com/tinloaf) made sure all pushed warnings are properly popped. -- [Fytch](https://github.com/Fytch) found a bug in the documentation. -- [Jay Sistar](https://github.com/Type1J) implemented a Meson build description. -- [Henry Lee](https://github.com/HenryRLee) fixed a warning in ICC and improved the iterator implementation. -- [Vincent Thiery](https://github.com/vthiery) maintains a package for the Conan package manager. -- [Steffen](https://github.com/koemeet) fixed a potential issue with MSVC and `std::min`. -- [Mike Tzou](https://github.com/Chocobo1) fixed some typos. -- [amrcode](https://github.com/amrcode) noted a missleading documentation about comparison of floats. -- [Oleg Endo](https://github.com/olegendo) reduced the memory consumption by replacing `` with ``. -- [dan-42](https://github.com/dan-42) cleaned up the CMake files to simplify including/reusing of the library. -- [Nikita Ofitserov](https://github.com/himikof) allowed for moving values from initializer lists. -- [Greg Hurrell](https://github.com/wincent) fixed a typo. -- [Dmitry Kukovinets](https://github.com/DmitryKuk) fixed a typo. -- [kbthomp1](https://github.com/kbthomp1) fixed an issue related to the Intel OSX compiler. -- [Markus Werle](https://github.com/daixtrose) fixed a typo. -- [WebProdPP](https://github.com/WebProdPP) fixed a subtle error in a precondition check. -- [Alex](https://github.com/leha-bot) noted an error in a code sample. -- [Tom de Geus](https://github.com/tdegeus) reported some warnings with ICC and helped fixing them. -- [Perry Kundert](https://github.com/pjkundert) simplified reading from input streams. -- [Sonu Lohani](https://github.com/sonulohani) fixed a small compilation error. -- [Jamie Seward](https://github.com/jseward) fixed all MSVC warnings. -- [Nate Vargas](https://github.com/eld00d) added a Doxygen tag file. -- [pvleuven](https://github.com/pvleuven) helped fixing a warning in ICC. -- [Pavel](https://github.com/crea7or) helped fixing some warnings in MSVC. -- [Jamie Seward](https://github.com/jseward) avoided unneccessary string copies in `find()` and `count()`. -- [Mitja](https://github.com/Itja) fixed some typos. - - -Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone. - - -## Used third-party tools - -The library itself contains of a single header file licensed under the MIT license. However, it is built, tested, documented, and whatnot using a lot of third-party tools and services. Thanks a lot! - -- [**American fuzzy lop**](http://lcamtuf.coredump.cx/afl/) for fuzz testing -- [**AppVeyor**](https://www.appveyor.com) for [continuous integration](https://ci.appveyor.com/project/nlohmann/json) on Windows -- [**Artistic Style**](http://astyle.sourceforge.net) for automatic source code identation -- [**benchpress**](https://github.com/sbs-ableton/benchpress) to benchmark the code -- [**Catch**](https://github.com/philsquared/Catch) for the unit tests -- [**Clang**](http://clang.llvm.org) for compilation with code sanitizers -- [**Cmake**](https://cmake.org) for build automation -- [**Codacity**](https://www.codacy.com) for further [code analysis](https://www.codacy.com/app/nlohmann/json) -- [**Coveralls**](https://coveralls.io) to measure [code coverage](https://coveralls.io/github/nlohmann/json) -- [**Coverity Scan**](https://scan.coverity.com) for [static analysis](https://scan.coverity.com/projects/nlohmann-json) -- [**cppcheck**](http://cppcheck.sourceforge.net) for static analysis -- [**cxxopts**](https://github.com/jarro2783/cxxopts) to let benchpress parse command-line parameters -- [**Doxygen**](http://www.stack.nl/~dimitri/doxygen/) to generate [documentation](https://nlohmann.github.io/json/) -- [**git-update-ghpages**](https://github.com/rstacruz/git-update-ghpages) to upload the documentation to gh-pages -- [**Github Changelog Generator**](https://github.com/skywinder/github-changelog-generator) to generate the [ChangeLog](https://github.com/nlohmann/json/blob/develop/ChangeLog.md) -- [**libFuzzer**](http://llvm.org/docs/LibFuzzer.html) to implement fuzz testing for OSS-Fuzz -- [**OSS-Fuzz**](https://github.com/google/oss-fuzz) for continuous fuzz testing of the library -- [**Probot**](https://probot.github.io) for automating maintainer tasks such as closing stale issues, requesting missing information, or detecting toxic comments. -- [**send_to_wandbox**](https://github.com/nlohmann/json/blob/develop/doc/scripts/send_to_wandbox.py) to send code examples to [Wandbox](http://melpon.org/wandbox) -- [**Travis**](https://travis-ci.org) for [continuous integration](https://travis-ci.org/nlohmann/json) on Linux and macOS -- [**Valgrind**](http://valgrind.org) to check for correct memory management -- [**Wandbox**](http://melpon.org/wandbox) for [online examples](https://wandbox.org/permlink/yCTCvQi0ZVxGuL3L) - - -## Projects using JSON for Modern C++ - -The library is currently used in Apple macOS Sierra and iOS 10. I am not sure what they are using the library for, but I am happy that it runs on so many devices. - - -## Notes - -- The code contains numerous debug **assertions** which can be switched off by defining the preprocessor macro `NDEBUG`, see the [documentation of `assert`](http://en.cppreference.com/w/cpp/error/assert). In particular, note [`operator[]`](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a2e26bd0b0168abb61f67ad5bcd5b9fa1.html#a2e26bd0b0168abb61f67ad5bcd5b9fa1) implements **unchecked access** for const objects: If the given key is not present, the behavior is undefined (think of a dereferenced null pointer) and yields an [assertion failure](https://github.com/nlohmann/json/issues/289) if assertions are switched on. If you are not sure whether an element in an object exists, use checked access with the [`at()` function](https://nlohmann.github.io/json/classnlohmann_1_1basic__json_a674de1ee73e6bf4843fc5dc1351fb726.html#a674de1ee73e6bf4843fc5dc1351fb726). -- As the exact type of a number is not defined in the [JSON specification](http://rfc7159.net/rfc7159), this library tries to choose the best fitting C++ number type automatically. As a result, the type `double` may be used to store numbers which may yield [**floating-point exceptions**](https://github.com/nlohmann/json/issues/181) in certain rare situations if floating-point exceptions have been unmasked in the calling code. These exceptions are not caused by the library and need to be fixed in the calling code, such as by re-masking the exceptions prior to calling library functions. -- The library supports **Unicode input** as follows: - - Only **UTF-8** encoded input is supported which is the default encoding for JSON according to [RFC 7159](http://rfc7159.net/rfc7159#rfc.section.8.1). - - Other encodings such as Latin-1, UTF-16, or UTF-32 are not supported and will yield parse errors. - - [Unicode noncharacters](http://www.unicode.org/faq/private_use.html#nonchar1) will not be replaced by the library. - - Invalid surrogates (e.g., incomplete pairs such as `\uDEAD`) will yield parse errors. - - The strings stored in the library are UTF-8 encoded. When using the default string type (`std::string`), note that its length/size functions return the number of stored bytes rather than the number of characters or glyphs. -- The code can be compiled without C++ **runtime type identification** features; that is, you can use the `-fno-rtti` compiler flag. -- **Exceptions** are used widely within the library. They can, however, be switched off with either using the compiler flag `-fno-exceptions` or by defining the symbol `JSON_NOEXCEPTION`. In this case, exceptions are replaced by an `abort()` call. -- By default, the library does not preserve the **insertion order of object elements**. This is standards-compliant, as the [JSON standard](https://tools.ietf.org/html/rfc7159.html) defines objects as "an unordered collection of zero or more name/value pairs". If you do want to preserve the insertion order, you can specialize the object type with containers like [`tsl::ordered_map`](https://github.com/Tessil/ordered-map) ([integration](https://github.com/nlohmann/json/issues/546#issuecomment-304447518)) or [`nlohmann::fifo_map`](https://github.com/nlohmann/fifo_map) ([integration](https://github.com/nlohmann/json/issues/485#issuecomment-333652309)). - - -## Execute unit tests - -To compile and run the tests, you need to execute - -```sh -$ mkdir build -$ cd build -$ cmake .. -$ cmake --build . -$ ctest -``` - -For more information, have a look at the file [.travis.yml](https://github.com/nlohmann/json/blob/master/.travis.yml). diff --git a/deps/json/include/nlohmann/json.hpp b/deps/json/include/nlohmann/json.hpp deleted file mode 100644 index 6dfc1831f..000000000 --- a/deps/json/include/nlohmann/json.hpp +++ /dev/null @@ -1,13003 +0,0 @@ -/* - __ _____ _____ _____ - __| | __| | | | JSON for Modern C++ -| | |__ | | | | | | version 2.1.1 -|_____|_____|_____|_|___| https://github.com/nlohmann/json - -Licensed under the MIT License . -Copyright (c) 2013-2017 Niels Lohmann . - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#ifndef NLOHMANN_JSON_HPP -#define NLOHMANN_JSON_HPP - -#include // all_of, copy, fill, find, for_each, none_of, remove, reverse, transform -#include // array -#include // assert -#include // isdigit -#include // and, not, or -#include // isfinite, labs, ldexp, signbit -#include // nullptr_t, ptrdiff_t, size_t -#include // int64_t, uint64_t -#include // abort, strtod, strtof, strtold, strtoul, strtoll, strtoull -#include // strlen -#include // forward_list -#include // function, hash, less -#include // initializer_list -#include // setw -#include // istream, ostream -#include // advance, begin, back_inserter, bidirectional_iterator_tag, distance, end, inserter, iterator, iterator_traits, next, random_access_iterator_tag, reverse_iterator -#include // numeric_limits -#include // locale -#include // map -#include // addressof, allocator, allocator_traits, unique_ptr -#include // accumulate -#include // stringstream -#include // domain_error, invalid_argument, out_of_range -#include // getline, stoi, string, to_string -#include // add_pointer, conditional, decay, enable_if, false_type, integral_constant, is_arithmetic, is_base_of, is_const, is_constructible, is_convertible, is_default_constructible, is_enum, is_floating_point, is_integral, is_nothrow_move_assignable, is_nothrow_move_constructible, is_pointer, is_reference, is_same, is_scalar, is_signed, remove_const, remove_cv, remove_pointer, remove_reference, true_type, underlying_type -#include // declval, forward, make_pair, move, pair, swap -#include // vector - -// exclude unsupported compilers -#if defined(__clang__) - #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 - #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" - #endif -#elif defined(__GNUC__) - #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900 - #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" - #endif -#endif - -// disable float-equal warnings on GCC/clang -#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wfloat-equal" -#endif - -// disable documentation warnings on clang -#if defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdocumentation" -#endif - -// allow for portable deprecation warnings -#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #define JSON_DEPRECATED __attribute__((deprecated)) -#elif defined(_MSC_VER) - #define JSON_DEPRECATED __declspec(deprecated) -#else - #define JSON_DEPRECATED -#endif - -// allow to disable exceptions -#if not defined(JSON_NOEXCEPTION) || defined(__EXCEPTIONS) - #define JSON_THROW(exception) throw exception - #define JSON_TRY try - #define JSON_CATCH(exception) catch(exception) -#else - #define JSON_THROW(exception) std::abort() - #define JSON_TRY if(true) - #define JSON_CATCH(exception) if(false) -#endif - -/*! -@brief namespace for Niels Lohmann -@see https://github.com/nlohmann -@since version 1.0.0 -*/ -namespace nlohmann -{ - -/*! -@brief unnamed namespace with internal helper functions - -This namespace collects some functions that could not be defined inside the -@ref basic_json class. - -@since version 2.1.0 -*/ -namespace detail -{ -/////////////////////////// -// JSON type enumeration // -/////////////////////////// - -/*! -@brief the JSON type enumeration - -This enumeration collects the different JSON types. It is internally used to -distinguish the stored values, and the functions @ref basic_json::is_null(), -@ref basic_json::is_object(), @ref basic_json::is_array(), -@ref basic_json::is_string(), @ref basic_json::is_boolean(), -@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), -@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), -@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and -@ref basic_json::is_structured() rely on it. - -@note There are three enumeration entries (number_integer, number_unsigned, and -number_float), because the library distinguishes these three types for numbers: -@ref basic_json::number_unsigned_t is used for unsigned integers, -@ref basic_json::number_integer_t is used for signed integers, and -@ref basic_json::number_float_t is used for floating-point numbers or to -approximate integers which do not fit in the limits of their respective type. - -@sa @ref basic_json::basic_json(const value_t value_type) -- create a JSON -value with the default value for a given type - -@since version 1.0.0 -*/ -enum class value_t : uint8_t -{ - null, ///< null value - object, ///< object (unordered set of name/value pairs) - array, ///< array (ordered collection of values) - string, ///< string value - boolean, ///< boolean value - number_integer, ///< number value (signed integer) - number_unsigned, ///< number value (unsigned integer) - number_float, ///< number value (floating-point) - discarded ///< discarded by the the parser callback function -}; - -/*! -@brief comparison operator for JSON types - -Returns an ordering that is similar to Python: -- order: null < boolean < number < object < array < string -- furthermore, each type is not smaller than itself - -@since version 1.0.0 -*/ -inline bool operator<(const value_t lhs, const value_t rhs) noexcept -{ - static constexpr std::array order = {{ - 0, // null - 3, // object - 4, // array - 5, // string - 1, // boolean - 2, // integer - 2, // unsigned - 2, // float - } - }; - - // discarded values are not comparable - if (lhs == value_t::discarded or rhs == value_t::discarded) - { - return false; - } - - return order[static_cast(lhs)] < - order[static_cast(rhs)]; -} - - -///////////// -// helpers // -///////////// - -// alias templates to reduce boilerplate -template -using enable_if_t = typename std::enable_if::type; - -template -using uncvref_t = typename std::remove_cv::type>::type; - -// taken from http://stackoverflow.com/a/26936864/266378 -template -using is_unscoped_enum = - std::integral_constant::value and - std::is_enum::value>; - -/* -Implementation of two C++17 constructs: conjunction, negation. This is needed -to avoid evaluating all the traits in a condition - -For example: not std::is_same::value and has_value_type::value -will not compile when T = void (on MSVC at least). Whereas -conjunction>, has_value_type>::value will -stop evaluating if negation<...>::value == false - -Please note that those constructs must be used with caution, since symbols can -become very long quickly (which can slow down compilation and cause MSVC -internal compiler errors). Only use it when you have to (see example ahead). -*/ -template struct conjunction : std::true_type {}; -template struct conjunction : B1 {}; -template -struct conjunction : std::conditional, B1>::type {}; - -template struct negation : std::integral_constant < bool, !B::value > {}; - -// dispatch utility (taken from ranges-v3) -template struct priority_tag : priority_tag < N - 1 > {}; -template<> struct priority_tag<0> {}; - - -////////////////// -// constructors // -////////////////// - -template struct external_constructor; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept - { - j.m_type = value_t::boolean; - j.m_value = b; - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) - { - j.m_type = value_t::string; - j.m_value = s; - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept - { - // replace infinity and NAN by null - if (not std::isfinite(val)) - { - j = BasicJsonType{}; - } - else - { - j.m_type = value_t::number_float; - j.m_value = val; - } - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept - { - j.m_type = value_t::number_unsigned; - j.m_value = val; - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept - { - j.m_type = value_t::number_integer; - j.m_value = val; - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) - { - j.m_type = value_t::array; - j.m_value = arr; - j.assert_invariant(); - } - - template::value, - int> = 0> - static void construct(BasicJsonType& j, const CompatibleArrayType& arr) - { - using std::begin; - using std::end; - j.m_type = value_t::array; - j.m_value.array = j.template create(begin(arr), end(arr)); - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) - { - j.m_type = value_t::object; - j.m_value = obj; - j.assert_invariant(); - } - - template::value, - int> = 0> - static void construct(BasicJsonType& j, const CompatibleObjectType& obj) - { - using std::begin; - using std::end; - - j.m_type = value_t::object; - j.m_value.object = j.template create(begin(obj), end(obj)); - j.assert_invariant(); - } -}; - - -//////////////////////// -// has_/is_ functions // -//////////////////////// - -/*! -@brief Helper to determine whether there's a key_type for T. - -This helper is used to tell associative containers apart from other containers -such as sequence containers. For instance, `std::map` passes the test as it -contains a `mapped_type`, whereas `std::vector` fails the test. - -@sa http://stackoverflow.com/a/7728728/266378 -@since version 1.0.0, overworked in version 2.0.6 -*/ -#define NLOHMANN_JSON_HAS_HELPER(type) \ - template struct has_##type { \ - private: \ - template \ - static int detect(U &&); \ - static void detect(...); \ - public: \ - static constexpr bool value = \ - std::is_integral()))>::value; \ - } - -NLOHMANN_JSON_HAS_HELPER(mapped_type); -NLOHMANN_JSON_HAS_HELPER(key_type); -NLOHMANN_JSON_HAS_HELPER(value_type); -NLOHMANN_JSON_HAS_HELPER(iterator); - -#undef NLOHMANN_JSON_HAS_HELPER - - -template -struct is_compatible_object_type_impl : std::false_type {}; - -template -struct is_compatible_object_type_impl -{ - static constexpr auto value = - std::is_constructible::value and - std::is_constructible::value; -}; - -template -struct is_compatible_object_type -{ - static auto constexpr value = is_compatible_object_type_impl < - conjunction>, - has_mapped_type, - has_key_type>::value, - typename BasicJsonType::object_t, CompatibleObjectType >::value; -}; - -template -struct is_basic_json_nested_type -{ - static auto constexpr value = std::is_same::value or - std::is_same::value or - std::is_same::value or - std::is_same::value or - std::is_same::value; -}; - -template -struct is_compatible_array_type -{ - static auto constexpr value = - conjunction>, - negation>, - negation>, - negation>, - has_value_type, - has_iterator>::value; -}; - -template -struct is_compatible_integer_type_impl : std::false_type {}; - -template -struct is_compatible_integer_type_impl -{ - // is there an assert somewhere on overflows? - using RealLimits = std::numeric_limits; - using CompatibleLimits = std::numeric_limits; - - static constexpr auto value = - std::is_constructible::value and - CompatibleLimits::is_integer and - RealLimits::is_signed == CompatibleLimits::is_signed; -}; - -template -struct is_compatible_integer_type -{ - static constexpr auto value = - is_compatible_integer_type_impl < - std::is_integral::value and - not std::is_same::value, - RealIntegerType, CompatibleNumberIntegerType > ::value; -}; - - -// trait checking if JSONSerializer::from_json(json const&, udt&) exists -template -struct has_from_json -{ - private: - // also check the return type of from_json - template::from_json( - std::declval(), std::declval()))>::value>> - static int detect(U&&); - static void detect(...); - - public: - static constexpr bool value = std::is_integral>()))>::value; -}; - -// This trait checks if JSONSerializer::from_json(json const&) exists -// this overload is used for non-default-constructible user-defined-types -template -struct has_non_default_from_json -{ - private: - template < - typename U, - typename = enable_if_t::from_json(std::declval()))>::value >> - static int detect(U&&); - static void detect(...); - - public: - static constexpr bool value = std::is_integral>()))>::value; -}; - -// This trait checks if BasicJsonType::json_serializer::to_json exists -template -struct has_to_json -{ - private: - template::to_json( - std::declval(), std::declval()))> - static int detect(U&&); - static void detect(...); - - public: - static constexpr bool value = std::is_integral>()))>::value; -}; - - -///////////// -// to_json // -///////////// - -template::value, int> = 0> -void to_json(BasicJsonType& j, T b) noexcept -{ - external_constructor::construct(j, b); -} - -template::value, int> = 0> -void to_json(BasicJsonType& j, const CompatibleString& s) -{ - external_constructor::construct(j, s); -} - -template::value, int> = 0> -void to_json(BasicJsonType& j, FloatType val) noexcept -{ - external_constructor::construct(j, static_cast(val)); -} - -template < - typename BasicJsonType, typename CompatibleNumberUnsignedType, - enable_if_t::value, int> = 0 > -void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept -{ - external_constructor::construct(j, static_cast(val)); -} - -template < - typename BasicJsonType, typename CompatibleNumberIntegerType, - enable_if_t::value, int> = 0 > -void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept -{ - external_constructor::construct(j, static_cast(val)); -} - -template::value, int> = 0> -void to_json(BasicJsonType& j, UnscopedEnumType e) noexcept -{ - external_constructor::construct(j, e); -} - -template < - typename BasicJsonType, typename CompatibleArrayType, - enable_if_t < - is_compatible_array_type::value or - std::is_same::value, - int > = 0 > -void to_json(BasicJsonType& j, const CompatibleArrayType& arr) -{ - external_constructor::construct(j, arr); -} - -template < - typename BasicJsonType, typename CompatibleObjectType, - enable_if_t::value, - int> = 0 > -void to_json(BasicJsonType& j, const CompatibleObjectType& arr) -{ - external_constructor::construct(j, arr); -} - - -/////////////// -// from_json // -/////////////// - -// overloads for basic_json template parameters -template::value and - not std::is_same::value, - int> = 0> -void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) -{ - switch (static_cast(j)) - { - case value_t::number_unsigned: - { - val = static_cast( - *j.template get_ptr()); - break; - } - case value_t::number_integer: - { - val = static_cast( - *j.template get_ptr()); - break; - } - case value_t::number_float: - { - val = static_cast( - *j.template get_ptr()); - break; - } - default: - { - JSON_THROW( - std::domain_error("type must be number, but is " + j.type_name())); - } - } -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) -{ - if (not j.is_boolean()) - { - JSON_THROW(std::domain_error("type must be boolean, but is " + j.type_name())); - } - b = *j.template get_ptr(); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) -{ - if (not j.is_string()) - { - JSON_THROW(std::domain_error("type must be string, but is " + j.type_name())); - } - s = *j.template get_ptr(); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) -{ - get_arithmetic_value(j, val); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) -{ - get_arithmetic_value(j, val); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) -{ - get_arithmetic_value(j, val); -} - -template::value, int> = 0> -void from_json(const BasicJsonType& j, UnscopedEnumType& e) -{ - typename std::underlying_type::type val; - get_arithmetic_value(j, val); - e = static_cast(val); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::array_t& arr) -{ - if (not j.is_array()) - { - JSON_THROW(std::domain_error("type must be array, but is " + j.type_name())); - } - arr = *j.template get_ptr(); -} - -// forward_list doesn't have an insert method -template -void from_json(const BasicJsonType& j, std::forward_list& l) -{ - // do not perform the check when user wants to retrieve jsons - // (except when it's null.. ?) - if (j.is_null()) - { - JSON_THROW(std::domain_error("type must be array, but is " + j.type_name())); - } - if (not std::is_same::value) - { - if (not j.is_array()) - { - JSON_THROW(std::domain_error("type must be array, but is " + j.type_name())); - } - } - for (auto it = j.rbegin(), end = j.rend(); it != end; ++it) - { - l.push_front(it->template get()); - } -} - -template -void from_json_array_impl(const BasicJsonType& j, CompatibleArrayType& arr, priority_tag<0>) -{ - using std::begin; - using std::end; - - std::transform(j.begin(), j.end(), - std::inserter(arr, end(arr)), [](const BasicJsonType & i) - { - // get() returns *this, this won't call a from_json - // method when value_type is BasicJsonType - return i.template get(); - }); -} - -template -auto from_json_array_impl(const BasicJsonType& j, CompatibleArrayType& arr, priority_tag<1>) --> decltype( - arr.reserve(std::declval()), - void()) -{ - using std::begin; - using std::end; - - arr.reserve(j.size()); - std::transform( - j.begin(), j.end(), std::inserter(arr, end(arr)), [](const BasicJsonType & i) - { - // get() returns *this, this won't call a from_json - // method when value_type is BasicJsonType - return i.template get(); - }); -} - -template::value and - not std::is_same::value, int> = 0> -void from_json(const BasicJsonType& j, CompatibleArrayType& arr) -{ - if (j.is_null()) - { - JSON_THROW(std::domain_error("type must be array, but is " + j.type_name())); - } - - // when T == BasicJsonType, do not check if value_t is correct - if (not std::is_same::value) - { - if (not j.is_array()) - { - JSON_THROW(std::domain_error("type must be array, but is " + j.type_name())); - } - } - from_json_array_impl(j, arr, priority_tag<1> {}); -} - -template::value, int> = 0> -void from_json(const BasicJsonType& j, CompatibleObjectType& obj) -{ - if (not j.is_object()) - { - JSON_THROW(std::domain_error("type must be object, but is " + j.type_name())); - } - - auto inner_object = j.template get_ptr(); - using std::begin; - using std::end; - // we could avoid the assignment, but this might require a for loop, which - // might be less efficient than the container constructor for some - // containers (would it?) - obj = CompatibleObjectType(begin(*inner_object), end(*inner_object)); -} - -// overload for arithmetic types, not chosen for basic_json template arguments -// (BooleanType, etc..); note: Is it really necessary to provide explicit -// overloads for boolean_t etc. in case of a custom BooleanType which is not -// an arithmetic type? -template::value and - not std::is_same::value and - not std::is_same::value and - not std::is_same::value and - not std::is_same::value, - int> = 0> -void from_json(const BasicJsonType& j, ArithmeticType& val) -{ - switch (static_cast(j)) - { - case value_t::number_unsigned: - { - val = static_cast(*j.template get_ptr()); - break; - } - case value_t::number_integer: - { - val = static_cast(*j.template get_ptr()); - break; - } - case value_t::number_float: - { - val = static_cast(*j.template get_ptr()); - break; - } - case value_t::boolean: - { - val = static_cast(*j.template get_ptr()); - break; - } - default: - { - JSON_THROW(std::domain_error("type must be number, but is " + j.type_name())); - } - } -} - -struct to_json_fn -{ - private: - template - auto call(BasicJsonType& j, T&& val, priority_tag<1>) const noexcept(noexcept(to_json(j, std::forward(val)))) - -> decltype(to_json(j, std::forward(val)), void()) - { - return to_json(j, std::forward(val)); - } - - template - void call(BasicJsonType&, T&&, priority_tag<0>) const noexcept - { - static_assert(sizeof(BasicJsonType) == 0, - "could not find to_json() method in T's namespace"); - } - - public: - template - void operator()(BasicJsonType& j, T&& val) const - noexcept(noexcept(std::declval().call(j, std::forward(val), priority_tag<1> {}))) - { - return call(j, std::forward(val), priority_tag<1> {}); - } -}; - -struct from_json_fn -{ - private: - template - auto call(const BasicJsonType& j, T& val, priority_tag<1>) const - noexcept(noexcept(from_json(j, val))) - -> decltype(from_json(j, val), void()) - { - return from_json(j, val); - } - - template - void call(const BasicJsonType&, T&, priority_tag<0>) const noexcept - { - static_assert(sizeof(BasicJsonType) == 0, - "could not find from_json() method in T's namespace"); - } - - public: - template - void operator()(const BasicJsonType& j, T& val) const - noexcept(noexcept(std::declval().call(j, val, priority_tag<1> {}))) - { - return call(j, val, priority_tag<1> {}); - } -}; - -// taken from ranges-v3 -template -struct static_const -{ - static constexpr T value{}; -}; - -template -constexpr T static_const::value; -} // namespace detail - - -/// namespace to hold default `to_json` / `from_json` functions -namespace -{ -constexpr const auto& to_json = detail::static_const::value; -constexpr const auto& from_json = detail::static_const::value; -} - - -/*! -@brief default JSONSerializer template argument - -This serializer ignores the template arguments and uses ADL -([argument-dependent lookup](http://en.cppreference.com/w/cpp/language/adl)) -for serialization. -*/ -template -struct adl_serializer -{ - /*! - @brief convert a JSON value to any value type - - This function is usually called by the `get()` function of the - @ref basic_json class (either explicit or via conversion operators). - - @param[in] j JSON value to read from - @param[in,out] val value to write to - */ - template - static void from_json(BasicJsonType&& j, ValueType& val) noexcept( - noexcept(::nlohmann::from_json(std::forward(j), val))) - { - ::nlohmann::from_json(std::forward(j), val); - } - - /*! - @brief convert any value type to a JSON value - - This function is usually called by the constructors of the @ref basic_json - class. - - @param[in,out] j JSON value to write to - @param[in] val value to read from - */ - template - static void to_json(BasicJsonType& j, ValueType&& val) noexcept( - noexcept(::nlohmann::to_json(j, std::forward(val)))) - { - ::nlohmann::to_json(j, std::forward(val)); - } -}; - - -/*! -@brief a class to store JSON values - -@tparam ObjectType type for JSON objects (`std::map` by default; will be used -in @ref object_t) -@tparam ArrayType type for JSON arrays (`std::vector` by default; will be used -in @ref array_t) -@tparam StringType type for JSON strings and object keys (`std::string` by -default; will be used in @ref string_t) -@tparam BooleanType type for JSON booleans (`bool` by default; will be used -in @ref boolean_t) -@tparam NumberIntegerType type for JSON integer numbers (`int64_t` by -default; will be used in @ref number_integer_t) -@tparam NumberUnsignedType type for JSON unsigned integer numbers (@c -`uint64_t` by default; will be used in @ref number_unsigned_t) -@tparam NumberFloatType type for JSON floating-point numbers (`double` by -default; will be used in @ref number_float_t) -@tparam AllocatorType type of the allocator to use (`std::allocator` by -default) -@tparam JSONSerializer the serializer to resolve internal calls to `to_json()` -and `from_json()` (@ref adl_serializer by default) - -@requirement The class satisfies the following concept requirements: -- Basic - - [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible): - JSON values can be default constructed. The result will be a JSON null - value. - - [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible): - A JSON value can be constructed from an rvalue argument. - - [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible): - A JSON value can be copy-constructed from an lvalue expression. - - [MoveAssignable](http://en.cppreference.com/w/cpp/concept/MoveAssignable): - A JSON value van be assigned from an rvalue argument. - - [CopyAssignable](http://en.cppreference.com/w/cpp/concept/CopyAssignable): - A JSON value can be copy-assigned from an lvalue expression. - - [Destructible](http://en.cppreference.com/w/cpp/concept/Destructible): - JSON values can be destructed. -- Layout - - [StandardLayoutType](http://en.cppreference.com/w/cpp/concept/StandardLayoutType): - JSON values have - [standard layout](http://en.cppreference.com/w/cpp/language/data_members#Standard_layout): - All non-static data members are private and standard layout types, the - class has no virtual functions or (virtual) base classes. -- Library-wide - - [EqualityComparable](http://en.cppreference.com/w/cpp/concept/EqualityComparable): - JSON values can be compared with `==`, see @ref - operator==(const_reference,const_reference). - - [LessThanComparable](http://en.cppreference.com/w/cpp/concept/LessThanComparable): - JSON values can be compared with `<`, see @ref - operator<(const_reference,const_reference). - - [Swappable](http://en.cppreference.com/w/cpp/concept/Swappable): - Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of - other compatible types, using unqualified function call @ref swap(). - - [NullablePointer](http://en.cppreference.com/w/cpp/concept/NullablePointer): - JSON values can be compared against `std::nullptr_t` objects which are used - to model the `null` value. -- Container - - [Container](http://en.cppreference.com/w/cpp/concept/Container): - JSON values can be used like STL containers and provide iterator access. - - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer); - JSON values can be used like STL containers and provide reverse iterator - access. - -@invariant The member variables @a m_value and @a m_type have the following -relationship: -- If `m_type == value_t::object`, then `m_value.object != nullptr`. -- If `m_type == value_t::array`, then `m_value.array != nullptr`. -- If `m_type == value_t::string`, then `m_value.string != nullptr`. -The invariants are checked by member function assert_invariant(). - -@internal -@note ObjectType trick from http://stackoverflow.com/a/9860911 -@endinternal - -@see [RFC 7159: The JavaScript Object Notation (JSON) Data Interchange -Format](http://rfc7159.net/rfc7159) - -@since version 1.0.0 - -@nosubgrouping -*/ -template < - template class ObjectType = std::map, - template class ArrayType = std::vector, - class StringType = std::string, - class BooleanType = bool, - class NumberIntegerType = std::int64_t, - class NumberUnsignedType = std::uint64_t, - class NumberFloatType = double, - template class AllocatorType = std::allocator, - template class JSONSerializer = adl_serializer - > -class basic_json -{ - private: - template friend struct detail::external_constructor; - /// workaround type for MSVC - using basic_json_t = basic_json; - - public: - using value_t = detail::value_t; - // forward declarations - template class iter_impl; - template class json_reverse_iterator; - class json_pointer; - template - using json_serializer = JSONSerializer; - - ///////////////////// - // container types // - ///////////////////// - - /// @name container types - /// The canonic container types to use @ref basic_json like any other STL - /// container. - /// @{ - - /// the type of elements in a basic_json container - using value_type = basic_json; - - /// the type of an element reference - using reference = value_type&; - /// the type of an element const reference - using const_reference = const value_type&; - - /// a type to represent differences between iterators - using difference_type = std::ptrdiff_t; - /// a type to represent container sizes - using size_type = std::size_t; - - /// the allocator type - using allocator_type = AllocatorType; - - /// the type of an element pointer - using pointer = typename std::allocator_traits::pointer; - /// the type of an element const pointer - using const_pointer = typename std::allocator_traits::const_pointer; - - /// an iterator for a basic_json container - using iterator = iter_impl; - /// a const iterator for a basic_json container - using const_iterator = iter_impl; - /// a reverse iterator for a basic_json container - using reverse_iterator = json_reverse_iterator; - /// a const reverse iterator for a basic_json container - using const_reverse_iterator = json_reverse_iterator; - - /// @} - - - /*! - @brief returns the allocator associated with the container - */ - static allocator_type get_allocator() - { - return allocator_type(); - } - - /*! - @brief returns version information on the library - - This function returns a JSON object with information about the library, - including the version number and information on the platform and compiler. - - @return JSON object holding version information - key | description - ----------- | --------------- - `compiler` | Information on the used compiler. It is an object with the following keys: `c++` (the used C++ standard), `family` (the compiler family; possible values are `clang`, `icc`, `gcc`, `ilecpp`, `msvc`, `pgcpp`, `sunpro`, and `unknown`), and `version` (the compiler version). - `copyright` | The copyright line for the library as string. - `name` | The name of the library as string. - `platform` | The used platform as string. Possible values are `win32`, `linux`, `apple`, `unix`, and `unknown`. - `url` | The URL of the project as string. - `version` | The version of the library. It is an object with the following keys: `major`, `minor`, and `patch` as defined by [Semantic Versioning](http://semver.org), and `string` (the version string). - - @liveexample{The following code shows an example output of the `meta()` - function.,meta} - - @complexity Constant. - - @since 2.1.0 - */ - static basic_json meta() - { - basic_json result; - - result["copyright"] = "(C) 2013-2017 Niels Lohmann"; - result["name"] = "JSON for Modern C++"; - result["url"] = "https://github.com/nlohmann/json"; - result["version"] = - { - {"string", "2.1.1"}, - {"major", 2}, - {"minor", 1}, - {"patch", 1} - }; - -#ifdef _WIN32 - result["platform"] = "win32"; -#elif defined __linux__ - result["platform"] = "linux"; -#elif defined __APPLE__ - result["platform"] = "apple"; -#elif defined __unix__ - result["platform"] = "unix"; -#else - result["platform"] = "unknown"; -#endif - -#if defined(__clang__) - result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}}; -#elif defined(__ICC) || defined(__INTEL_COMPILER) - result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}}; -#elif defined(__GNUC__) || defined(__GNUG__) - result["compiler"] = {{"family", "gcc"}, {"version", std::to_string(__GNUC__) + "." + std::to_string(__GNUC_MINOR__) + "." + std::to_string(__GNUC_PATCHLEVEL__)}}; -#elif defined(__HP_cc) || defined(__HP_aCC) - result["compiler"] = "hp" -#elif defined(__IBMCPP__) - result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}}; -#elif defined(_MSC_VER) - result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}}; -#elif defined(__PGI) - result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}}; -#elif defined(__SUNPRO_CC) - result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}}; -#else - result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; -#endif - -#ifdef __cplusplus - result["compiler"]["c++"] = std::to_string(__cplusplus); -#else - result["compiler"]["c++"] = "unknown"; -#endif - return result; - } - - - /////////////////////////// - // JSON value data types // - /////////////////////////// - - /// @name JSON value data types - /// The data types to store a JSON value. These types are derived from - /// the template arguments passed to class @ref basic_json. - /// @{ - - /*! - @brief a type for an object - - [RFC 7159](http://rfc7159.net/rfc7159) describes JSON objects as follows: - > An object is an unordered collection of zero or more name/value pairs, - > where a name is a string and a value is a string, number, boolean, null, - > object, or array. - - To store objects in C++, a type is defined by the template parameters - described below. - - @tparam ObjectType the container to store objects (e.g., `std::map` or - `std::unordered_map`) - @tparam StringType the type of the keys or names (e.g., `std::string`). - The comparison function `std::less` is used to order elements - inside the container. - @tparam AllocatorType the allocator to use for objects (e.g., - `std::allocator`) - - #### Default type - - With the default values for @a ObjectType (`std::map`), @a StringType - (`std::string`), and @a AllocatorType (`std::allocator`), the default - value for @a object_t is: - - @code {.cpp} - std::map< - std::string, // key_type - basic_json, // value_type - std::less, // key_compare - std::allocator> // allocator_type - > - @endcode - - #### Behavior - - The choice of @a object_t influences the behavior of the JSON class. With - the default type, objects have the following behavior: - - - When all names are unique, objects will be interoperable in the sense - that all software implementations receiving that object will agree on - the name-value mappings. - - When the names within an object are not unique, later stored name/value - pairs overwrite previously stored name/value pairs, leaving the used - names unique. For instance, `{"key": 1}` and `{"key": 2, "key": 1}` will - be treated as equal and both stored as `{"key": 1}`. - - Internally, name/value pairs are stored in lexicographical order of the - names. Objects will also be serialized (see @ref dump) in this order. - For instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored - and serialized as `{"a": 2, "b": 1}`. - - When comparing objects, the order of the name/value pairs is irrelevant. - This makes objects interoperable in the sense that they will not be - affected by these differences. For instance, `{"b": 1, "a": 2}` and - `{"a": 2, "b": 1}` will be treated as equal. - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) specifies: - > An implementation may set limits on the maximum depth of nesting. - - In this class, the object's limit of nesting is not constraint explicitly. - However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the - @ref max_size function of a JSON object. - - #### Storage - - Objects are stored as pointers in a @ref basic_json type. That is, for any - access to object values, a pointer of type `object_t*` must be - dereferenced. - - @sa @ref array_t -- type for an array value - - @since version 1.0.0 - - @note The order name/value pairs are added to the object is *not* - preserved by the library. Therefore, iterating an object may return - name/value pairs in a different order than they were originally stored. In - fact, keys will be traversed in alphabetical order as `std::map` with - `std::less` is used by default. Please note this behavior conforms to [RFC - 7159](http://rfc7159.net/rfc7159), because any order implements the - specified "unordered" nature of JSON objects. - */ - using object_t = ObjectType, - AllocatorType>>; - - /*! - @brief a type for an array - - [RFC 7159](http://rfc7159.net/rfc7159) describes JSON arrays as follows: - > An array is an ordered sequence of zero or more values. - - To store objects in C++, a type is defined by the template parameters - explained below. - - @tparam ArrayType container type to store arrays (e.g., `std::vector` or - `std::list`) - @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`) - - #### Default type - - With the default values for @a ArrayType (`std::vector`) and @a - AllocatorType (`std::allocator`), the default value for @a array_t is: - - @code {.cpp} - std::vector< - basic_json, // value_type - std::allocator // allocator_type - > - @endcode - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) specifies: - > An implementation may set limits on the maximum depth of nesting. - - In this class, the array's limit of nesting is not constraint explicitly. - However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the - @ref max_size function of a JSON array. - - #### Storage - - Arrays are stored as pointers in a @ref basic_json type. That is, for any - access to array values, a pointer of type `array_t*` must be dereferenced. - - @sa @ref object_t -- type for an object value - - @since version 1.0.0 - */ - using array_t = ArrayType>; - - /*! - @brief a type for a string - - [RFC 7159](http://rfc7159.net/rfc7159) describes JSON strings as follows: - > A string is a sequence of zero or more Unicode characters. - - To store objects in C++, a type is defined by the template parameter - described below. Unicode values are split by the JSON class into - byte-sized characters during deserialization. - - @tparam StringType the container to store strings (e.g., `std::string`). - Note this container is used for keys/names in objects, see @ref object_t. - - #### Default type - - With the default values for @a StringType (`std::string`), the default - value for @a string_t is: - - @code {.cpp} - std::string - @endcode - - #### Encoding - - Strings are stored in UTF-8 encoding. Therefore, functions like - `std::string::size()` or `std::string::length()` return the number of - bytes in the string rather than the number of characters or glyphs. - - #### String comparison - - [RFC 7159](http://rfc7159.net/rfc7159) states: - > Software implementations are typically required to test names of object - > members for equality. Implementations that transform the textual - > representation into sequences of Unicode code units and then perform the - > comparison numerically, code unit by code unit, are interoperable in the - > sense that implementations will agree in all cases on equality or - > inequality of two strings. For example, implementations that compare - > strings with escaped characters unconverted may incorrectly find that - > `"a\\b"` and `"a\u005Cb"` are not equal. - - This implementation is interoperable as it does compare strings code unit - by code unit. - - #### Storage - - String values are stored as pointers in a @ref basic_json type. That is, - for any access to string values, a pointer of type `string_t*` must be - dereferenced. - - @since version 1.0.0 - */ - using string_t = StringType; - - /*! - @brief a type for a boolean - - [RFC 7159](http://rfc7159.net/rfc7159) implicitly describes a boolean as a - type which differentiates the two literals `true` and `false`. - - To store objects in C++, a type is defined by the template parameter @a - BooleanType which chooses the type to use. - - #### Default type - - With the default values for @a BooleanType (`bool`), the default value for - @a boolean_t is: - - @code {.cpp} - bool - @endcode - - #### Storage - - Boolean values are stored directly inside a @ref basic_json type. - - @since version 1.0.0 - */ - using boolean_t = BooleanType; - - /*! - @brief a type for a number (integer) - - [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most - > programming languages. A number is represented in base 10 using decimal - > digits. It contains an integer component that may be prefixed with an - > optional minus sign, which may be followed by a fraction part and/or an - > exponent part. Leading zeros are not allowed. (...) Numeric values that - > cannot be represented in the grammar below (such as Infinity and NaN) - > are not permitted. - - This description includes both integer and floating-point numbers. - However, C++ allows more precise storage if it is known whether the number - is a signed integer, an unsigned integer or a floating-point number. - Therefore, three different types, @ref number_integer_t, @ref - number_unsigned_t and @ref number_float_t are used. - - To store integer numbers in C++, a type is defined by the template - parameter @a NumberIntegerType which chooses the type to use. - - #### Default type - - With the default values for @a NumberIntegerType (`int64_t`), the default - value for @a number_integer_t is: - - @code {.cpp} - int64_t - @endcode - - #### Default behavior - - - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in integer literals lead to an interpretation as octal - number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. - During deserialization, leading zeros yield an error. - - Not-a-number (NaN) values will be serialized to `null`. - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) specifies: - > An implementation may set limits on the range and precision of numbers. - - When the default type is used, the maximal integer number that can be - stored is `9223372036854775807` (INT64_MAX) and the minimal integer number - that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers - that are out of range will yield over/underflow when used in a - constructor. During deserialization, too large or small integer numbers - will be automatically be stored as @ref number_unsigned_t or @ref - number_float_t. - - [RFC 7159](http://rfc7159.net/rfc7159) further states: - > Note that when such software is used, numbers that are integers and are - > in the range \f$[-2^{53}+1, 2^{53}-1]\f$ are interoperable in the sense - > that implementations will agree exactly on their numeric values. - - As this range is a subrange of the exactly supported range [INT64_MIN, - INT64_MAX], this class's integer type is interoperable. - - #### Storage - - Integer number values are stored directly inside a @ref basic_json type. - - @sa @ref number_float_t -- type for number values (floating-point) - - @sa @ref number_unsigned_t -- type for number values (unsigned integer) - - @since version 1.0.0 - */ - using number_integer_t = NumberIntegerType; - - /*! - @brief a type for a number (unsigned) - - [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most - > programming languages. A number is represented in base 10 using decimal - > digits. It contains an integer component that may be prefixed with an - > optional minus sign, which may be followed by a fraction part and/or an - > exponent part. Leading zeros are not allowed. (...) Numeric values that - > cannot be represented in the grammar below (such as Infinity and NaN) - > are not permitted. - - This description includes both integer and floating-point numbers. - However, C++ allows more precise storage if it is known whether the number - is a signed integer, an unsigned integer or a floating-point number. - Therefore, three different types, @ref number_integer_t, @ref - number_unsigned_t and @ref number_float_t are used. - - To store unsigned integer numbers in C++, a type is defined by the - template parameter @a NumberUnsignedType which chooses the type to use. - - #### Default type - - With the default values for @a NumberUnsignedType (`uint64_t`), the - default value for @a number_unsigned_t is: - - @code {.cpp} - uint64_t - @endcode - - #### Default behavior - - - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in integer literals lead to an interpretation as octal - number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. - During deserialization, leading zeros yield an error. - - Not-a-number (NaN) values will be serialized to `null`. - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) specifies: - > An implementation may set limits on the range and precision of numbers. - - When the default type is used, the maximal integer number that can be - stored is `18446744073709551615` (UINT64_MAX) and the minimal integer - number that can be stored is `0`. Integer numbers that are out of range - will yield over/underflow when used in a constructor. During - deserialization, too large or small integer numbers will be automatically - be stored as @ref number_integer_t or @ref number_float_t. - - [RFC 7159](http://rfc7159.net/rfc7159) further states: - > Note that when such software is used, numbers that are integers and are - > in the range \f$[-2^{53}+1, 2^{53}-1]\f$ are interoperable in the sense - > that implementations will agree exactly on their numeric values. - - As this range is a subrange (when considered in conjunction with the - number_integer_t type) of the exactly supported range [0, UINT64_MAX], - this class's integer type is interoperable. - - #### Storage - - Integer number values are stored directly inside a @ref basic_json type. - - @sa @ref number_float_t -- type for number values (floating-point) - @sa @ref number_integer_t -- type for number values (integer) - - @since version 2.0.0 - */ - using number_unsigned_t = NumberUnsignedType; - - /*! - @brief a type for a number (floating-point) - - [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most - > programming languages. A number is represented in base 10 using decimal - > digits. It contains an integer component that may be prefixed with an - > optional minus sign, which may be followed by a fraction part and/or an - > exponent part. Leading zeros are not allowed. (...) Numeric values that - > cannot be represented in the grammar below (such as Infinity and NaN) - > are not permitted. - - This description includes both integer and floating-point numbers. - However, C++ allows more precise storage if it is known whether the number - is a signed integer, an unsigned integer or a floating-point number. - Therefore, three different types, @ref number_integer_t, @ref - number_unsigned_t and @ref number_float_t are used. - - To store floating-point numbers in C++, a type is defined by the template - parameter @a NumberFloatType which chooses the type to use. - - #### Default type - - With the default values for @a NumberFloatType (`double`), the default - value for @a number_float_t is: - - @code {.cpp} - double - @endcode - - #### Default behavior - - - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in floating-point literals will be ignored. Internally, - the value will be stored as decimal number. For instance, the C++ - floating-point literal `01.2` will be serialized to `1.2`. During - deserialization, leading zeros yield an error. - - Not-a-number (NaN) values will be serialized to `null`. - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) states: - > This specification allows implementations to set limits on the range and - > precision of numbers accepted. Since software that implements IEEE - > 754-2008 binary64 (double precision) numbers is generally available and - > widely used, good interoperability can be achieved by implementations - > that expect no more precision or range than these provide, in the sense - > that implementations will approximate JSON numbers within the expected - > precision. - - This implementation does exactly follow this approach, as it uses double - precision floating-point numbers. Note values smaller than - `-1.79769313486232e+308` and values greater than `1.79769313486232e+308` - will be stored as NaN internally and be serialized to `null`. - - #### Storage - - Floating-point number values are stored directly inside a @ref basic_json - type. - - @sa @ref number_integer_t -- type for number values (integer) - - @sa @ref number_unsigned_t -- type for number values (unsigned integer) - - @since version 1.0.0 - */ - using number_float_t = NumberFloatType; - - /// @} - - private: - - /// helper for exception-safe object creation - template - static T* create(Args&& ... args) - { - AllocatorType alloc; - auto deleter = [&](T * object) - { - alloc.deallocate(object, 1); - }; - std::unique_ptr object(alloc.allocate(1), deleter); - alloc.construct(object.get(), std::forward(args)...); - assert(object != nullptr); - return object.release(); - } - - //////////////////////// - // JSON value storage // - //////////////////////// - - /*! - @brief a JSON value - - The actual storage for a JSON value of the @ref basic_json class. This - union combines the different storage types for the JSON value types - defined in @ref value_t. - - JSON type | value_t type | used type - --------- | --------------- | ------------------------ - object | object | pointer to @ref object_t - array | array | pointer to @ref array_t - string | string | pointer to @ref string_t - boolean | boolean | @ref boolean_t - number | number_integer | @ref number_integer_t - number | number_unsigned | @ref number_unsigned_t - number | number_float | @ref number_float_t - null | null | *no value is stored* - - @note Variable-length types (objects, arrays, and strings) are stored as - pointers. The size of the union should not exceed 64 bits if the default - value types are used. - - @since version 1.0.0 - */ - union json_value - { - /// object (stored with pointer to save storage) - object_t* object; - /// array (stored with pointer to save storage) - array_t* array; - /// string (stored with pointer to save storage) - string_t* string; - /// boolean - boolean_t boolean; - /// number (integer) - number_integer_t number_integer; - /// number (unsigned integer) - number_unsigned_t number_unsigned; - /// number (floating-point) - number_float_t number_float; - - /// default constructor (for null values) - json_value() = default; - /// constructor for booleans - json_value(boolean_t v) noexcept : boolean(v) {} - /// constructor for numbers (integer) - json_value(number_integer_t v) noexcept : number_integer(v) {} - /// constructor for numbers (unsigned) - json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} - /// constructor for numbers (floating-point) - json_value(number_float_t v) noexcept : number_float(v) {} - /// constructor for empty values of a given type - json_value(value_t t) - { - switch (t) - { - case value_t::object: - { - object = create(); - break; - } - - case value_t::array: - { - array = create(); - break; - } - - case value_t::string: - { - string = create(""); - break; - } - - case value_t::boolean: - { - boolean = boolean_t(false); - break; - } - - case value_t::number_integer: - { - number_integer = number_integer_t(0); - break; - } - - case value_t::number_unsigned: - { - number_unsigned = number_unsigned_t(0); - break; - } - - case value_t::number_float: - { - number_float = number_float_t(0.0); - break; - } - - case value_t::null: - { - break; - } - - default: - { - if (t == value_t::null) - { - JSON_THROW(std::domain_error("961c151d2e87f2686a955a9be24d316f1362bf21 2.1.1")); // LCOV_EXCL_LINE - } - break; - } - } - } - - /// constructor for strings - json_value(const string_t& value) - { - string = create(value); - } - - /// constructor for objects - json_value(const object_t& value) - { - object = create(value); - } - - /// constructor for arrays - json_value(const array_t& value) - { - array = create(value); - } - }; - - /*! - @brief checks the class invariants - - This function asserts the class invariants. It needs to be called at the - end of every constructor to make sure that created objects respect the - invariant. Furthermore, it has to be called each time the type of a JSON - value is changed, because the invariant expresses a relationship between - @a m_type and @a m_value. - */ - void assert_invariant() const - { - assert(m_type != value_t::object or m_value.object != nullptr); - assert(m_type != value_t::array or m_value.array != nullptr); - assert(m_type != value_t::string or m_value.string != nullptr); - } - - public: - ////////////////////////// - // JSON parser callback // - ////////////////////////// - - /*! - @brief JSON callback events - - This enumeration lists the parser events that can trigger calling a - callback function of type @ref parser_callback_t during parsing. - - @image html callback_events.png "Example when certain parse events are triggered" - - @since version 1.0.0 - */ - enum class parse_event_t : uint8_t - { - /// the parser read `{` and started to process a JSON object - object_start, - /// the parser read `}` and finished processing a JSON object - object_end, - /// the parser read `[` and started to process a JSON array - array_start, - /// the parser read `]` and finished processing a JSON array - array_end, - /// the parser read a key of a value in an object - key, - /// the parser finished reading a JSON value - value - }; - - /*! - @brief per-element parser callback type - - With a parser callback function, the result of parsing a JSON text can be - influenced. When passed to @ref parse(std::istream&, const - parser_callback_t) or @ref parse(const CharT, const parser_callback_t), - it is called on certain events (passed as @ref parse_event_t via parameter - @a event) with a set recursion depth @a depth and context JSON value - @a parsed. The return value of the callback function is a boolean - indicating whether the element that emitted the callback shall be kept or - not. - - We distinguish six scenarios (determined by the event type) in which the - callback function can be called. The following table describes the values - of the parameters @a depth, @a event, and @a parsed. - - parameter @a event | description | parameter @a depth | parameter @a parsed - ------------------ | ----------- | ------------------ | ------------------- - parse_event_t::object_start | the parser read `{` and started to process a JSON object | depth of the parent of the JSON object | a JSON value with type discarded - parse_event_t::key | the parser read a key of a value in an object | depth of the currently parsed JSON object | a JSON string containing the key - parse_event_t::object_end | the parser read `}` and finished processing a JSON object | depth of the parent of the JSON object | the parsed JSON object - parse_event_t::array_start | the parser read `[` and started to process a JSON array | depth of the parent of the JSON array | a JSON value with type discarded - parse_event_t::array_end | the parser read `]` and finished processing a JSON array | depth of the parent of the JSON array | the parsed JSON array - parse_event_t::value | the parser finished reading a JSON value | depth of the value | the parsed JSON value - - @image html callback_events.png "Example when certain parse events are triggered" - - Discarding a value (i.e., returning `false`) has different effects - depending on the context in which function was called: - - - Discarded values in structured types are skipped. That is, the parser - will behave as if the discarded value was never read. - - In case a value outside a structured type is skipped, it is replaced - with `null`. This case happens if the top-level element is skipped. - - @param[in] depth the depth of the recursion during parsing - - @param[in] event an event of type parse_event_t indicating the context in - the callback function has been called - - @param[in,out] parsed the current intermediate parse result; note that - writing to this value has no effect for parse_event_t::key events - - @return Whether the JSON value which called the function during parsing - should be kept (`true`) or not (`false`). In the latter case, it is either - skipped completely or replaced by an empty discarded object. - - @sa @ref parse(std::istream&, parser_callback_t) or - @ref parse(const CharT, const parser_callback_t) for examples - - @since version 1.0.0 - */ - using parser_callback_t = std::function; - - - ////////////////// - // constructors // - ////////////////// - - /// @name constructors and destructors - /// Constructors of class @ref basic_json, copy/move constructor, copy - /// assignment, static functions creating objects, and the destructor. - /// @{ - - /*! - @brief create an empty value with a given type - - Create an empty JSON value with a given type. The value will be default - initialized with an empty value which depends on the type: - - Value type | initial value - ----------- | ------------- - null | `null` - boolean | `false` - string | `""` - number | `0` - object | `{}` - array | `[]` - - @param[in] value_type the type of the value to create - - @complexity Constant. - - @throw std::bad_alloc if allocation for object, array, or string value - fails - - @liveexample{The following code shows the constructor for different @ref - value_t values,basic_json__value_t} - - @since version 1.0.0 - */ - basic_json(const value_t value_type) - : m_type(value_type), m_value(value_type) - { - assert_invariant(); - } - - /*! - @brief create a null object - - Create a `null` JSON value. It either takes a null pointer as parameter - (explicitly creating `null`) or no parameter (implicitly creating `null`). - The passed null pointer itself is not read -- it is only used to choose - the right constructor. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this constructor never throws - exceptions. - - @liveexample{The following code shows the constructor with and without a - null pointer parameter.,basic_json__nullptr_t} - - @since version 1.0.0 - */ - basic_json(std::nullptr_t = nullptr) noexcept - : basic_json(value_t::null) - { - assert_invariant(); - } - - /*! - @brief create a JSON value - - This is a "catch all" constructor for all compatible JSON types; that is, - types for which a `to_json()` method exsits. The constructor forwards the - parameter @a val to that method (to `json_serializer::to_json` method - with `U = uncvref_t`, to be exact). - - Template type @a CompatibleType includes, but is not limited to, the - following types: - - **arrays**: @ref array_t and all kinds of compatible containers such as - `std::vector`, `std::deque`, `std::list`, `std::forward_list`, - `std::array`, `std::set`, `std::unordered_set`, `std::multiset`, and - `unordered_multiset` with a `value_type` from which a @ref basic_json - value can be constructed. - - **objects**: @ref object_t and all kinds of compatible associative - containers such as `std::map`, `std::unordered_map`, `std::multimap`, - and `std::unordered_multimap` with a `key_type` compatible to - @ref string_t and a `value_type` from which a @ref basic_json value can - be constructed. - - **strings**: @ref string_t, string literals, and all compatible string - containers can be used. - - **numbers**: @ref number_integer_t, @ref number_unsigned_t, - @ref number_float_t, and all convertible number types such as `int`, - `size_t`, `int64_t`, `float` or `double` can be used. - - **boolean**: @ref boolean_t / `bool` can be used. - - See the examples below. - - @tparam CompatibleType a type such that: - - @a CompatibleType is not derived from `std::istream`, - - @a CompatibleType is not @ref basic_json (to avoid hijacking copy/move - constructors), - - @a CompatibleType is not a @ref basic_json nested type (e.g., - @ref json_pointer, @ref iterator, etc ...) - - @ref @ref json_serializer has a - `to_json(basic_json_t&, CompatibleType&&)` method - - @tparam U = `uncvref_t` - - @param[in] val the value to be forwarded - - @complexity Usually linear in the size of the passed @a val, also - depending on the implementation of the called `to_json()` - method. - - @throw what `json_serializer::to_json()` throws - - @liveexample{The following code shows the constructor with several - compatible types.,basic_json__CompatibleType} - - @since version 2.1.0 - */ - template, - detail::enable_if_t::value and - not std::is_same::value and - not detail::is_basic_json_nested_type< - basic_json_t, U>::value and - detail::has_to_json::value, - int> = 0> - basic_json(CompatibleType && val) noexcept(noexcept(JSONSerializer::to_json( - std::declval(), std::forward(val)))) - { - JSONSerializer::to_json(*this, std::forward(val)); - assert_invariant(); - } - - /*! - @brief create a container (array or object) from an initializer list - - Creates a JSON value of type array or object from the passed initializer - list @a init. In case @a type_deduction is `true` (default), the type of - the JSON value to be created is deducted from the initializer list @a init - according to the following rules: - - 1. If the list is empty, an empty JSON object value `{}` is created. - 2. If the list consists of pairs whose first element is a string, a JSON - object value is created where the first elements of the pairs are - treated as keys and the second elements are as values. - 3. In all other cases, an array is created. - - The rules aim to create the best fit between a C++ initializer list and - JSON values. The rationale is as follows: - - 1. The empty initializer list is written as `{}` which is exactly an empty - JSON object. - 2. C++ has now way of describing mapped types other than to list a list of - pairs. As JSON requires that keys must be of type string, rule 2 is the - weakest constraint one can pose on initializer lists to interpret them - as an object. - 3. In all other cases, the initializer list could not be interpreted as - JSON object type, so interpreting it as JSON array type is safe. - - With the rules described above, the following JSON values cannot be - expressed by an initializer list: - - - the empty array (`[]`): use @ref array(std::initializer_list) - with an empty initializer list in this case - - arrays whose elements satisfy rule 2: use @ref - array(std::initializer_list) with the same initializer list - in this case - - @note When used without parentheses around an empty initializer list, @ref - basic_json() is called instead of this function, yielding the JSON null - value. - - @param[in] init initializer list with JSON values - - @param[in] type_deduction internal parameter; when set to `true`, the type - of the JSON value is deducted from the initializer list @a init; when set - to `false`, the type provided via @a manual_type is forced. This mode is - used by the functions @ref array(std::initializer_list) and - @ref object(std::initializer_list). - - @param[in] manual_type internal parameter; when @a type_deduction is set - to `false`, the created JSON value will use the provided type (only @ref - value_t::array and @ref value_t::object are valid); when @a type_deduction - is set to `true`, this parameter has no effect - - @throw std::domain_error if @a type_deduction is `false`, @a manual_type - is `value_t::object`, but @a init contains an element which is not a pair - whose first element is a string; example: `"cannot create object from - initializer list"` - - @complexity Linear in the size of the initializer list @a init. - - @liveexample{The example below shows how JSON values are created from - initializer lists.,basic_json__list_init_t} - - @sa @ref array(std::initializer_list) -- create a JSON array - value from an initializer list - @sa @ref object(std::initializer_list) -- create a JSON object - value from an initializer list - - @since version 1.0.0 - */ - basic_json(std::initializer_list init, - bool type_deduction = true, - value_t manual_type = value_t::array) - { - // check if each element is an array with two elements whose first - // element is a string - bool is_an_object = std::all_of(init.begin(), init.end(), - [](const basic_json & element) - { - return element.is_array() and element.size() == 2 and element[0].is_string(); - }); - - // adjust type if type deduction is not wanted - if (not type_deduction) - { - // if array is wanted, do not create an object though possible - if (manual_type == value_t::array) - { - is_an_object = false; - } - - // if object is wanted but impossible, throw an exception - if (manual_type == value_t::object and not is_an_object) - { - JSON_THROW(std::domain_error("cannot create object from initializer list")); - } - } - - if (is_an_object) - { - // the initializer list is a list of pairs -> create object - m_type = value_t::object; - m_value = value_t::object; - - std::for_each(init.begin(), init.end(), [this](const basic_json & element) - { - m_value.object->emplace(*(element[0].m_value.string), element[1]); - }); - } - else - { - // the initializer list describes an array -> create array - m_type = value_t::array; - m_value.array = create(init); - } - - assert_invariant(); - } - - /*! - @brief explicitly create an array from an initializer list - - Creates a JSON array value from a given initializer list. That is, given a - list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the - initializer list is empty, the empty array `[]` is created. - - @note This function is only needed to express two edge cases that cannot - be realized with the initializer list constructor (@ref - basic_json(std::initializer_list, bool, value_t)). These cases - are: - 1. creating an array whose elements are all pairs whose first element is a - string -- in this case, the initializer list constructor would create an - object, taking the first elements as keys - 2. creating an empty array -- passing the empty initializer list to the - initializer list constructor yields an empty object - - @param[in] init initializer list with JSON values to create an array from - (optional) - - @return JSON array value - - @complexity Linear in the size of @a init. - - @liveexample{The following code shows an example for the `array` - function.,array} - - @sa @ref basic_json(std::initializer_list, bool, value_t) -- - create a JSON value from an initializer list - @sa @ref object(std::initializer_list) -- create a JSON object - value from an initializer list - - @since version 1.0.0 - */ - static basic_json array(std::initializer_list init = - std::initializer_list()) - { - return basic_json(init, false, value_t::array); - } - - /*! - @brief explicitly create an object from an initializer list - - Creates a JSON object value from a given initializer list. The initializer - lists elements must be pairs, and their first elements must be strings. If - the initializer list is empty, the empty object `{}` is created. - - @note This function is only added for symmetry reasons. In contrast to the - related function @ref array(std::initializer_list), there are - no cases which can only be expressed by this function. That is, any - initializer list @a init can also be passed to the initializer list - constructor @ref basic_json(std::initializer_list, bool, - value_t). - - @param[in] init initializer list to create an object from (optional) - - @return JSON object value - - @throw std::domain_error if @a init is not a pair whose first elements are - strings; thrown by - @ref basic_json(std::initializer_list, bool, value_t) - - @complexity Linear in the size of @a init. - - @liveexample{The following code shows an example for the `object` - function.,object} - - @sa @ref basic_json(std::initializer_list, bool, value_t) -- - create a JSON value from an initializer list - @sa @ref array(std::initializer_list) -- create a JSON array - value from an initializer list - - @since version 1.0.0 - */ - static basic_json object(std::initializer_list init = - std::initializer_list()) - { - return basic_json(init, false, value_t::object); - } - - /*! - @brief construct an array with count copies of given value - - Constructs a JSON array value by creating @a cnt copies of a passed value. - In case @a cnt is `0`, an empty array is created. As postcondition, - `std::distance(begin(),end()) == cnt` holds. - - @param[in] cnt the number of JSON copies of @a val to create - @param[in] val the JSON value to copy - - @complexity Linear in @a cnt. - - @liveexample{The following code shows examples for the @ref - basic_json(size_type\, const basic_json&) - constructor.,basic_json__size_type_basic_json} - - @since version 1.0.0 - */ - basic_json(size_type cnt, const basic_json& val) - : m_type(value_t::array) - { - m_value.array = create(cnt, val); - assert_invariant(); - } - - /*! - @brief construct a JSON container given an iterator range - - Constructs the JSON value with the contents of the range `[first, last)`. - The semantics depends on the different types a JSON value can have: - - In case of primitive types (number, boolean, or string), @a first must - be `begin()` and @a last must be `end()`. In this case, the value is - copied. Otherwise, std::out_of_range is thrown. - - In case of structured types (array, object), the constructor behaves as - similar versions for `std::vector`. - - In case of a null type, std::domain_error is thrown. - - @tparam InputIT an input iterator type (@ref iterator or @ref - const_iterator) - - @param[in] first begin of the range to copy from (included) - @param[in] last end of the range to copy from (excluded) - - @pre Iterators @a first and @a last must be initialized. **This - precondition is enforced with an assertion.** - - @throw std::domain_error if iterators are not compatible; that is, do not - belong to the same JSON value; example: `"iterators are not compatible"` - @throw std::out_of_range if iterators are for a primitive type (number, - boolean, or string) where an out of range error can be detected easily; - example: `"iterators out of range"` - @throw std::bad_alloc if allocation for object, array, or string fails - @throw std::domain_error if called with a null value; example: `"cannot - use construct with iterators from null"` - - @complexity Linear in distance between @a first and @a last. - - @liveexample{The example below shows several ways to create JSON values by - specifying a subrange with iterators.,basic_json__InputIt_InputIt} - - @since version 1.0.0 - */ - template::value or - std::is_same::value, int>::type = 0> - basic_json(InputIT first, InputIT last) - { - assert(first.m_object != nullptr); - assert(last.m_object != nullptr); - - // make sure iterator fits the current value - if (first.m_object != last.m_object) - { - JSON_THROW(std::domain_error("iterators are not compatible")); - } - - // copy type from first iterator - m_type = first.m_object->m_type; - - // check if iterator range is complete for primitive values - switch (m_type) - { - case value_t::boolean: - case value_t::number_float: - case value_t::number_integer: - case value_t::number_unsigned: - case value_t::string: - { - if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) - { - JSON_THROW(std::out_of_range("iterators out of range")); - } - break; - } - - default: - { - break; - } - } - - switch (m_type) - { - case value_t::number_integer: - { - m_value.number_integer = first.m_object->m_value.number_integer; - break; - } - - case value_t::number_unsigned: - { - m_value.number_unsigned = first.m_object->m_value.number_unsigned; - break; - } - - case value_t::number_float: - { - m_value.number_float = first.m_object->m_value.number_float; - break; - } - - case value_t::boolean: - { - m_value.boolean = first.m_object->m_value.boolean; - break; - } - - case value_t::string: - { - m_value = *first.m_object->m_value.string; - break; - } - - case value_t::object: - { - m_value.object = create(first.m_it.object_iterator, - last.m_it.object_iterator); - break; - } - - case value_t::array: - { - m_value.array = create(first.m_it.array_iterator, - last.m_it.array_iterator); - break; - } - - default: - { - JSON_THROW(std::domain_error("cannot use construct with iterators from " + first.m_object->type_name())); - } - } - - assert_invariant(); - } - - /*! - @brief construct a JSON value given an input stream - - @param[in,out] i stream to read a serialized JSON value from - @param[in] cb a parser callback function of type @ref parser_callback_t - which is used to control the deserialization by filtering unwanted values - (optional) - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. The complexity can be higher if the parser callback function - @a cb has a super-linear complexity. - - @note A UTF-8 byte order mark is silently ignored. - - @deprecated This constructor is deprecated and will be removed in version - 3.0.0 to unify the interface of the library. Deserialization will be - done by stream operators or by calling one of the `parse` functions, - e.g. @ref parse(std::istream&, const parser_callback_t). That is, calls - like `json j(i);` for an input stream @a i need to be replaced by - `json j = json::parse(i);`. See the example below. - - @liveexample{The example below demonstrates constructing a JSON value from - a `std::stringstream` with and without callback - function.,basic_json__istream} - - @since version 2.0.0, deprecated in version 2.0.3, to be removed in - version 3.0.0 - */ - JSON_DEPRECATED - explicit basic_json(std::istream& i, const parser_callback_t cb = nullptr) - { - *this = parser(i, cb).parse(); - assert_invariant(); - } - - /////////////////////////////////////// - // other constructors and destructor // - /////////////////////////////////////// - - /*! - @brief copy constructor - - Creates a copy of a given JSON value. - - @param[in] other the JSON value to copy - - @complexity Linear in the size of @a other. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is linear. - - As postcondition, it holds: `other == basic_json(other)`. - - @throw std::bad_alloc if allocation for object, array, or string fails. - - @liveexample{The following code shows an example for the copy - constructor.,basic_json__basic_json} - - @since version 1.0.0 - */ - basic_json(const basic_json& other) - : m_type(other.m_type) - { - // check of passed value is valid - other.assert_invariant(); - - switch (m_type) - { - case value_t::object: - { - m_value = *other.m_value.object; - break; - } - - case value_t::array: - { - m_value = *other.m_value.array; - break; - } - - case value_t::string: - { - m_value = *other.m_value.string; - break; - } - - case value_t::boolean: - { - m_value = other.m_value.boolean; - break; - } - - case value_t::number_integer: - { - m_value = other.m_value.number_integer; - break; - } - - case value_t::number_unsigned: - { - m_value = other.m_value.number_unsigned; - break; - } - - case value_t::number_float: - { - m_value = other.m_value.number_float; - break; - } - - default: - { - break; - } - } - - assert_invariant(); - } - - /*! - @brief move constructor - - Move constructor. Constructs a JSON value with the contents of the given - value @a other using move semantics. It "steals" the resources from @a - other and leaves it as JSON null value. - - @param[in,out] other value to move to this object - - @post @a other is a JSON null value - - @complexity Constant. - - @liveexample{The code below shows the move constructor explicitly called - via std::move.,basic_json__moveconstructor} - - @since version 1.0.0 - */ - basic_json(basic_json&& other) noexcept - : m_type(std::move(other.m_type)), - m_value(std::move(other.m_value)) - { - // check that passed value is valid - other.assert_invariant(); - - // invalidate payload - other.m_type = value_t::null; - other.m_value = {}; - - assert_invariant(); - } - - /*! - @brief copy assignment - - Copy assignment operator. Copies a JSON value via the "copy and swap" - strategy: It is expressed in terms of the copy constructor, destructor, - and the swap() member function. - - @param[in] other value to copy from - - @complexity Linear. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is linear. - - @liveexample{The code below shows and example for the copy assignment. It - creates a copy of value `a` which is then swapped with `b`. Finally\, the - copy of `a` (which is the null value after the swap) is - destroyed.,basic_json__copyassignment} - - @since version 1.0.0 - */ - reference& operator=(basic_json other) noexcept ( - std::is_nothrow_move_constructible::value and - std::is_nothrow_move_assignable::value and - std::is_nothrow_move_constructible::value and - std::is_nothrow_move_assignable::value - ) - { - // check that passed value is valid - other.assert_invariant(); - - using std::swap; - swap(m_type, other.m_type); - swap(m_value, other.m_value); - - assert_invariant(); - return *this; - } - - /*! - @brief destructor - - Destroys the JSON value and frees all allocated memory. - - @complexity Linear. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is linear. - - All stored elements are destroyed and all memory is freed. - - @since version 1.0.0 - */ - ~basic_json() - { - assert_invariant(); - - switch (m_type) - { - case value_t::object: - { - AllocatorType alloc; - alloc.destroy(m_value.object); - alloc.deallocate(m_value.object, 1); - break; - } - - case value_t::array: - { - AllocatorType alloc; - alloc.destroy(m_value.array); - alloc.deallocate(m_value.array, 1); - break; - } - - case value_t::string: - { - AllocatorType alloc; - alloc.destroy(m_value.string); - alloc.deallocate(m_value.string, 1); - break; - } - - default: - { - // all other types need no specific destructor - break; - } - } - } - - /// @} - - public: - /////////////////////// - // object inspection // - /////////////////////// - - /// @name object inspection - /// Functions to inspect the type of a JSON value. - /// @{ - - /*! - @brief serialization - - Serialization function for JSON values. The function tries to mimic - Python's `json.dumps()` function, and currently supports its @a indent - parameter. - - @param[in] indent If indent is nonnegative, then array elements and object - members will be pretty-printed with that indent level. An indent level of - `0` will only insert newlines. `-1` (the default) selects the most compact - representation. - - @return string containing the serialization of the JSON value - - @complexity Linear. - - @liveexample{The following example shows the effect of different @a indent - parameters to the result of the serialization.,dump} - - @see https://docs.python.org/2/library/json.html#json.dump - - @since version 1.0.0 - */ - string_t dump(const int indent = -1) const - { - std::stringstream ss; - - if (indent >= 0) - { - dump(ss, true, static_cast(indent)); - } - else - { - dump(ss, false, 0); - } - - return ss.str(); - } - - /*! - @brief return the type of the JSON value (explicit) - - Return the type of the JSON value as a value from the @ref value_t - enumeration. - - @return the type of the JSON value - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `type()` for all JSON - types.,type} - - @since version 1.0.0 - */ - constexpr value_t type() const noexcept - { - return m_type; - } - - /*! - @brief return whether type is primitive - - This function returns true iff the JSON type is primitive (string, number, - boolean, or null). - - @return `true` if type is primitive (string, number, boolean, or null), - `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_primitive()` for all JSON - types.,is_primitive} - - @sa @ref is_structured() -- returns whether JSON value is structured - @sa @ref is_null() -- returns whether JSON value is `null` - @sa @ref is_string() -- returns whether JSON value is a string - @sa @ref is_boolean() -- returns whether JSON value is a boolean - @sa @ref is_number() -- returns whether JSON value is a number - - @since version 1.0.0 - */ - constexpr bool is_primitive() const noexcept - { - return is_null() or is_string() or is_boolean() or is_number(); - } - - /*! - @brief return whether type is structured - - This function returns true iff the JSON type is structured (array or - object). - - @return `true` if type is structured (array or object), `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_structured()` for all JSON - types.,is_structured} - - @sa @ref is_primitive() -- returns whether value is primitive - @sa @ref is_array() -- returns whether value is an array - @sa @ref is_object() -- returns whether value is an object - - @since version 1.0.0 - */ - constexpr bool is_structured() const noexcept - { - return is_array() or is_object(); - } - - /*! - @brief return whether value is null - - This function returns true iff the JSON value is null. - - @return `true` if type is null, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_null()` for all JSON - types.,is_null} - - @since version 1.0.0 - */ - constexpr bool is_null() const noexcept - { - return m_type == value_t::null; - } - - /*! - @brief return whether value is a boolean - - This function returns true iff the JSON value is a boolean. - - @return `true` if type is boolean, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_boolean()` for all JSON - types.,is_boolean} - - @since version 1.0.0 - */ - constexpr bool is_boolean() const noexcept - { - return m_type == value_t::boolean; - } - - /*! - @brief return whether value is a number - - This function returns true iff the JSON value is a number. This includes - both integer and floating-point values. - - @return `true` if type is number (regardless whether integer, unsigned - integer or floating-type), `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_number()` for all JSON - types.,is_number} - - @sa @ref is_number_integer() -- check if value is an integer or unsigned - integer number - @sa @ref is_number_unsigned() -- check if value is an unsigned integer - number - @sa @ref is_number_float() -- check if value is a floating-point number - - @since version 1.0.0 - */ - constexpr bool is_number() const noexcept - { - return is_number_integer() or is_number_float(); - } - - /*! - @brief return whether value is an integer number - - This function returns true iff the JSON value is an integer or unsigned - integer number. This excludes floating-point values. - - @return `true` if type is an integer or unsigned integer number, `false` - otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_number_integer()` for all - JSON types.,is_number_integer} - - @sa @ref is_number() -- check if value is a number - @sa @ref is_number_unsigned() -- check if value is an unsigned integer - number - @sa @ref is_number_float() -- check if value is a floating-point number - - @since version 1.0.0 - */ - constexpr bool is_number_integer() const noexcept - { - return m_type == value_t::number_integer or m_type == value_t::number_unsigned; - } - - /*! - @brief return whether value is an unsigned integer number - - This function returns true iff the JSON value is an unsigned integer - number. This excludes floating-point and (signed) integer values. - - @return `true` if type is an unsigned integer number, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_number_unsigned()` for all - JSON types.,is_number_unsigned} - - @sa @ref is_number() -- check if value is a number - @sa @ref is_number_integer() -- check if value is an integer or unsigned - integer number - @sa @ref is_number_float() -- check if value is a floating-point number - - @since version 2.0.0 - */ - constexpr bool is_number_unsigned() const noexcept - { - return m_type == value_t::number_unsigned; - } - - /*! - @brief return whether value is a floating-point number - - This function returns true iff the JSON value is a floating-point number. - This excludes integer and unsigned integer values. - - @return `true` if type is a floating-point number, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_number_float()` for all - JSON types.,is_number_float} - - @sa @ref is_number() -- check if value is number - @sa @ref is_number_integer() -- check if value is an integer number - @sa @ref is_number_unsigned() -- check if value is an unsigned integer - number - - @since version 1.0.0 - */ - constexpr bool is_number_float() const noexcept - { - return m_type == value_t::number_float; - } - - /*! - @brief return whether value is an object - - This function returns true iff the JSON value is an object. - - @return `true` if type is object, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_object()` for all JSON - types.,is_object} - - @since version 1.0.0 - */ - constexpr bool is_object() const noexcept - { - return m_type == value_t::object; - } - - /*! - @brief return whether value is an array - - This function returns true iff the JSON value is an array. - - @return `true` if type is array, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_array()` for all JSON - types.,is_array} - - @since version 1.0.0 - */ - constexpr bool is_array() const noexcept - { - return m_type == value_t::array; - } - - /*! - @brief return whether value is a string - - This function returns true iff the JSON value is a string. - - @return `true` if type is string, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_string()` for all JSON - types.,is_string} - - @since version 1.0.0 - */ - constexpr bool is_string() const noexcept - { - return m_type == value_t::string; - } - - /*! - @brief return whether value is discarded - - This function returns true iff the JSON value was discarded during parsing - with a callback function (see @ref parser_callback_t). - - @note This function will always be `false` for JSON values after parsing. - That is, discarded values can only occur during parsing, but will be - removed when inside a structured value or replaced by null in other cases. - - @return `true` if type is discarded, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_discarded()` for all JSON - types.,is_discarded} - - @since version 1.0.0 - */ - constexpr bool is_discarded() const noexcept - { - return m_type == value_t::discarded; - } - - /*! - @brief return the type of the JSON value (implicit) - - Implicitly return the type of the JSON value as a value from the @ref - value_t enumeration. - - @return the type of the JSON value - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies the @ref value_t operator for - all JSON types.,operator__value_t} - - @since version 1.0.0 - */ - constexpr operator value_t() const noexcept - { - return m_type; - } - - /// @} - - private: - ////////////////// - // value access // - ////////////////// - - /// get a boolean (explicit) - boolean_t get_impl(boolean_t* /*unused*/) const - { - if (is_boolean()) - { - return m_value.boolean; - } - - JSON_THROW(std::domain_error("type must be boolean, but is " + type_name())); - } - - /// get a pointer to the value (object) - object_t* get_impl_ptr(object_t* /*unused*/) noexcept - { - return is_object() ? m_value.object : nullptr; - } - - /// get a pointer to the value (object) - constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept - { - return is_object() ? m_value.object : nullptr; - } - - /// get a pointer to the value (array) - array_t* get_impl_ptr(array_t* /*unused*/) noexcept - { - return is_array() ? m_value.array : nullptr; - } - - /// get a pointer to the value (array) - constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept - { - return is_array() ? m_value.array : nullptr; - } - - /// get a pointer to the value (string) - string_t* get_impl_ptr(string_t* /*unused*/) noexcept - { - return is_string() ? m_value.string : nullptr; - } - - /// get a pointer to the value (string) - constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept - { - return is_string() ? m_value.string : nullptr; - } - - /// get a pointer to the value (boolean) - boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept - { - return is_boolean() ? &m_value.boolean : nullptr; - } - - /// get a pointer to the value (boolean) - constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept - { - return is_boolean() ? &m_value.boolean : nullptr; - } - - /// get a pointer to the value (integer number) - number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept - { - return is_number_integer() ? &m_value.number_integer : nullptr; - } - - /// get a pointer to the value (integer number) - constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept - { - return is_number_integer() ? &m_value.number_integer : nullptr; - } - - /// get a pointer to the value (unsigned number) - number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept - { - return is_number_unsigned() ? &m_value.number_unsigned : nullptr; - } - - /// get a pointer to the value (unsigned number) - constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept - { - return is_number_unsigned() ? &m_value.number_unsigned : nullptr; - } - - /// get a pointer to the value (floating-point number) - number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept - { - return is_number_float() ? &m_value.number_float : nullptr; - } - - /// get a pointer to the value (floating-point number) - constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept - { - return is_number_float() ? &m_value.number_float : nullptr; - } - - /*! - @brief helper function to implement get_ref() - - This funcion helps to implement get_ref() without code duplication for - const and non-const overloads - - @tparam ThisType will be deduced as `basic_json` or `const basic_json` - - @throw std::domain_error if ReferenceType does not match underlying value - type of the current JSON - */ - template - static ReferenceType get_ref_impl(ThisType& obj) - { - // helper type - using PointerType = typename std::add_pointer::type; - - // delegate the call to get_ptr<>() - auto ptr = obj.template get_ptr(); - - if (ptr != nullptr) - { - return *ptr; - } - - JSON_THROW(std::domain_error("incompatible ReferenceType for get_ref, actual type is " + - obj.type_name())); - } - - public: - /// @name value access - /// Direct access to the stored value of a JSON value. - /// @{ - - /*! - @brief get special-case overload - - This overloads avoids a lot of template boilerplate, it can be seen as the - identity method - - @tparam BasicJsonType == @ref basic_json - - @return a copy of *this - - @complexity Constant. - - @since version 2.1.0 - */ - template < - typename BasicJsonType, - detail::enable_if_t::type, - basic_json_t>::value, - int> = 0 > - basic_json get() const - { - return *this; - } - - /*! - @brief get a value (explicit) - - Explicit type conversion between the JSON value and a compatible value - which is [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible) - and [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). - The value is converted by calling the @ref json_serializer - `from_json()` method. - - The function is equivalent to executing - @code {.cpp} - ValueType ret; - JSONSerializer::from_json(*this, ret); - return ret; - @endcode - - This overloads is chosen if: - - @a ValueType is not @ref basic_json, - - @ref json_serializer has a `from_json()` method of the form - `void from_json(const @ref basic_json&, ValueType&)`, and - - @ref json_serializer does not have a `from_json()` method of - the form `ValueType from_json(const @ref basic_json&)` - - @tparam ValueTypeCV the provided value type - @tparam ValueType the returned value type - - @return copy of the JSON value, converted to @a ValueType - - @throw what @ref json_serializer `from_json()` method throws - - @liveexample{The example below shows several conversions from JSON values - to other types. There a few things to note: (1) Floating-point numbers can - be converted to integers\, (2) A JSON array can be converted to a standard - `std::vector`\, (3) A JSON object can be converted to C++ - associative containers such as `std::unordered_map`.,get__ValueType_const} - - @since version 2.1.0 - */ - template < - typename ValueTypeCV, - typename ValueType = detail::uncvref_t, - detail::enable_if_t < - not std::is_same::value and - detail::has_from_json::value and - not detail::has_non_default_from_json::value, - int > = 0 > - ValueType get() const noexcept(noexcept( - JSONSerializer::from_json(std::declval(), std::declval()))) - { - // we cannot static_assert on ValueTypeCV being non-const, because - // there is support for get(), which is why we - // still need the uncvref - static_assert(not std::is_reference::value, - "get() cannot be used with reference types, you might want to use get_ref()"); - static_assert(std::is_default_constructible::value, - "types must be DefaultConstructible when used with get()"); - - ValueType ret; - JSONSerializer::from_json(*this, ret); - return ret; - } - - /*! - @brief get a value (explicit); special case - - Explicit type conversion between the JSON value and a compatible value - which is **not** [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible) - and **not** [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). - The value is converted by calling the @ref json_serializer - `from_json()` method. - - The function is equivalent to executing - @code {.cpp} - return JSONSerializer::from_json(*this); - @endcode - - This overloads is chosen if: - - @a ValueType is not @ref basic_json and - - @ref json_serializer has a `from_json()` method of the form - `ValueType from_json(const @ref basic_json&)` - - @note If @ref json_serializer has both overloads of - `from_json()`, this one is chosen. - - @tparam ValueTypeCV the provided value type - @tparam ValueType the returned value type - - @return copy of the JSON value, converted to @a ValueType - - @throw what @ref json_serializer `from_json()` method throws - - @since version 2.1.0 - */ - template < - typename ValueTypeCV, - typename ValueType = detail::uncvref_t, - detail::enable_if_t::value and - detail::has_non_default_from_json::value, int> = 0 > - ValueType get() const noexcept(noexcept( - JSONSerializer::from_json(std::declval()))) - { - static_assert(not std::is_reference::value, - "get() cannot be used with reference types, you might want to use get_ref()"); - return JSONSerializer::from_json(*this); - } - - /*! - @brief get a pointer value (explicit) - - Explicit pointer access to the internally stored JSON value. No copies are - made. - - @warning The pointer becomes invalid if the underlying JSON object - changes. - - @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref - object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, - @ref number_unsigned_t, or @ref number_float_t. - - @return pointer to the internally stored JSON value if the requested - pointer type @a PointerType fits to the JSON value; `nullptr` otherwise - - @complexity Constant. - - @liveexample{The example below shows how pointers to internal values of a - JSON value can be requested. Note that no type conversions are made and a - `nullptr` is returned if the value and the requested pointer type does not - match.,get__PointerType} - - @sa @ref get_ptr() for explicit pointer-member access - - @since version 1.0.0 - */ - template::value, int>::type = 0> - PointerType get() noexcept - { - // delegate the call to get_ptr - return get_ptr(); - } - - /*! - @brief get a pointer value (explicit) - @copydoc get() - */ - template::value, int>::type = 0> - constexpr const PointerType get() const noexcept - { - // delegate the call to get_ptr - return get_ptr(); - } - - /*! - @brief get a pointer value (implicit) - - Implicit pointer access to the internally stored JSON value. No copies are - made. - - @warning Writing data to the pointee of the result yields an undefined - state. - - @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref - object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, - @ref number_unsigned_t, or @ref number_float_t. Enforced by a static - assertion. - - @return pointer to the internally stored JSON value if the requested - pointer type @a PointerType fits to the JSON value; `nullptr` otherwise - - @complexity Constant. - - @liveexample{The example below shows how pointers to internal values of a - JSON value can be requested. Note that no type conversions are made and a - `nullptr` is returned if the value and the requested pointer type does not - match.,get_ptr} - - @since version 1.0.0 - */ - template::value, int>::type = 0> - PointerType get_ptr() noexcept - { - // get the type of the PointerType (remove pointer and const) - using pointee_t = typename std::remove_const::type>::type>::type; - // make sure the type matches the allowed types - static_assert( - std::is_same::value - or std::is_same::value - or std::is_same::value - or std::is_same::value - or std::is_same::value - or std::is_same::value - or std::is_same::value - , "incompatible pointer type"); - - // delegate the call to get_impl_ptr<>() - return get_impl_ptr(static_cast(nullptr)); - } - - /*! - @brief get a pointer value (implicit) - @copydoc get_ptr() - */ - template::value and - std::is_const::type>::value, int>::type = 0> - constexpr const PointerType get_ptr() const noexcept - { - // get the type of the PointerType (remove pointer and const) - using pointee_t = typename std::remove_const::type>::type>::type; - // make sure the type matches the allowed types - static_assert( - std::is_same::value - or std::is_same::value - or std::is_same::value - or std::is_same::value - or std::is_same::value - or std::is_same::value - or std::is_same::value - , "incompatible pointer type"); - - // delegate the call to get_impl_ptr<>() const - return get_impl_ptr(static_cast(nullptr)); - } - - /*! - @brief get a reference value (implicit) - - Implicit reference access to the internally stored JSON value. No copies - are made. - - @warning Writing data to the referee of the result yields an undefined - state. - - @tparam ReferenceType reference type; must be a reference to @ref array_t, - @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or - @ref number_float_t. Enforced by static assertion. - - @return reference to the internally stored JSON value if the requested - reference type @a ReferenceType fits to the JSON value; throws - std::domain_error otherwise - - @throw std::domain_error in case passed type @a ReferenceType is - incompatible with the stored JSON value - - @complexity Constant. - - @liveexample{The example shows several calls to `get_ref()`.,get_ref} - - @since version 1.1.0 - */ - template::value, int>::type = 0> - ReferenceType get_ref() - { - // delegate call to get_ref_impl - return get_ref_impl(*this); - } - - /*! - @brief get a reference value (implicit) - @copydoc get_ref() - */ - template::value and - std::is_const::type>::value, int>::type = 0> - ReferenceType get_ref() const - { - // delegate call to get_ref_impl - return get_ref_impl(*this); - } - - /*! - @brief get a value (implicit) - - Implicit type conversion between the JSON value and a compatible value. - The call is realized by calling @ref get() const. - - @tparam ValueType non-pointer type compatible to the JSON value, for - instance `int` for JSON integer numbers, `bool` for JSON booleans, or - `std::vector` types for JSON arrays. The character type of @ref string_t - as well as an initializer list of this type is excluded to avoid - ambiguities as these types implicitly convert to `std::string`. - - @return copy of the JSON value, converted to type @a ValueType - - @throw std::domain_error in case passed type @a ValueType is incompatible - to JSON, thrown by @ref get() const - - @complexity Linear in the size of the JSON value. - - @liveexample{The example below shows several conversions from JSON values - to other types. There a few things to note: (1) Floating-point numbers can - be converted to integers\, (2) A JSON array can be converted to a standard - `std::vector`\, (3) A JSON object can be converted to C++ - associative containers such as `std::unordered_map`.,operator__ValueType} - - @since version 1.0.0 - */ - template < typename ValueType, typename std::enable_if < - not std::is_pointer::value and - not std::is_same::value -#ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015 - and not std::is_same>::value -#endif - , int >::type = 0 > - operator ValueType() const - { - // delegate the call to get<>() const - return get(); - } - - /// @} - - - //////////////////// - // element access // - //////////////////// - - /// @name element access - /// Access to the JSON value. - /// @{ - - /*! - @brief access specified array element with bounds checking - - Returns a reference to the element at specified location @a idx, with - bounds checking. - - @param[in] idx index of the element to access - - @return reference to the element at index @a idx - - @throw std::domain_error if the JSON value is not an array; example: - `"cannot use at() with string"` - @throw std::out_of_range if the index @a idx is out of range of the array; - that is, `idx >= size()`; example: `"array index 7 is out of range"` - - @complexity Constant. - - @liveexample{The example below shows how array elements can be read and - written using `at()`.,at__size_type} - - @since version 1.0.0 - */ - reference at(size_type idx) - { - // at only works for arrays - if (is_array()) - { - JSON_TRY - { - return m_value.array->at(idx); - } - JSON_CATCH (std::out_of_range&) - { - // create better exception explanation - JSON_THROW(std::out_of_range("array index " + std::to_string(idx) + " is out of range")); - } - } - else - { - JSON_THROW(std::domain_error("cannot use at() with " + type_name())); - } - } - - /*! - @brief access specified array element with bounds checking - - Returns a const reference to the element at specified location @a idx, - with bounds checking. - - @param[in] idx index of the element to access - - @return const reference to the element at index @a idx - - @throw std::domain_error if the JSON value is not an array; example: - `"cannot use at() with string"` - @throw std::out_of_range if the index @a idx is out of range of the array; - that is, `idx >= size()`; example: `"array index 7 is out of range"` - - @complexity Constant. - - @liveexample{The example below shows how array elements can be read using - `at()`.,at__size_type_const} - - @since version 1.0.0 - */ - const_reference at(size_type idx) const - { - // at only works for arrays - if (is_array()) - { - JSON_TRY - { - return m_value.array->at(idx); - } - JSON_CATCH (std::out_of_range&) - { - // create better exception explanation - JSON_THROW(std::out_of_range("array index " + std::to_string(idx) + " is out of range")); - } - } - else - { - JSON_THROW(std::domain_error("cannot use at() with " + type_name())); - } - } - - /*! - @brief access specified object element with bounds checking - - Returns a reference to the element at with specified key @a key, with - bounds checking. - - @param[in] key key of the element to access - - @return reference to the element at key @a key - - @throw std::domain_error if the JSON value is not an object; example: - `"cannot use at() with boolean"` - @throw std::out_of_range if the key @a key is is not stored in the object; - that is, `find(key) == end()`; example: `"key "the fast" not found"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read and - written using `at()`.,at__object_t_key_type} - - @sa @ref operator[](const typename object_t::key_type&) for unchecked - access by reference - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - */ - reference at(const typename object_t::key_type& key) - { - // at only works for objects - if (is_object()) - { - JSON_TRY - { - return m_value.object->at(key); - } - JSON_CATCH (std::out_of_range&) - { - // create better exception explanation - JSON_THROW(std::out_of_range("key '" + key + "' not found")); - } - } - else - { - JSON_THROW(std::domain_error("cannot use at() with " + type_name())); - } - } - - /*! - @brief access specified object element with bounds checking - - Returns a const reference to the element at with specified key @a key, - with bounds checking. - - @param[in] key key of the element to access - - @return const reference to the element at key @a key - - @throw std::domain_error if the JSON value is not an object; example: - `"cannot use at() with boolean"` - @throw std::out_of_range if the key @a key is is not stored in the object; - that is, `find(key) == end()`; example: `"key "the fast" not found"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read using - `at()`.,at__object_t_key_type_const} - - @sa @ref operator[](const typename object_t::key_type&) for unchecked - access by reference - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - */ - const_reference at(const typename object_t::key_type& key) const - { - // at only works for objects - if (is_object()) - { - JSON_TRY - { - return m_value.object->at(key); - } - JSON_CATCH (std::out_of_range&) - { - // create better exception explanation - JSON_THROW(std::out_of_range("key '" + key + "' not found")); - } - } - else - { - JSON_THROW(std::domain_error("cannot use at() with " + type_name())); - } - } - - /*! - @brief access specified array element - - Returns a reference to the element at specified location @a idx. - - @note If @a idx is beyond the range of the array (i.e., `idx >= size()`), - then the array is silently filled up with `null` values to make `idx` a - valid reference to the last stored element. - - @param[in] idx index of the element to access - - @return reference to the element at index @a idx - - @throw std::domain_error if JSON is not an array or null; example: - `"cannot use operator[] with string"` - - @complexity Constant if @a idx is in the range of the array. Otherwise - linear in `idx - size()`. - - @liveexample{The example below shows how array elements can be read and - written using `[]` operator. Note the addition of `null` - values.,operatorarray__size_type} - - @since version 1.0.0 - */ - reference operator[](size_type idx) - { - // implicitly convert null value to an empty array - if (is_null()) - { - m_type = value_t::array; - m_value.array = create(); - assert_invariant(); - } - - // operator[] only works for arrays - if (is_array()) - { - // fill up array with null values if given idx is outside range - if (idx >= m_value.array->size()) - { - m_value.array->insert(m_value.array->end(), - idx - m_value.array->size() + 1, - basic_json()); - } - - return m_value.array->operator[](idx); - } - - JSON_THROW(std::domain_error("cannot use operator[] with " + type_name())); - } - - /*! - @brief access specified array element - - Returns a const reference to the element at specified location @a idx. - - @param[in] idx index of the element to access - - @return const reference to the element at index @a idx - - @throw std::domain_error if JSON is not an array; example: `"cannot use - operator[] with null"` - - @complexity Constant. - - @liveexample{The example below shows how array elements can be read using - the `[]` operator.,operatorarray__size_type_const} - - @since version 1.0.0 - */ - const_reference operator[](size_type idx) const - { - // const operator[] only works for arrays - if (is_array()) - { - return m_value.array->operator[](idx); - } - - JSON_THROW(std::domain_error("cannot use operator[] with " + type_name())); - } - - /*! - @brief access specified object element - - Returns a reference to the element at with specified key @a key. - - @note If @a key is not found in the object, then it is silently added to - the object and filled with a `null` value to make `key` a valid reference. - In case the value was `null` before, it is converted to an object. - - @param[in] key key of the element to access - - @return reference to the element at key @a key - - @throw std::domain_error if JSON is not an object or null; example: - `"cannot use operator[] with string"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read and - written using the `[]` operator.,operatorarray__key_type} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - */ - reference operator[](const typename object_t::key_type& key) - { - // implicitly convert null value to an empty object - if (is_null()) - { - m_type = value_t::object; - m_value.object = create(); - assert_invariant(); - } - - // operator[] only works for objects - if (is_object()) - { - return m_value.object->operator[](key); - } - - JSON_THROW(std::domain_error("cannot use operator[] with " + type_name())); - } - - /*! - @brief read-only access specified object element - - Returns a const reference to the element at with specified key @a key. No - bounds checking is performed. - - @warning If the element with key @a key does not exist, the behavior is - undefined. - - @param[in] key key of the element to access - - @return const reference to the element at key @a key - - @pre The element with key @a key must exist. **This precondition is - enforced with an assertion.** - - @throw std::domain_error if JSON is not an object; example: `"cannot use - operator[] with null"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read using - the `[]` operator.,operatorarray__key_type_const} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - */ - const_reference operator[](const typename object_t::key_type& key) const - { - // const operator[] only works for objects - if (is_object()) - { - assert(m_value.object->find(key) != m_value.object->end()); - return m_value.object->find(key)->second; - } - - JSON_THROW(std::domain_error("cannot use operator[] with " + type_name())); - } - - /*! - @brief access specified object element - - Returns a reference to the element at with specified key @a key. - - @note If @a key is not found in the object, then it is silently added to - the object and filled with a `null` value to make `key` a valid reference. - In case the value was `null` before, it is converted to an object. - - @param[in] key key of the element to access - - @return reference to the element at key @a key - - @throw std::domain_error if JSON is not an object or null; example: - `"cannot use operator[] with string"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read and - written using the `[]` operator.,operatorarray__key_type} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - */ - template - reference operator[](T * (&key)[n]) - { - return operator[](static_cast(key)); - } - - /*! - @brief read-only access specified object element - - Returns a const reference to the element at with specified key @a key. No - bounds checking is performed. - - @warning If the element with key @a key does not exist, the behavior is - undefined. - - @note This function is required for compatibility reasons with Clang. - - @param[in] key key of the element to access - - @return const reference to the element at key @a key - - @throw std::domain_error if JSON is not an object; example: `"cannot use - operator[] with null"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read using - the `[]` operator.,operatorarray__key_type_const} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - */ - template - const_reference operator[](T * (&key)[n]) const - { - return operator[](static_cast(key)); - } - - /*! - @brief access specified object element - - Returns a reference to the element at with specified key @a key. - - @note If @a key is not found in the object, then it is silently added to - the object and filled with a `null` value to make `key` a valid reference. - In case the value was `null` before, it is converted to an object. - - @param[in] key key of the element to access - - @return reference to the element at key @a key - - @throw std::domain_error if JSON is not an object or null; example: - `"cannot use operator[] with string"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read and - written using the `[]` operator.,operatorarray__key_type} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.1.0 - */ - template - reference operator[](T* key) - { - // implicitly convert null to object - if (is_null()) - { - m_type = value_t::object; - m_value = value_t::object; - assert_invariant(); - } - - // at only works for objects - if (is_object()) - { - return m_value.object->operator[](key); - } - - JSON_THROW(std::domain_error("cannot use operator[] with " + type_name())); - } - - /*! - @brief read-only access specified object element - - Returns a const reference to the element at with specified key @a key. No - bounds checking is performed. - - @warning If the element with key @a key does not exist, the behavior is - undefined. - - @param[in] key key of the element to access - - @return const reference to the element at key @a key - - @pre The element with key @a key must exist. **This precondition is - enforced with an assertion.** - - @throw std::domain_error if JSON is not an object; example: `"cannot use - operator[] with null"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read using - the `[]` operator.,operatorarray__key_type_const} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.1.0 - */ - template - const_reference operator[](T* key) const - { - // at only works for objects - if (is_object()) - { - assert(m_value.object->find(key) != m_value.object->end()); - return m_value.object->find(key)->second; - } - - JSON_THROW(std::domain_error("cannot use operator[] with " + type_name())); - } - - /*! - @brief access specified object element with default value - - Returns either a copy of an object's element at the specified key @a key - or a given default value if no element with key @a key exists. - - The function is basically equivalent to executing - @code {.cpp} - try { - return at(key); - } catch(std::out_of_range) { - return default_value; - } - @endcode - - @note Unlike @ref at(const typename object_t::key_type&), this function - does not throw if the given key @a key was not found. - - @note Unlike @ref operator[](const typename object_t::key_type& key), this - function does not implicitly add an element to the position defined by @a - key. This function is furthermore also applicable to const objects. - - @param[in] key key of the element to access - @param[in] default_value the value to return if @a key is not found - - @tparam ValueType type compatible to JSON values, for instance `int` for - JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for - JSON arrays. Note the type of the expected value at @a key and the default - value @a default_value must be compatible. - - @return copy of the element at key @a key or @a default_value if @a key - is not found - - @throw std::domain_error if JSON is not an object; example: `"cannot use - value() with null"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be queried - with a default value.,basic_json__value} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref operator[](const typename object_t::key_type&) for unchecked - access by reference - - @since version 1.0.0 - */ - template::value, int>::type = 0> - ValueType value(const typename object_t::key_type& key, ValueType default_value) const - { - // at only works for objects - if (is_object()) - { - // if key is found, return value and given default value otherwise - const auto it = find(key); - if (it != end()) - { - return *it; - } - - return default_value; - } - else - { - JSON_THROW(std::domain_error("cannot use value() with " + type_name())); - } - } - - /*! - @brief overload for a default value of type const char* - @copydoc basic_json::value(const typename object_t::key_type&, ValueType) const - */ - string_t value(const typename object_t::key_type& key, const char* default_value) const - { - return value(key, string_t(default_value)); - } - - /*! - @brief access specified object element via JSON Pointer with default value - - Returns either a copy of an object's element at the specified key @a key - or a given default value if no element with key @a key exists. - - The function is basically equivalent to executing - @code {.cpp} - try { - return at(ptr); - } catch(std::out_of_range) { - return default_value; - } - @endcode - - @note Unlike @ref at(const json_pointer&), this function does not throw - if the given key @a key was not found. - - @param[in] ptr a JSON pointer to the element to access - @param[in] default_value the value to return if @a ptr found no value - - @tparam ValueType type compatible to JSON values, for instance `int` for - JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for - JSON arrays. Note the type of the expected value at @a key and the default - value @a default_value must be compatible. - - @return copy of the element at key @a key or @a default_value if @a key - is not found - - @throw std::domain_error if JSON is not an object; example: `"cannot use - value() with null"` - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be queried - with a default value.,basic_json__value_ptr} - - @sa @ref operator[](const json_pointer&) for unchecked access by reference - - @since version 2.0.2 - */ - template::value, int>::type = 0> - ValueType value(const json_pointer& ptr, ValueType default_value) const - { - // at only works for objects - if (is_object()) - { - // if pointer resolves a value, return it or use default value - JSON_TRY - { - return ptr.get_checked(this); - } - JSON_CATCH (std::out_of_range&) - { - return default_value; - } - } - - JSON_THROW(std::domain_error("cannot use value() with " + type_name())); - } - - /*! - @brief overload for a default value of type const char* - @copydoc basic_json::value(const json_pointer&, ValueType) const - */ - string_t value(const json_pointer& ptr, const char* default_value) const - { - return value(ptr, string_t(default_value)); - } - - /*! - @brief access the first element - - Returns a reference to the first element in the container. For a JSON - container `c`, the expression `c.front()` is equivalent to `*c.begin()`. - - @return In case of a structured type (array or object), a reference to the - first element is returned. In case of number, string, or boolean values, a - reference to the value is returned. - - @complexity Constant. - - @pre The JSON value must not be `null` (would throw `std::out_of_range`) - or an empty array or object (undefined behavior, **guarded by - assertions**). - @post The JSON value remains unchanged. - - @throw std::out_of_range when called on `null` value - - @liveexample{The following code shows an example for `front()`.,front} - - @sa @ref back() -- access the last element - - @since version 1.0.0 - */ - reference front() - { - return *begin(); - } - - /*! - @copydoc basic_json::front() - */ - const_reference front() const - { - return *cbegin(); - } - - /*! - @brief access the last element - - Returns a reference to the last element in the container. For a JSON - container `c`, the expression `c.back()` is equivalent to - @code {.cpp} - auto tmp = c.end(); - --tmp; - return *tmp; - @endcode - - @return In case of a structured type (array or object), a reference to the - last element is returned. In case of number, string, or boolean values, a - reference to the value is returned. - - @complexity Constant. - - @pre The JSON value must not be `null` (would throw `std::out_of_range`) - or an empty array or object (undefined behavior, **guarded by - assertions**). - @post The JSON value remains unchanged. - - @throw std::out_of_range when called on `null` value. - - @liveexample{The following code shows an example for `back()`.,back} - - @sa @ref front() -- access the first element - - @since version 1.0.0 - */ - reference back() - { - auto tmp = end(); - --tmp; - return *tmp; - } - - /*! - @copydoc basic_json::back() - */ - const_reference back() const - { - auto tmp = cend(); - --tmp; - return *tmp; - } - - /*! - @brief remove element given an iterator - - Removes the element specified by iterator @a pos. The iterator @a pos must - be valid and dereferenceable. Thus the `end()` iterator (which is valid, - but is not dereferenceable) cannot be used as a value for @a pos. - - If called on a primitive type other than `null`, the resulting JSON value - will be `null`. - - @param[in] pos iterator to the element to remove - @return Iterator following the last removed element. If the iterator @a - pos refers to the last element, the `end()` iterator is returned. - - @tparam IteratorType an @ref iterator or @ref const_iterator - - @post Invalidates iterators and references at or after the point of the - erase, including the `end()` iterator. - - @throw std::domain_error if called on a `null` value; example: `"cannot - use erase() with null"` - @throw std::domain_error if called on an iterator which does not belong to - the current JSON value; example: `"iterator does not fit current value"` - @throw std::out_of_range if called on a primitive type with invalid - iterator (i.e., any iterator which is not `begin()`); example: `"iterator - out of range"` - - @complexity The complexity depends on the type: - - objects: amortized constant - - arrays: linear in distance between @a pos and the end of the container - - strings: linear in the length of the string - - other types: constant - - @liveexample{The example shows the result of `erase()` for different JSON - types.,erase__IteratorType} - - @sa @ref erase(IteratorType, IteratorType) -- removes the elements in - the given range - @sa @ref erase(const typename object_t::key_type&) -- removes the element - from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at - the given index - - @since version 1.0.0 - */ - template::value or - std::is_same::value, int>::type - = 0> - IteratorType erase(IteratorType pos) - { - // make sure iterator fits the current value - if (this != pos.m_object) - { - JSON_THROW(std::domain_error("iterator does not fit current value")); - } - - IteratorType result = end(); - - switch (m_type) - { - case value_t::boolean: - case value_t::number_float: - case value_t::number_integer: - case value_t::number_unsigned: - case value_t::string: - { - if (not pos.m_it.primitive_iterator.is_begin()) - { - JSON_THROW(std::out_of_range("iterator out of range")); - } - - if (is_string()) - { - AllocatorType alloc; - alloc.destroy(m_value.string); - alloc.deallocate(m_value.string, 1); - m_value.string = nullptr; - } - - m_type = value_t::null; - assert_invariant(); - break; - } - - case value_t::object: - { - result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); - break; - } - - case value_t::array: - { - result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); - break; - } - - default: - { - JSON_THROW(std::domain_error("cannot use erase() with " + type_name())); - } - } - - return result; - } - - /*! - @brief remove elements given an iterator range - - Removes the element specified by the range `[first; last)`. The iterator - @a first does not need to be dereferenceable if `first == last`: erasing - an empty range is a no-op. - - If called on a primitive type other than `null`, the resulting JSON value - will be `null`. - - @param[in] first iterator to the beginning of the range to remove - @param[in] last iterator past the end of the range to remove - @return Iterator following the last removed element. If the iterator @a - second refers to the last element, the `end()` iterator is returned. - - @tparam IteratorType an @ref iterator or @ref const_iterator - - @post Invalidates iterators and references at or after the point of the - erase, including the `end()` iterator. - - @throw std::domain_error if called on a `null` value; example: `"cannot - use erase() with null"` - @throw std::domain_error if called on iterators which does not belong to - the current JSON value; example: `"iterators do not fit current value"` - @throw std::out_of_range if called on a primitive type with invalid - iterators (i.e., if `first != begin()` and `last != end()`); example: - `"iterators out of range"` - - @complexity The complexity depends on the type: - - objects: `log(size()) + std::distance(first, last)` - - arrays: linear in the distance between @a first and @a last, plus linear - in the distance between @a last and end of the container - - strings: linear in the length of the string - - other types: constant - - @liveexample{The example shows the result of `erase()` for different JSON - types.,erase__IteratorType_IteratorType} - - @sa @ref erase(IteratorType) -- removes the element at a given position - @sa @ref erase(const typename object_t::key_type&) -- removes the element - from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at - the given index - - @since version 1.0.0 - */ - template::value or - std::is_same::value, int>::type - = 0> - IteratorType erase(IteratorType first, IteratorType last) - { - // make sure iterator fits the current value - if (this != first.m_object or this != last.m_object) - { - JSON_THROW(std::domain_error("iterators do not fit current value")); - } - - IteratorType result = end(); - - switch (m_type) - { - case value_t::boolean: - case value_t::number_float: - case value_t::number_integer: - case value_t::number_unsigned: - case value_t::string: - { - if (not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end()) - { - JSON_THROW(std::out_of_range("iterators out of range")); - } - - if (is_string()) - { - AllocatorType alloc; - alloc.destroy(m_value.string); - alloc.deallocate(m_value.string, 1); - m_value.string = nullptr; - } - - m_type = value_t::null; - assert_invariant(); - break; - } - - case value_t::object: - { - result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, - last.m_it.object_iterator); - break; - } - - case value_t::array: - { - result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, - last.m_it.array_iterator); - break; - } - - default: - { - JSON_THROW(std::domain_error("cannot use erase() with " + type_name())); - } - } - - return result; - } - - /*! - @brief remove element from a JSON object given a key - - Removes elements from a JSON object with the key value @a key. - - @param[in] key value of the elements to remove - - @return Number of elements removed. If @a ObjectType is the default - `std::map` type, the return value will always be `0` (@a key was not - found) or `1` (@a key was found). - - @post References and iterators to the erased elements are invalidated. - Other references and iterators are not affected. - - @throw std::domain_error when called on a type other than JSON object; - example: `"cannot use erase() with null"` - - @complexity `log(size()) + count(key)` - - @liveexample{The example shows the effect of `erase()`.,erase__key_type} - - @sa @ref erase(IteratorType) -- removes the element at a given position - @sa @ref erase(IteratorType, IteratorType) -- removes the elements in - the given range - @sa @ref erase(const size_type) -- removes the element from an array at - the given index - - @since version 1.0.0 - */ - size_type erase(const typename object_t::key_type& key) - { - // this erase only works for objects - if (is_object()) - { - return m_value.object->erase(key); - } - - JSON_THROW(std::domain_error("cannot use erase() with " + type_name())); - } - - /*! - @brief remove element from a JSON array given an index - - Removes element from a JSON array at the index @a idx. - - @param[in] idx index of the element to remove - - @throw std::domain_error when called on a type other than JSON array; - example: `"cannot use erase() with null"` - @throw std::out_of_range when `idx >= size()`; example: `"array index 17 - is out of range"` - - @complexity Linear in distance between @a idx and the end of the container. - - @liveexample{The example shows the effect of `erase()`.,erase__size_type} - - @sa @ref erase(IteratorType) -- removes the element at a given position - @sa @ref erase(IteratorType, IteratorType) -- removes the elements in - the given range - @sa @ref erase(const typename object_t::key_type&) -- removes the element - from an object at the given key - - @since version 1.0.0 - */ - void erase(const size_type idx) - { - // this erase only works for arrays - if (is_array()) - { - if (idx >= size()) - { - JSON_THROW(std::out_of_range("array index " + std::to_string(idx) + " is out of range")); - } - - m_value.array->erase(m_value.array->begin() + static_cast(idx)); - } - else - { - JSON_THROW(std::domain_error("cannot use erase() with " + type_name())); - } - } - - /// @} - - - //////////// - // lookup // - //////////// - - /// @name lookup - /// @{ - - /*! - @brief find an element in a JSON object - - Finds an element in a JSON object with key equivalent to @a key. If the - element is not found or the JSON value is not an object, end() is - returned. - - @note This method always returns @ref end() when executed on a JSON type - that is not an object. - - @param[in] key key value of the element to search for - - @return Iterator to an element with key equivalent to @a key. If no such - element is found or the JSON value is not an object, past-the-end (see - @ref end()) iterator is returned. - - @complexity Logarithmic in the size of the JSON object. - - @liveexample{The example shows how `find()` is used.,find__key_type} - - @since version 1.0.0 - */ - iterator find(typename object_t::key_type key) - { - auto result = end(); - - if (is_object()) - { - result.m_it.object_iterator = m_value.object->find(key); - } - - return result; - } - - /*! - @brief find an element in a JSON object - @copydoc find(typename object_t::key_type) - */ - const_iterator find(typename object_t::key_type key) const - { - auto result = cend(); - - if (is_object()) - { - result.m_it.object_iterator = m_value.object->find(key); - } - - return result; - } - - /*! - @brief returns the number of occurrences of a key in a JSON object - - Returns the number of elements with key @a key. If ObjectType is the - default `std::map` type, the return value will always be `0` (@a key was - not found) or `1` (@a key was found). - - @note This method always returns `0` when executed on a JSON type that is - not an object. - - @param[in] key key value of the element to count - - @return Number of elements with key @a key. If the JSON value is not an - object, the return value will be `0`. - - @complexity Logarithmic in the size of the JSON object. - - @liveexample{The example shows how `count()` is used.,count} - - @since version 1.0.0 - */ - size_type count(typename object_t::key_type key) const - { - // return 0 for all nonobject types - return is_object() ? m_value.object->count(key) : 0; - } - - /// @} - - - /////////////// - // iterators // - /////////////// - - /// @name iterators - /// @{ - - /*! - @brief returns an iterator to the first element - - Returns an iterator to the first element. - - @image html range-begin-end.svg "Illustration from cppreference.com" - - @return iterator to the first element - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is constant. - - @liveexample{The following code shows an example for `begin()`.,begin} - - @sa @ref cbegin() -- returns a const iterator to the beginning - @sa @ref end() -- returns an iterator to the end - @sa @ref cend() -- returns a const iterator to the end - - @since version 1.0.0 - */ - iterator begin() noexcept - { - iterator result(this); - result.set_begin(); - return result; - } - - /*! - @copydoc basic_json::cbegin() - */ - const_iterator begin() const noexcept - { - return cbegin(); - } - - /*! - @brief returns a const iterator to the first element - - Returns a const iterator to the first element. - - @image html range-begin-end.svg "Illustration from cppreference.com" - - @return const iterator to the first element - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is constant. - - Has the semantics of `const_cast(*this).begin()`. - - @liveexample{The following code shows an example for `cbegin()`.,cbegin} - - @sa @ref begin() -- returns an iterator to the beginning - @sa @ref end() -- returns an iterator to the end - @sa @ref cend() -- returns a const iterator to the end - - @since version 1.0.0 - */ - const_iterator cbegin() const noexcept - { - const_iterator result(this); - result.set_begin(); - return result; - } - - /*! - @brief returns an iterator to one past the last element - - Returns an iterator to one past the last element. - - @image html range-begin-end.svg "Illustration from cppreference.com" - - @return iterator one past the last element - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is constant. - - @liveexample{The following code shows an example for `end()`.,end} - - @sa @ref cend() -- returns a const iterator to the end - @sa @ref begin() -- returns an iterator to the beginning - @sa @ref cbegin() -- returns a const iterator to the beginning - - @since version 1.0.0 - */ - iterator end() noexcept - { - iterator result(this); - result.set_end(); - return result; - } - - /*! - @copydoc basic_json::cend() - */ - const_iterator end() const noexcept - { - return cend(); - } - - /*! - @brief returns a const iterator to one past the last element - - Returns a const iterator to one past the last element. - - @image html range-begin-end.svg "Illustration from cppreference.com" - - @return const iterator one past the last element - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is constant. - - Has the semantics of `const_cast(*this).end()`. - - @liveexample{The following code shows an example for `cend()`.,cend} - - @sa @ref end() -- returns an iterator to the end - @sa @ref begin() -- returns an iterator to the beginning - @sa @ref cbegin() -- returns a const iterator to the beginning - - @since version 1.0.0 - */ - const_iterator cend() const noexcept - { - const_iterator result(this); - result.set_end(); - return result; - } - - /*! - @brief returns an iterator to the reverse-beginning - - Returns an iterator to the reverse-beginning; that is, the last element. - - @image html range-rbegin-rend.svg "Illustration from cppreference.com" - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) - requirements: - - The complexity is constant. - - Has the semantics of `reverse_iterator(end())`. - - @liveexample{The following code shows an example for `rbegin()`.,rbegin} - - @sa @ref crbegin() -- returns a const reverse iterator to the beginning - @sa @ref rend() -- returns a reverse iterator to the end - @sa @ref crend() -- returns a const reverse iterator to the end - - @since version 1.0.0 - */ - reverse_iterator rbegin() noexcept - { - return reverse_iterator(end()); - } - - /*! - @copydoc basic_json::crbegin() - */ - const_reverse_iterator rbegin() const noexcept - { - return crbegin(); - } - - /*! - @brief returns an iterator to the reverse-end - - Returns an iterator to the reverse-end; that is, one before the first - element. - - @image html range-rbegin-rend.svg "Illustration from cppreference.com" - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) - requirements: - - The complexity is constant. - - Has the semantics of `reverse_iterator(begin())`. - - @liveexample{The following code shows an example for `rend()`.,rend} - - @sa @ref crend() -- returns a const reverse iterator to the end - @sa @ref rbegin() -- returns a reverse iterator to the beginning - @sa @ref crbegin() -- returns a const reverse iterator to the beginning - - @since version 1.0.0 - */ - reverse_iterator rend() noexcept - { - return reverse_iterator(begin()); - } - - /*! - @copydoc basic_json::crend() - */ - const_reverse_iterator rend() const noexcept - { - return crend(); - } - - /*! - @brief returns a const reverse iterator to the last element - - Returns a const iterator to the reverse-beginning; that is, the last - element. - - @image html range-rbegin-rend.svg "Illustration from cppreference.com" - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) - requirements: - - The complexity is constant. - - Has the semantics of `const_cast(*this).rbegin()`. - - @liveexample{The following code shows an example for `crbegin()`.,crbegin} - - @sa @ref rbegin() -- returns a reverse iterator to the beginning - @sa @ref rend() -- returns a reverse iterator to the end - @sa @ref crend() -- returns a const reverse iterator to the end - - @since version 1.0.0 - */ - const_reverse_iterator crbegin() const noexcept - { - return const_reverse_iterator(cend()); - } - - /*! - @brief returns a const reverse iterator to one before the first - - Returns a const reverse iterator to the reverse-end; that is, one before - the first element. - - @image html range-rbegin-rend.svg "Illustration from cppreference.com" - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) - requirements: - - The complexity is constant. - - Has the semantics of `const_cast(*this).rend()`. - - @liveexample{The following code shows an example for `crend()`.,crend} - - @sa @ref rend() -- returns a reverse iterator to the end - @sa @ref rbegin() -- returns a reverse iterator to the beginning - @sa @ref crbegin() -- returns a const reverse iterator to the beginning - - @since version 1.0.0 - */ - const_reverse_iterator crend() const noexcept - { - return const_reverse_iterator(cbegin()); - } - - private: - // forward declaration - template class iteration_proxy; - - public: - /*! - @brief wrapper to access iterator member functions in range-based for - - This function allows to access @ref iterator::key() and @ref - iterator::value() during range-based for loops. In these loops, a - reference to the JSON values is returned, so there is no access to the - underlying iterator. - - @note The name of this function is not yet final and may change in the - future. - */ - static iteration_proxy iterator_wrapper(reference cont) - { - return iteration_proxy(cont); - } - - /*! - @copydoc iterator_wrapper(reference) - */ - static iteration_proxy iterator_wrapper(const_reference cont) - { - return iteration_proxy(cont); - } - - /// @} - - - ////////////// - // capacity // - ////////////// - - /// @name capacity - /// @{ - - /*! - @brief checks whether the container is empty - - Checks if a JSON value has no elements. - - @return The return value depends on the different types and is - defined as follows: - Value type | return value - ----------- | ------------- - null | `true` - boolean | `false` - string | `false` - number | `false` - object | result of function `object_t::empty()` - array | result of function `array_t::empty()` - - @note This function does not return whether a string stored as JSON value - is empty - it returns whether the JSON container itself is empty which is - false in the case of a string. - - @complexity Constant, as long as @ref array_t and @ref object_t satisfy - the Container concept; that is, their `empty()` functions have constant - complexity. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is constant. - - Has the semantics of `begin() == end()`. - - @liveexample{The following code uses `empty()` to check if a JSON - object contains any elements.,empty} - - @sa @ref size() -- returns the number of elements - - @since version 1.0.0 - */ - bool empty() const noexcept - { - switch (m_type) - { - case value_t::null: - { - // null values are empty - return true; - } - - case value_t::array: - { - // delegate call to array_t::empty() - return m_value.array->empty(); - } - - case value_t::object: - { - // delegate call to object_t::empty() - return m_value.object->empty(); - } - - default: - { - // all other types are nonempty - return false; - } - } - } - - /*! - @brief returns the number of elements - - Returns the number of elements in a JSON value. - - @return The return value depends on the different types and is - defined as follows: - Value type | return value - ----------- | ------------- - null | `0` - boolean | `1` - string | `1` - number | `1` - object | result of function object_t::size() - array | result of function array_t::size() - - @note This function does not return the length of a string stored as JSON - value - it returns the number of elements in the JSON value which is 1 in - the case of a string. - - @complexity Constant, as long as @ref array_t and @ref object_t satisfy - the Container concept; that is, their size() functions have constant - complexity. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is constant. - - Has the semantics of `std::distance(begin(), end())`. - - @liveexample{The following code calls `size()` on the different value - types.,size} - - @sa @ref empty() -- checks whether the container is empty - @sa @ref max_size() -- returns the maximal number of elements - - @since version 1.0.0 - */ - size_type size() const noexcept - { - switch (m_type) - { - case value_t::null: - { - // null values are empty - return 0; - } - - case value_t::array: - { - // delegate call to array_t::size() - return m_value.array->size(); - } - - case value_t::object: - { - // delegate call to object_t::size() - return m_value.object->size(); - } - - default: - { - // all other types have size 1 - return 1; - } - } - } - - /*! - @brief returns the maximum possible number of elements - - Returns the maximum number of elements a JSON value is able to hold due to - system or library implementation limitations, i.e. `std::distance(begin(), - end())` for the JSON value. - - @return The return value depends on the different types and is - defined as follows: - Value type | return value - ----------- | ------------- - null | `0` (same as `size()`) - boolean | `1` (same as `size()`) - string | `1` (same as `size()`) - number | `1` (same as `size()`) - object | result of function `object_t::max_size()` - array | result of function `array_t::max_size()` - - @complexity Constant, as long as @ref array_t and @ref object_t satisfy - the Container concept; that is, their `max_size()` functions have constant - complexity. - - @requirement This function helps `basic_json` satisfying the - [Container](http://en.cppreference.com/w/cpp/concept/Container) - requirements: - - The complexity is constant. - - Has the semantics of returning `b.size()` where `b` is the largest - possible JSON value. - - @liveexample{The following code calls `max_size()` on the different value - types. Note the output is implementation specific.,max_size} - - @sa @ref size() -- returns the number of elements - - @since version 1.0.0 - */ - size_type max_size() const noexcept - { - switch (m_type) - { - case value_t::array: - { - // delegate call to array_t::max_size() - return m_value.array->max_size(); - } - - case value_t::object: - { - // delegate call to object_t::max_size() - return m_value.object->max_size(); - } - - default: - { - // all other types have max_size() == size() - return size(); - } - } - } - - /// @} - - - /////////////// - // modifiers // - /////////////// - - /// @name modifiers - /// @{ - - /*! - @brief clears the contents - - Clears the content of a JSON value and resets it to the default value as - if @ref basic_json(value_t) would have been called: - - Value type | initial value - ----------- | ------------- - null | `null` - boolean | `false` - string | `""` - number | `0` - object | `{}` - array | `[]` - - @complexity Linear in the size of the JSON value. - - @liveexample{The example below shows the effect of `clear()` to different - JSON types.,clear} - - @since version 1.0.0 - */ - void clear() noexcept - { - switch (m_type) - { - case value_t::number_integer: - { - m_value.number_integer = 0; - break; - } - - case value_t::number_unsigned: - { - m_value.number_unsigned = 0; - break; - } - - case value_t::number_float: - { - m_value.number_float = 0.0; - break; - } - - case value_t::boolean: - { - m_value.boolean = false; - break; - } - - case value_t::string: - { - m_value.string->clear(); - break; - } - - case value_t::array: - { - m_value.array->clear(); - break; - } - - case value_t::object: - { - m_value.object->clear(); - break; - } - - default: - { - break; - } - } - } - - /*! - @brief add an object to an array - - Appends the given element @a val to the end of the JSON value. If the - function is called on a JSON null value, an empty array is created before - appending @a val. - - @param[in] val the value to add to the JSON array - - @throw std::domain_error when called on a type other than JSON array or - null; example: `"cannot use push_back() with number"` - - @complexity Amortized constant. - - @liveexample{The example shows how `push_back()` and `+=` can be used to - add elements to a JSON array. Note how the `null` value was silently - converted to a JSON array.,push_back} - - @since version 1.0.0 - */ - void push_back(basic_json&& val) - { - // push_back only works for null objects or arrays - if (not(is_null() or is_array())) - { - JSON_THROW(std::domain_error("cannot use push_back() with " + type_name())); - } - - // transform null object into an array - if (is_null()) - { - m_type = value_t::array; - m_value = value_t::array; - assert_invariant(); - } - - // add element to array (move semantics) - m_value.array->push_back(std::move(val)); - // invalidate object - val.m_type = value_t::null; - } - - /*! - @brief add an object to an array - @copydoc push_back(basic_json&&) - */ - reference operator+=(basic_json&& val) - { - push_back(std::move(val)); - return *this; - } - - /*! - @brief add an object to an array - @copydoc push_back(basic_json&&) - */ - void push_back(const basic_json& val) - { - // push_back only works for null objects or arrays - if (not(is_null() or is_array())) - { - JSON_THROW(std::domain_error("cannot use push_back() with " + type_name())); - } - - // transform null object into an array - if (is_null()) - { - m_type = value_t::array; - m_value = value_t::array; - assert_invariant(); - } - - // add element to array - m_value.array->push_back(val); - } - - /*! - @brief add an object to an array - @copydoc push_back(basic_json&&) - */ - reference operator+=(const basic_json& val) - { - push_back(val); - return *this; - } - - /*! - @brief add an object to an object - - Inserts the given element @a val to the JSON object. If the function is - called on a JSON null value, an empty object is created before inserting - @a val. - - @param[in] val the value to add to the JSON object - - @throw std::domain_error when called on a type other than JSON object or - null; example: `"cannot use push_back() with number"` - - @complexity Logarithmic in the size of the container, O(log(`size()`)). - - @liveexample{The example shows how `push_back()` and `+=` can be used to - add elements to a JSON object. Note how the `null` value was silently - converted to a JSON object.,push_back__object_t__value} - - @since version 1.0.0 - */ - void push_back(const typename object_t::value_type& val) - { - // push_back only works for null objects or objects - if (not(is_null() or is_object())) - { - JSON_THROW(std::domain_error("cannot use push_back() with " + type_name())); - } - - // transform null object into an object - if (is_null()) - { - m_type = value_t::object; - m_value = value_t::object; - assert_invariant(); - } - - // add element to array - m_value.object->insert(val); - } - - /*! - @brief add an object to an object - @copydoc push_back(const typename object_t::value_type&) - */ - reference operator+=(const typename object_t::value_type& val) - { - push_back(val); - return *this; - } - - /*! - @brief add an object to an object - - This function allows to use `push_back` with an initializer list. In case - - 1. the current value is an object, - 2. the initializer list @a init contains only two elements, and - 3. the first element of @a init is a string, - - @a init is converted into an object element and added using - @ref push_back(const typename object_t::value_type&). Otherwise, @a init - is converted to a JSON value and added using @ref push_back(basic_json&&). - - @param init an initializer list - - @complexity Linear in the size of the initializer list @a init. - - @note This function is required to resolve an ambiguous overload error, - because pairs like `{"key", "value"}` can be both interpreted as - `object_t::value_type` or `std::initializer_list`, see - https://github.com/nlohmann/json/issues/235 for more information. - - @liveexample{The example shows how initializer lists are treated as - objects when possible.,push_back__initializer_list} - */ - void push_back(std::initializer_list init) - { - if (is_object() and init.size() == 2 and init.begin()->is_string()) - { - const string_t key = *init.begin(); - push_back(typename object_t::value_type(key, *(init.begin() + 1))); - } - else - { - push_back(basic_json(init)); - } - } - - /*! - @brief add an object to an object - @copydoc push_back(std::initializer_list) - */ - reference operator+=(std::initializer_list init) - { - push_back(init); - return *this; - } - - /*! - @brief add an object to an array - - Creates a JSON value from the passed parameters @a args to the end of the - JSON value. If the function is called on a JSON null value, an empty array - is created before appending the value created from @a args. - - @param[in] args arguments to forward to a constructor of @ref basic_json - @tparam Args compatible types to create a @ref basic_json object - - @throw std::domain_error when called on a type other than JSON array or - null; example: `"cannot use emplace_back() with number"` - - @complexity Amortized constant. - - @liveexample{The example shows how `push_back()` can be used to add - elements to a JSON array. Note how the `null` value was silently converted - to a JSON array.,emplace_back} - - @since version 2.0.8 - */ - template - void emplace_back(Args&& ... args) - { - // emplace_back only works for null objects or arrays - if (not(is_null() or is_array())) - { - JSON_THROW(std::domain_error("cannot use emplace_back() with " + type_name())); - } - - // transform null object into an array - if (is_null()) - { - m_type = value_t::array; - m_value = value_t::array; - assert_invariant(); - } - - // add element to array (perfect forwarding) - m_value.array->emplace_back(std::forward(args)...); - } - - /*! - @brief add an object to an object if key does not exist - - Inserts a new element into a JSON object constructed in-place with the - given @a args if there is no element with the key in the container. If the - function is called on a JSON null value, an empty object is created before - appending the value created from @a args. - - @param[in] args arguments to forward to a constructor of @ref basic_json - @tparam Args compatible types to create a @ref basic_json object - - @return a pair consisting of an iterator to the inserted element, or the - already-existing element if no insertion happened, and a bool - denoting whether the insertion took place. - - @throw std::domain_error when called on a type other than JSON object or - null; example: `"cannot use emplace() with number"` - - @complexity Logarithmic in the size of the container, O(log(`size()`)). - - @liveexample{The example shows how `emplace()` can be used to add elements - to a JSON object. Note how the `null` value was silently converted to a - JSON object. Further note how no value is added if there was already one - value stored with the same key.,emplace} - - @since version 2.0.8 - */ - template - std::pair emplace(Args&& ... args) - { - // emplace only works for null objects or arrays - if (not(is_null() or is_object())) - { - JSON_THROW(std::domain_error("cannot use emplace() with " + type_name())); - } - - // transform null object into an object - if (is_null()) - { - m_type = value_t::object; - m_value = value_t::object; - assert_invariant(); - } - - // add element to array (perfect forwarding) - auto res = m_value.object->emplace(std::forward(args)...); - // create result iterator and set iterator to the result of emplace - auto it = begin(); - it.m_it.object_iterator = res.first; - - // return pair of iterator and boolean - return {it, res.second}; - } - - /*! - @brief inserts element - - Inserts element @a val before iterator @a pos. - - @param[in] pos iterator before which the content will be inserted; may be - the end() iterator - @param[in] val element to insert - @return iterator pointing to the inserted @a val. - - @throw std::domain_error if called on JSON values other than arrays; - example: `"cannot use insert() with string"` - @throw std::domain_error if @a pos is not an iterator of *this; example: - `"iterator does not fit current value"` - - @complexity Constant plus linear in the distance between @a pos and end of - the container. - - @liveexample{The example shows how `insert()` is used.,insert} - - @since version 1.0.0 - */ - iterator insert(const_iterator pos, const basic_json& val) - { - // insert only works for arrays - if (is_array()) - { - // check if iterator pos fits to this JSON value - if (pos.m_object != this) - { - JSON_THROW(std::domain_error("iterator does not fit current value")); - } - - // insert to array and return iterator - iterator result(this); - result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, val); - return result; - } - - JSON_THROW(std::domain_error("cannot use insert() with " + type_name())); - } - - /*! - @brief inserts element - @copydoc insert(const_iterator, const basic_json&) - */ - iterator insert(const_iterator pos, basic_json&& val) - { - return insert(pos, val); - } - - /*! - @brief inserts elements - - Inserts @a cnt copies of @a val before iterator @a pos. - - @param[in] pos iterator before which the content will be inserted; may be - the end() iterator - @param[in] cnt number of copies of @a val to insert - @param[in] val element to insert - @return iterator pointing to the first element inserted, or @a pos if - `cnt==0` - - @throw std::domain_error if called on JSON values other than arrays; - example: `"cannot use insert() with string"` - @throw std::domain_error if @a pos is not an iterator of *this; example: - `"iterator does not fit current value"` - - @complexity Linear in @a cnt plus linear in the distance between @a pos - and end of the container. - - @liveexample{The example shows how `insert()` is used.,insert__count} - - @since version 1.0.0 - */ - iterator insert(const_iterator pos, size_type cnt, const basic_json& val) - { - // insert only works for arrays - if (is_array()) - { - // check if iterator pos fits to this JSON value - if (pos.m_object != this) - { - JSON_THROW(std::domain_error("iterator does not fit current value")); - } - - // insert to array and return iterator - iterator result(this); - result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); - return result; - } - - JSON_THROW(std::domain_error("cannot use insert() with " + type_name())); - } - - /*! - @brief inserts elements - - Inserts elements from range `[first, last)` before iterator @a pos. - - @param[in] pos iterator before which the content will be inserted; may be - the end() iterator - @param[in] first begin of the range of elements to insert - @param[in] last end of the range of elements to insert - - @throw std::domain_error if called on JSON values other than arrays; - example: `"cannot use insert() with string"` - @throw std::domain_error if @a pos is not an iterator of *this; example: - `"iterator does not fit current value"` - @throw std::domain_error if @a first and @a last do not belong to the same - JSON value; example: `"iterators do not fit"` - @throw std::domain_error if @a first or @a last are iterators into - container for which insert is called; example: `"passed iterators may not - belong to container"` - - @return iterator pointing to the first element inserted, or @a pos if - `first==last` - - @complexity Linear in `std::distance(first, last)` plus linear in the - distance between @a pos and end of the container. - - @liveexample{The example shows how `insert()` is used.,insert__range} - - @since version 1.0.0 - */ - iterator insert(const_iterator pos, const_iterator first, const_iterator last) - { - // insert only works for arrays - if (not is_array()) - { - JSON_THROW(std::domain_error("cannot use insert() with " + type_name())); - } - - // check if iterator pos fits to this JSON value - if (pos.m_object != this) - { - JSON_THROW(std::domain_error("iterator does not fit current value")); - } - - // check if range iterators belong to the same JSON object - if (first.m_object != last.m_object) - { - JSON_THROW(std::domain_error("iterators do not fit")); - } - - if (first.m_object == this or last.m_object == this) - { - JSON_THROW(std::domain_error("passed iterators may not belong to container")); - } - - // insert to array and return iterator - iterator result(this); - result.m_it.array_iterator = m_value.array->insert( - pos.m_it.array_iterator, - first.m_it.array_iterator, - last.m_it.array_iterator); - return result; - } - - /*! - @brief inserts elements - - Inserts elements from initializer list @a ilist before iterator @a pos. - - @param[in] pos iterator before which the content will be inserted; may be - the end() iterator - @param[in] ilist initializer list to insert the values from - - @throw std::domain_error if called on JSON values other than arrays; - example: `"cannot use insert() with string"` - @throw std::domain_error if @a pos is not an iterator of *this; example: - `"iterator does not fit current value"` - - @return iterator pointing to the first element inserted, or @a pos if - `ilist` is empty - - @complexity Linear in `ilist.size()` plus linear in the distance between - @a pos and end of the container. - - @liveexample{The example shows how `insert()` is used.,insert__ilist} - - @since version 1.0.0 - */ - iterator insert(const_iterator pos, std::initializer_list ilist) - { - // insert only works for arrays - if (not is_array()) - { - JSON_THROW(std::domain_error("cannot use insert() with " + type_name())); - } - - // check if iterator pos fits to this JSON value - if (pos.m_object != this) - { - JSON_THROW(std::domain_error("iterator does not fit current value")); - } - - // insert to array and return iterator - iterator result(this); - result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, ilist); - return result; - } - - /*! - @brief exchanges the values - - Exchanges the contents of the JSON value with those of @a other. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. - - @param[in,out] other JSON value to exchange the contents with - - @complexity Constant. - - @liveexample{The example below shows how JSON values can be swapped with - `swap()`.,swap__reference} - - @since version 1.0.0 - */ - void swap(reference other) noexcept ( - std::is_nothrow_move_constructible::value and - std::is_nothrow_move_assignable::value and - std::is_nothrow_move_constructible::value and - std::is_nothrow_move_assignable::value - ) - { - std::swap(m_type, other.m_type); - std::swap(m_value, other.m_value); - assert_invariant(); - } - - /*! - @brief exchanges the values - - Exchanges the contents of a JSON array with those of @a other. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. - - @param[in,out] other array to exchange the contents with - - @throw std::domain_error when JSON value is not an array; example: - `"cannot use swap() with string"` - - @complexity Constant. - - @liveexample{The example below shows how arrays can be swapped with - `swap()`.,swap__array_t} - - @since version 1.0.0 - */ - void swap(array_t& other) - { - // swap only works for arrays - if (is_array()) - { - std::swap(*(m_value.array), other); - } - else - { - JSON_THROW(std::domain_error("cannot use swap() with " + type_name())); - } - } - - /*! - @brief exchanges the values - - Exchanges the contents of a JSON object with those of @a other. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. - - @param[in,out] other object to exchange the contents with - - @throw std::domain_error when JSON value is not an object; example: - `"cannot use swap() with string"` - - @complexity Constant. - - @liveexample{The example below shows how objects can be swapped with - `swap()`.,swap__object_t} - - @since version 1.0.0 - */ - void swap(object_t& other) - { - // swap only works for objects - if (is_object()) - { - std::swap(*(m_value.object), other); - } - else - { - JSON_THROW(std::domain_error("cannot use swap() with " + type_name())); - } - } - - /*! - @brief exchanges the values - - Exchanges the contents of a JSON string with those of @a other. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. - - @param[in,out] other string to exchange the contents with - - @throw std::domain_error when JSON value is not a string; example: `"cannot - use swap() with boolean"` - - @complexity Constant. - - @liveexample{The example below shows how strings can be swapped with - `swap()`.,swap__string_t} - - @since version 1.0.0 - */ - void swap(string_t& other) - { - // swap only works for strings - if (is_string()) - { - std::swap(*(m_value.string), other); - } - else - { - JSON_THROW(std::domain_error("cannot use swap() with " + type_name())); - } - } - - /// @} - - public: - ////////////////////////////////////////// - // lexicographical comparison operators // - ////////////////////////////////////////// - - /// @name lexicographical comparison operators - /// @{ - - /*! - @brief comparison: equal - - Compares two JSON values for equality according to the following rules: - - Two JSON values are equal if (1) they are from the same type and (2) - their stored values are the same. - - Integer and floating-point numbers are automatically converted before - comparison. Floating-point numbers are compared indirectly: two - floating-point numbers `f1` and `f2` are considered equal if neither - `f1 > f2` nor `f2 > f1` holds. - - Two JSON null values are equal. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether the values @a lhs and @a rhs are equal - - @complexity Linear. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__equal} - - @since version 1.0.0 - */ - friend bool operator==(const_reference lhs, const_reference rhs) noexcept - { - const auto lhs_type = lhs.type(); - const auto rhs_type = rhs.type(); - - if (lhs_type == rhs_type) - { - switch (lhs_type) - { - case value_t::array: - { - return *lhs.m_value.array == *rhs.m_value.array; - } - case value_t::object: - { - return *lhs.m_value.object == *rhs.m_value.object; - } - case value_t::null: - { - return true; - } - case value_t::string: - { - return *lhs.m_value.string == *rhs.m_value.string; - } - case value_t::boolean: - { - return lhs.m_value.boolean == rhs.m_value.boolean; - } - case value_t::number_integer: - { - return lhs.m_value.number_integer == rhs.m_value.number_integer; - } - case value_t::number_unsigned: - { - return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned; - } - case value_t::number_float: - { - return lhs.m_value.number_float == rhs.m_value.number_float; - } - default: - { - return false; - } - } - } - else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer) - { - return lhs.m_value.number_float == static_cast(rhs.m_value.number_integer); - } - else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer) - { - return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer; - } - else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned); - } - - return false; - } - - /*! - @brief comparison: equal - @copydoc operator==(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator==(const_reference lhs, const ScalarType rhs) noexcept - { - return (lhs == basic_json(rhs)); - } - - /*! - @brief comparison: equal - @copydoc operator==(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator==(const ScalarType lhs, const_reference rhs) noexcept - { - return (basic_json(lhs) == rhs); - } - - /*! - @brief comparison: not equal - - Compares two JSON values for inequality by calculating `not (lhs == rhs)`. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether the values @a lhs and @a rhs are not equal - - @complexity Linear. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__notequal} - - @since version 1.0.0 - */ - friend bool operator!=(const_reference lhs, const_reference rhs) noexcept - { - return not (lhs == rhs); - } - - /*! - @brief comparison: not equal - @copydoc operator!=(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator!=(const_reference lhs, const ScalarType rhs) noexcept - { - return (lhs != basic_json(rhs)); - } - - /*! - @brief comparison: not equal - @copydoc operator!=(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator!=(const ScalarType lhs, const_reference rhs) noexcept - { - return (basic_json(lhs) != rhs); - } - - /*! - @brief comparison: less than - - Compares whether one JSON value @a lhs is less than another JSON value @a - rhs according to the following rules: - - If @a lhs and @a rhs have the same type, the values are compared using - the default `<` operator. - - Integer and floating-point numbers are automatically converted before - comparison - - In case @a lhs and @a rhs have different types, the values are ignored - and the order of the types is considered, see - @ref operator<(const value_t, const value_t). - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether @a lhs is less than @a rhs - - @complexity Linear. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__less} - - @since version 1.0.0 - */ - friend bool operator<(const_reference lhs, const_reference rhs) noexcept - { - const auto lhs_type = lhs.type(); - const auto rhs_type = rhs.type(); - - if (lhs_type == rhs_type) - { - switch (lhs_type) - { - case value_t::array: - { - return *lhs.m_value.array < *rhs.m_value.array; - } - case value_t::object: - { - return *lhs.m_value.object < *rhs.m_value.object; - } - case value_t::null: - { - return false; - } - case value_t::string: - { - return *lhs.m_value.string < *rhs.m_value.string; - } - case value_t::boolean: - { - return lhs.m_value.boolean < rhs.m_value.boolean; - } - case value_t::number_integer: - { - return lhs.m_value.number_integer < rhs.m_value.number_integer; - } - case value_t::number_unsigned: - { - return lhs.m_value.number_unsigned < rhs.m_value.number_unsigned; - } - case value_t::number_float: - { - return lhs.m_value.number_float < rhs.m_value.number_float; - } - default: - { - return false; - } - } - } - else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer) - { - return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); - } - else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer) - { - return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; - } - - // We only reach this line if we cannot compare values. In that case, - // we compare types. Note we have to call the operator explicitly, - // because MSVC has problems otherwise. - return operator<(lhs_type, rhs_type); - } - - /*! - @brief comparison: less than or equal - - Compares whether one JSON value @a lhs is less than or equal to another - JSON value by calculating `not (rhs < lhs)`. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether @a lhs is less than or equal to @a rhs - - @complexity Linear. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__greater} - - @since version 1.0.0 - */ - friend bool operator<=(const_reference lhs, const_reference rhs) noexcept - { - return not (rhs < lhs); - } - - /*! - @brief comparison: greater than - - Compares whether one JSON value @a lhs is greater than another - JSON value by calculating `not (lhs <= rhs)`. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether @a lhs is greater than to @a rhs - - @complexity Linear. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__lessequal} - - @since version 1.0.0 - */ - friend bool operator>(const_reference lhs, const_reference rhs) noexcept - { - return not (lhs <= rhs); - } - - /*! - @brief comparison: greater than or equal - - Compares whether one JSON value @a lhs is greater than or equal to another - JSON value by calculating `not (lhs < rhs)`. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether @a lhs is greater than or equal to @a rhs - - @complexity Linear. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__greaterequal} - - @since version 1.0.0 - */ - friend bool operator>=(const_reference lhs, const_reference rhs) noexcept - { - return not (lhs < rhs); - } - - /// @} - - - /////////////////// - // serialization // - /////////////////// - - /// @name serialization - /// @{ - - /*! - @brief serialize to stream - - Serialize the given JSON value @a j to the output stream @a o. The JSON - value will be serialized using the @ref dump member function. The - indentation of the output can be controlled with the member variable - `width` of the output stream @a o. For instance, using the manipulator - `std::setw(4)` on @a o sets the indentation level to `4` and the - serialization result is the same as calling `dump(4)`. - - @param[in,out] o stream to serialize to - @param[in] j JSON value to serialize - - @return the stream @a o - - @complexity Linear. - - @liveexample{The example below shows the serialization with different - parameters to `width` to adjust the indentation level.,operator_serialize} - - @since version 1.0.0 - */ - friend std::ostream& operator<<(std::ostream& o, const basic_json& j) - { - // read width member and use it as indentation parameter if nonzero - const bool pretty_print = (o.width() > 0); - const auto indentation = (pretty_print ? o.width() : 0); - - // reset width to 0 for subsequent calls to this stream - o.width(0); - - // do the actual serialization - j.dump(o, pretty_print, static_cast(indentation)); - - return o; - } - - /*! - @brief serialize to stream - @copydoc operator<<(std::ostream&, const basic_json&) - */ - friend std::ostream& operator>>(const basic_json& j, std::ostream& o) - { - return o << j; - } - - /// @} - - - ///////////////////// - // deserialization // - ///////////////////// - - /// @name deserialization - /// @{ - - /*! - @brief deserialize from an array - - This function reads from an array of 1-byte values. - - @pre Each element of the container has a size of 1 byte. Violating this - precondition yields undefined behavior. **This precondition is enforced - with a static assertion.** - - @param[in] array array to read from - @param[in] cb a parser callback function of type @ref parser_callback_t - which is used to control the deserialization by filtering unwanted values - (optional) - - @return result of the deserialization - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. The complexity can be higher if the parser callback function - @a cb has a super-linear complexity. - - @note A UTF-8 byte order mark is silently ignored. - - @liveexample{The example below demonstrates the `parse()` function reading - from an array.,parse__array__parser_callback_t} - - @since version 2.0.3 - */ - template - static basic_json parse(T (&array)[N], - const parser_callback_t cb = nullptr) - { - // delegate the call to the iterator-range parse overload - return parse(std::begin(array), std::end(array), cb); - } - - /*! - @brief deserialize from string literal - - @tparam CharT character/literal type with size of 1 byte - @param[in] s string literal to read a serialized JSON value from - @param[in] cb a parser callback function of type @ref parser_callback_t - which is used to control the deserialization by filtering unwanted values - (optional) - - @return result of the deserialization - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. The complexity can be higher if the parser callback function - @a cb has a super-linear complexity. - - @note A UTF-8 byte order mark is silently ignored. - @note String containers like `std::string` or @ref string_t can be parsed - with @ref parse(const ContiguousContainer&, const parser_callback_t) - - @liveexample{The example below demonstrates the `parse()` function with - and without callback function.,parse__string__parser_callback_t} - - @sa @ref parse(std::istream&, const parser_callback_t) for a version that - reads from an input stream - - @since version 1.0.0 (originally for @ref string_t) - */ - template::value and - std::is_integral::type>::value and - sizeof(typename std::remove_pointer::type) == 1, int>::type = 0> - static basic_json parse(const CharT s, - const parser_callback_t cb = nullptr) - { - return parser(reinterpret_cast(s), cb).parse(); - } - - /*! - @brief deserialize from stream - - @param[in,out] i stream to read a serialized JSON value from - @param[in] cb a parser callback function of type @ref parser_callback_t - which is used to control the deserialization by filtering unwanted values - (optional) - - @return result of the deserialization - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. The complexity can be higher if the parser callback function - @a cb has a super-linear complexity. - - @note A UTF-8 byte order mark is silently ignored. - - @liveexample{The example below demonstrates the `parse()` function with - and without callback function.,parse__istream__parser_callback_t} - - @sa @ref parse(const CharT, const parser_callback_t) for a version - that reads from a string - - @since version 1.0.0 - */ - static basic_json parse(std::istream& i, - const parser_callback_t cb = nullptr) - { - return parser(i, cb).parse(); - } - - /*! - @copydoc parse(std::istream&, const parser_callback_t) - */ - static basic_json parse(std::istream&& i, - const parser_callback_t cb = nullptr) - { - return parser(i, cb).parse(); - } - - /*! - @brief deserialize from an iterator range with contiguous storage - - This function reads from an iterator range of a container with contiguous - storage of 1-byte values. Compatible container types include - `std::vector`, `std::string`, `std::array`, `std::valarray`, and - `std::initializer_list`. Furthermore, C-style arrays can be used with - `std::begin()`/`std::end()`. User-defined containers can be used as long - as they implement random-access iterators and a contiguous storage. - - @pre The iterator range is contiguous. Violating this precondition yields - undefined behavior. **This precondition is enforced with an assertion.** - @pre Each element in the range has a size of 1 byte. Violating this - precondition yields undefined behavior. **This precondition is enforced - with a static assertion.** - - @warning There is no way to enforce all preconditions at compile-time. If - the function is called with noncompliant iterators and with - assertions switched off, the behavior is undefined and will most - likely yield segmentation violation. - - @tparam IteratorType iterator of container with contiguous storage - @param[in] first begin of the range to parse (included) - @param[in] last end of the range to parse (excluded) - @param[in] cb a parser callback function of type @ref parser_callback_t - which is used to control the deserialization by filtering unwanted values - (optional) - - @return result of the deserialization - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. The complexity can be higher if the parser callback function - @a cb has a super-linear complexity. - - @note A UTF-8 byte order mark is silently ignored. - - @liveexample{The example below demonstrates the `parse()` function reading - from an iterator range.,parse__iteratortype__parser_callback_t} - - @since version 2.0.3 - */ - template::iterator_category>::value, int>::type = 0> - static basic_json parse(IteratorType first, IteratorType last, - const parser_callback_t cb = nullptr) - { - // assertion to check that the iterator range is indeed contiguous, - // see http://stackoverflow.com/a/35008842/266378 for more discussion - assert(std::accumulate(first, last, std::pair(true, 0), - [&first](std::pair res, decltype(*first) val) - { - res.first &= (val == *(std::next(std::addressof(*first), res.second++))); - return res; - }).first); - - // assertion to check that each element is 1 byte long - static_assert(sizeof(typename std::iterator_traits::value_type) == 1, - "each element in the iterator range must have the size of 1 byte"); - - // if iterator range is empty, create a parser with an empty string - // to generate "unexpected EOF" error message - if (std::distance(first, last) <= 0) - { - return parser("").parse(); - } - - return parser(first, last, cb).parse(); - } - - /*! - @brief deserialize from a container with contiguous storage - - This function reads from a container with contiguous storage of 1-byte - values. Compatible container types include `std::vector`, `std::string`, - `std::array`, and `std::initializer_list`. User-defined containers can be - used as long as they implement random-access iterators and a contiguous - storage. - - @pre The container storage is contiguous. Violating this precondition - yields undefined behavior. **This precondition is enforced with an - assertion.** - @pre Each element of the container has a size of 1 byte. Violating this - precondition yields undefined behavior. **This precondition is enforced - with a static assertion.** - - @warning There is no way to enforce all preconditions at compile-time. If - the function is called with a noncompliant container and with - assertions switched off, the behavior is undefined and will most - likely yield segmentation violation. - - @tparam ContiguousContainer container type with contiguous storage - @param[in] c container to read from - @param[in] cb a parser callback function of type @ref parser_callback_t - which is used to control the deserialization by filtering unwanted values - (optional) - - @return result of the deserialization - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. The complexity can be higher if the parser callback function - @a cb has a super-linear complexity. - - @note A UTF-8 byte order mark is silently ignored. - - @liveexample{The example below demonstrates the `parse()` function reading - from a contiguous container.,parse__contiguouscontainer__parser_callback_t} - - @since version 2.0.3 - */ - template::value and - std::is_base_of< - std::random_access_iterator_tag, - typename std::iterator_traits()))>::iterator_category>::value - , int>::type = 0> - static basic_json parse(const ContiguousContainer& c, - const parser_callback_t cb = nullptr) - { - // delegate the call to the iterator-range parse overload - return parse(std::begin(c), std::end(c), cb); - } - - /*! - @brief deserialize from stream - - Deserializes an input stream to a JSON value. - - @param[in,out] i input stream to read a serialized JSON value from - @param[in,out] j JSON value to write the deserialized input to - - @throw std::invalid_argument in case of parse errors - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. - - @note A UTF-8 byte order mark is silently ignored. - - @liveexample{The example below shows how a JSON value is constructed by - reading a serialization from a stream.,operator_deserialize} - - @sa parse(std::istream&, const parser_callback_t) for a variant with a - parser callback function to filter values while parsing - - @since version 1.0.0 - */ - friend std::istream& operator<<(basic_json& j, std::istream& i) - { - j = parser(i).parse(); - return i; - } - - /*! - @brief deserialize from stream - @copydoc operator<<(basic_json&, std::istream&) - */ - friend std::istream& operator>>(std::istream& i, basic_json& j) - { - j = parser(i).parse(); - return i; - } - - /// @} - - ////////////////////////////////////////// - // binary serialization/deserialization // - ////////////////////////////////////////// - - /// @name binary serialization/deserialization support - /// @{ - - private: - /*! - @note Some code in the switch cases has been copied, because otherwise - copilers would complain about implicit fallthrough and there is no - portable attribute to mute such warnings. - */ - template - static void add_to_vector(std::vector& vec, size_t bytes, const T number) - { - assert(bytes == 1 or bytes == 2 or bytes == 4 or bytes == 8); - - switch (bytes) - { - case 8: - { - vec.push_back(static_cast((static_cast(number) >> 070) & 0xff)); - vec.push_back(static_cast((static_cast(number) >> 060) & 0xff)); - vec.push_back(static_cast((static_cast(number) >> 050) & 0xff)); - vec.push_back(static_cast((static_cast(number) >> 040) & 0xff)); - vec.push_back(static_cast((number >> 030) & 0xff)); - vec.push_back(static_cast((number >> 020) & 0xff)); - vec.push_back(static_cast((number >> 010) & 0xff)); - vec.push_back(static_cast(number & 0xff)); - break; - } - - case 4: - { - vec.push_back(static_cast((number >> 030) & 0xff)); - vec.push_back(static_cast((number >> 020) & 0xff)); - vec.push_back(static_cast((number >> 010) & 0xff)); - vec.push_back(static_cast(number & 0xff)); - break; - } - - case 2: - { - vec.push_back(static_cast((number >> 010) & 0xff)); - vec.push_back(static_cast(number & 0xff)); - break; - } - - case 1: - { - vec.push_back(static_cast(number & 0xff)); - break; - } - } - } - - /*! - @brief take sufficient bytes from a vector to fill an integer variable - - In the context of binary serialization formats, we need to read several - bytes from a byte vector and combine them to multi-byte integral data - types. - - @param[in] vec byte vector to read from - @param[in] current_index the position in the vector after which to read - - @return the next sizeof(T) bytes from @a vec, in reverse order as T - - @tparam T the integral return type - - @throw std::out_of_range if there are less than sizeof(T)+1 bytes in the - vector @a vec to read - - In the for loop, the bytes from the vector are copied in reverse order into - the return value. In the figures below, let sizeof(T)=4 and `i` be the loop - variable. - - Precondition: - - vec: | | | a | b | c | d | T: | | | | | - ^ ^ ^ ^ - current_index i ptr sizeof(T) - - Postcondition: - - vec: | | | a | b | c | d | T: | d | c | b | a | - ^ ^ ^ - | i ptr - current_index - - @sa Code adapted from . - */ - template - static T get_from_vector(const std::vector& vec, const size_t current_index) - { - if (current_index + sizeof(T) + 1 > vec.size()) - { - JSON_THROW(std::out_of_range("cannot read " + std::to_string(sizeof(T)) + " bytes from vector")); - } - - T result; - auto* ptr = reinterpret_cast(&result); - for (size_t i = 0; i < sizeof(T); ++i) - { - *ptr++ = vec[current_index + sizeof(T) - i]; - } - return result; - } - - /*! - @brief create a MessagePack serialization of a given JSON value - - This is a straightforward implementation of the MessagePack specification. - - @param[in] j JSON value to serialize - @param[in,out] v byte vector to write the serialization to - - @sa https://github.com/msgpack/msgpack/blob/master/spec.md - */ - static void to_msgpack_internal(const basic_json& j, std::vector& v) - { - switch (j.type()) - { - case value_t::null: - { - // nil - v.push_back(0xc0); - break; - } - - case value_t::boolean: - { - // true and false - v.push_back(j.m_value.boolean ? 0xc3 : 0xc2); - break; - } - - case value_t::number_integer: - { - if (j.m_value.number_integer >= 0) - { - // MessagePack does not differentiate between positive - // signed integers and unsigned integers. Therefore, we - // used the code from the value_t::number_unsigned case - // here. - if (j.m_value.number_unsigned < 128) - { - // positive fixnum - add_to_vector(v, 1, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= std::numeric_limits::max()) - { - // uint 8 - v.push_back(0xcc); - add_to_vector(v, 1, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= std::numeric_limits::max()) - { - // uint 16 - v.push_back(0xcd); - add_to_vector(v, 2, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= std::numeric_limits::max()) - { - // uint 32 - v.push_back(0xce); - add_to_vector(v, 4, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= std::numeric_limits::max()) - { - // uint 64 - v.push_back(0xcf); - add_to_vector(v, 8, j.m_value.number_unsigned); - } - } - else - { - if (j.m_value.number_integer >= -32) - { - // negative fixnum - add_to_vector(v, 1, j.m_value.number_integer); - } - else if (j.m_value.number_integer >= std::numeric_limits::min() and j.m_value.number_integer <= std::numeric_limits::max()) - { - // int 8 - v.push_back(0xd0); - add_to_vector(v, 1, j.m_value.number_integer); - } - else if (j.m_value.number_integer >= std::numeric_limits::min() and j.m_value.number_integer <= std::numeric_limits::max()) - { - // int 16 - v.push_back(0xd1); - add_to_vector(v, 2, j.m_value.number_integer); - } - else if (j.m_value.number_integer >= std::numeric_limits::min() and j.m_value.number_integer <= std::numeric_limits::max()) - { - // int 32 - v.push_back(0xd2); - add_to_vector(v, 4, j.m_value.number_integer); - } - else if (j.m_value.number_integer >= std::numeric_limits::min() and j.m_value.number_integer <= std::numeric_limits::max()) - { - // int 64 - v.push_back(0xd3); - add_to_vector(v, 8, j.m_value.number_integer); - } - } - break; - } - - case value_t::number_unsigned: - { - if (j.m_value.number_unsigned < 128) - { - // positive fixnum - add_to_vector(v, 1, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= std::numeric_limits::max()) - { - // uint 8 - v.push_back(0xcc); - add_to_vector(v, 1, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= std::numeric_limits::max()) - { - // uint 16 - v.push_back(0xcd); - add_to_vector(v, 2, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= std::numeric_limits::max()) - { - // uint 32 - v.push_back(0xce); - add_to_vector(v, 4, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= std::numeric_limits::max()) - { - // uint 64 - v.push_back(0xcf); - add_to_vector(v, 8, j.m_value.number_unsigned); - } - break; - } - - case value_t::number_float: - { - // float 64 - v.push_back(0xcb); - const auto* helper = reinterpret_cast(&(j.m_value.number_float)); - for (size_t i = 0; i < 8; ++i) - { - v.push_back(helper[7 - i]); - } - break; - } - - case value_t::string: - { - const auto N = j.m_value.string->size(); - if (N <= 31) - { - // fixstr - v.push_back(static_cast(0xa0 | N)); - } - else if (N <= 255) - { - // str 8 - v.push_back(0xd9); - add_to_vector(v, 1, N); - } - else if (N <= 65535) - { - // str 16 - v.push_back(0xda); - add_to_vector(v, 2, N); - } - else if (N <= 4294967295) - { - // str 32 - v.push_back(0xdb); - add_to_vector(v, 4, N); - } - - // append string - std::copy(j.m_value.string->begin(), j.m_value.string->end(), - std::back_inserter(v)); - break; - } - - case value_t::array: - { - const auto N = j.m_value.array->size(); - if (N <= 15) - { - // fixarray - v.push_back(static_cast(0x90 | N)); - } - else if (N <= 0xffff) - { - // array 16 - v.push_back(0xdc); - add_to_vector(v, 2, N); - } - else if (N <= 0xffffffff) - { - // array 32 - v.push_back(0xdd); - add_to_vector(v, 4, N); - } - - // append each element - for (const auto& el : *j.m_value.array) - { - to_msgpack_internal(el, v); - } - break; - } - - case value_t::object: - { - const auto N = j.m_value.object->size(); - if (N <= 15) - { - // fixmap - v.push_back(static_cast(0x80 | (N & 0xf))); - } - else if (N <= 65535) - { - // map 16 - v.push_back(0xde); - add_to_vector(v, 2, N); - } - else if (N <= 4294967295) - { - // map 32 - v.push_back(0xdf); - add_to_vector(v, 4, N); - } - - // append each element - for (const auto& el : *j.m_value.object) - { - to_msgpack_internal(el.first, v); - to_msgpack_internal(el.second, v); - } - break; - } - - default: - { - break; - } - } - } - - /*! - @brief create a CBOR serialization of a given JSON value - - This is a straightforward implementation of the CBOR specification. - - @param[in] j JSON value to serialize - @param[in,out] v byte vector to write the serialization to - - @sa https://tools.ietf.org/html/rfc7049 - */ - static void to_cbor_internal(const basic_json& j, std::vector& v) - { - switch (j.type()) - { - case value_t::null: - { - v.push_back(0xf6); - break; - } - - case value_t::boolean: - { - v.push_back(j.m_value.boolean ? 0xf5 : 0xf4); - break; - } - - case value_t::number_integer: - { - if (j.m_value.number_integer >= 0) - { - // CBOR does not differentiate between positive signed - // integers and unsigned integers. Therefore, we used the - // code from the value_t::number_unsigned case here. - if (j.m_value.number_integer <= 0x17) - { - add_to_vector(v, 1, j.m_value.number_integer); - } - else if (j.m_value.number_integer <= std::numeric_limits::max()) - { - v.push_back(0x18); - // one-byte uint8_t - add_to_vector(v, 1, j.m_value.number_integer); - } - else if (j.m_value.number_integer <= std::numeric_limits::max()) - { - v.push_back(0x19); - // two-byte uint16_t - add_to_vector(v, 2, j.m_value.number_integer); - } - else if (j.m_value.number_integer <= std::numeric_limits::max()) - { - v.push_back(0x1a); - // four-byte uint32_t - add_to_vector(v, 4, j.m_value.number_integer); - } - else - { - v.push_back(0x1b); - // eight-byte uint64_t - add_to_vector(v, 8, j.m_value.number_integer); - } - } - else - { - // The conversions below encode the sign in the first - // byte, and the value is converted to a positive number. - const auto positive_number = -1 - j.m_value.number_integer; - if (j.m_value.number_integer >= -24) - { - v.push_back(static_cast(0x20 + positive_number)); - } - else if (positive_number <= std::numeric_limits::max()) - { - // int 8 - v.push_back(0x38); - add_to_vector(v, 1, positive_number); - } - else if (positive_number <= std::numeric_limits::max()) - { - // int 16 - v.push_back(0x39); - add_to_vector(v, 2, positive_number); - } - else if (positive_number <= std::numeric_limits::max()) - { - // int 32 - v.push_back(0x3a); - add_to_vector(v, 4, positive_number); - } - else - { - // int 64 - v.push_back(0x3b); - add_to_vector(v, 8, positive_number); - } - } - break; - } - - case value_t::number_unsigned: - { - if (j.m_value.number_unsigned <= 0x17) - { - v.push_back(static_cast(j.m_value.number_unsigned)); - } - else if (j.m_value.number_unsigned <= 0xff) - { - v.push_back(0x18); - // one-byte uint8_t - add_to_vector(v, 1, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= 0xffff) - { - v.push_back(0x19); - // two-byte uint16_t - add_to_vector(v, 2, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= 0xffffffff) - { - v.push_back(0x1a); - // four-byte uint32_t - add_to_vector(v, 4, j.m_value.number_unsigned); - } - else if (j.m_value.number_unsigned <= 0xffffffffffffffff) - { - v.push_back(0x1b); - // eight-byte uint64_t - add_to_vector(v, 8, j.m_value.number_unsigned); - } - break; - } - - case value_t::number_float: - { - // Double-Precision Float - v.push_back(0xfb); - const auto* helper = reinterpret_cast(&(j.m_value.number_float)); - for (size_t i = 0; i < 8; ++i) - { - v.push_back(helper[7 - i]); - } - break; - } - - case value_t::string: - { - const auto N = j.m_value.string->size(); - if (N <= 0x17) - { - v.push_back(0x60 + static_cast(N)); // 1 byte for string + size - } - else if (N <= 0xff) - { - v.push_back(0x78); // one-byte uint8_t for N - add_to_vector(v, 1, N); - } - else if (N <= 0xffff) - { - v.push_back(0x79); // two-byte uint16_t for N - add_to_vector(v, 2, N); - } - else if (N <= 0xffffffff) - { - v.push_back(0x7a); // four-byte uint32_t for N - add_to_vector(v, 4, N); - } - // LCOV_EXCL_START - else if (N <= 0xffffffffffffffff) - { - v.push_back(0x7b); // eight-byte uint64_t for N - add_to_vector(v, 8, N); - } - // LCOV_EXCL_STOP - - // append string - std::copy(j.m_value.string->begin(), j.m_value.string->end(), - std::back_inserter(v)); - break; - } - - case value_t::array: - { - const auto N = j.m_value.array->size(); - if (N <= 0x17) - { - v.push_back(0x80 + static_cast(N)); // 1 byte for array + size - } - else if (N <= 0xff) - { - v.push_back(0x98); // one-byte uint8_t for N - add_to_vector(v, 1, N); - } - else if (N <= 0xffff) - { - v.push_back(0x99); // two-byte uint16_t for N - add_to_vector(v, 2, N); - } - else if (N <= 0xffffffff) - { - v.push_back(0x9a); // four-byte uint32_t for N - add_to_vector(v, 4, N); - } - // LCOV_EXCL_START - else if (N <= 0xffffffffffffffff) - { - v.push_back(0x9b); // eight-byte uint64_t for N - add_to_vector(v, 8, N); - } - // LCOV_EXCL_STOP - - // append each element - for (const auto& el : *j.m_value.array) - { - to_cbor_internal(el, v); - } - break; - } - - case value_t::object: - { - const auto N = j.m_value.object->size(); - if (N <= 0x17) - { - v.push_back(0xa0 + static_cast(N)); // 1 byte for object + size - } - else if (N <= 0xff) - { - v.push_back(0xb8); - add_to_vector(v, 1, N); // one-byte uint8_t for N - } - else if (N <= 0xffff) - { - v.push_back(0xb9); - add_to_vector(v, 2, N); // two-byte uint16_t for N - } - else if (N <= 0xffffffff) - { - v.push_back(0xba); - add_to_vector(v, 4, N); // four-byte uint32_t for N - } - // LCOV_EXCL_START - else if (N <= 0xffffffffffffffff) - { - v.push_back(0xbb); - add_to_vector(v, 8, N); // eight-byte uint64_t for N - } - // LCOV_EXCL_STOP - - // append each element - for (const auto& el : *j.m_value.object) - { - to_cbor_internal(el.first, v); - to_cbor_internal(el.second, v); - } - break; - } - - default: - { - break; - } - } - } - - - /* - @brief checks if given lengths do not exceed the size of a given vector - - To secure the access to the byte vector during CBOR/MessagePack - deserialization, bytes are copied from the vector into buffers. This - function checks if the number of bytes to copy (@a len) does not exceed - the size @s size of the vector. Additionally, an @a offset is given from - where to start reading the bytes. - - This function checks whether reading the bytes is safe; that is, offset is - a valid index in the vector, offset+len - - @param[in] size size of the byte vector - @param[in] len number of bytes to read - @param[in] offset offset where to start reading - - vec: x x x x x X X X X X - ^ ^ ^ - 0 offset len - - @throws out_of_range if `len > v.size()` - */ - static void check_length(const size_t size, const size_t len, const size_t offset) - { - // simple case: requested length is greater than the vector's length - if (len > size or offset > size) - { - JSON_THROW(std::out_of_range("len out of range")); - } - - // second case: adding offset would result in overflow - if ((size > (std::numeric_limits::max() - offset))) - { - JSON_THROW(std::out_of_range("len+offset out of range")); - } - - // last case: reading past the end of the vector - if (len + offset > size) - { - JSON_THROW(std::out_of_range("len+offset out of range")); - } - } - - /*! - @brief create a JSON value from a given MessagePack vector - - @param[in] v MessagePack serialization - @param[in] idx byte index to start reading from @a v - - @return deserialized JSON value - - @throw std::invalid_argument if unsupported features from MessagePack were - used in the given vector @a v or if the input is not valid MessagePack - @throw std::out_of_range if the given vector ends prematurely - - @sa https://github.com/msgpack/msgpack/blob/master/spec.md - */ - static basic_json from_msgpack_internal(const std::vector& v, size_t& idx) - { - // make sure reading 1 byte is safe - check_length(v.size(), 1, idx); - - // store and increment index - const size_t current_idx = idx++; - - if (v[current_idx] <= 0xbf) - { - if (v[current_idx] <= 0x7f) // positive fixint - { - return v[current_idx]; - } - if (v[current_idx] <= 0x8f) // fixmap - { - basic_json result = value_t::object; - const size_t len = v[current_idx] & 0x0f; - for (size_t i = 0; i < len; ++i) - { - std::string key = from_msgpack_internal(v, idx); - result[key] = from_msgpack_internal(v, idx); - } - return result; - } - else if (v[current_idx] <= 0x9f) // fixarray - { - basic_json result = value_t::array; - const size_t len = v[current_idx] & 0x0f; - for (size_t i = 0; i < len; ++i) - { - result.push_back(from_msgpack_internal(v, idx)); - } - return result; - } - else // fixstr - { - const size_t len = v[current_idx] & 0x1f; - const size_t offset = current_idx + 1; - idx += len; // skip content bytes - check_length(v.size(), len, offset); - return std::string(reinterpret_cast(v.data()) + offset, len); - } - } - else if (v[current_idx] >= 0xe0) // negative fixint - { - return static_cast(v[current_idx]); - } - else - { - switch (v[current_idx]) - { - case 0xc0: // nil - { - return value_t::null; - } - - case 0xc2: // false - { - return false; - } - - case 0xc3: // true - { - return true; - } - - case 0xca: // float 32 - { - // copy bytes in reverse order into the double variable - float res; - for (size_t byte = 0; byte < sizeof(float); ++byte) - { - reinterpret_cast(&res)[sizeof(float) - byte - 1] = v.at(current_idx + 1 + byte); - } - idx += sizeof(float); // skip content bytes - return res; - } - - case 0xcb: // float 64 - { - // copy bytes in reverse order into the double variable - double res; - for (size_t byte = 0; byte < sizeof(double); ++byte) - { - reinterpret_cast(&res)[sizeof(double) - byte - 1] = v.at(current_idx + 1 + byte); - } - idx += sizeof(double); // skip content bytes - return res; - } - - case 0xcc: // uint 8 - { - idx += 1; // skip content byte - return get_from_vector(v, current_idx); - } - - case 0xcd: // uint 16 - { - idx += 2; // skip 2 content bytes - return get_from_vector(v, current_idx); - } - - case 0xce: // uint 32 - { - idx += 4; // skip 4 content bytes - return get_from_vector(v, current_idx); - } - - case 0xcf: // uint 64 - { - idx += 8; // skip 8 content bytes - return get_from_vector(v, current_idx); - } - - case 0xd0: // int 8 - { - idx += 1; // skip content byte - return get_from_vector(v, current_idx); - } - - case 0xd1: // int 16 - { - idx += 2; // skip 2 content bytes - return get_from_vector(v, current_idx); - } - - case 0xd2: // int 32 - { - idx += 4; // skip 4 content bytes - return get_from_vector(v, current_idx); - } - - case 0xd3: // int 64 - { - idx += 8; // skip 8 content bytes - return get_from_vector(v, current_idx); - } - - case 0xd9: // str 8 - { - const auto len = static_cast(get_from_vector(v, current_idx)); - const size_t offset = current_idx + 2; - idx += len + 1; // skip size byte + content bytes - check_length(v.size(), len, offset); - return std::string(reinterpret_cast(v.data()) + offset, len); - } - - case 0xda: // str 16 - { - const auto len = static_cast(get_from_vector(v, current_idx)); - const size_t offset = current_idx + 3; - idx += len + 2; // skip 2 size bytes + content bytes - check_length(v.size(), len, offset); - return std::string(reinterpret_cast(v.data()) + offset, len); - } - - case 0xdb: // str 32 - { - const auto len = static_cast(get_from_vector(v, current_idx)); - const size_t offset = current_idx + 5; - idx += len + 4; // skip 4 size bytes + content bytes - check_length(v.size(), len, offset); - return std::string(reinterpret_cast(v.data()) + offset, len); - } - - case 0xdc: // array 16 - { - basic_json result = value_t::array; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 2; // skip 2 size bytes - for (size_t i = 0; i < len; ++i) - { - result.push_back(from_msgpack_internal(v, idx)); - } - return result; - } - - case 0xdd: // array 32 - { - basic_json result = value_t::array; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 4; // skip 4 size bytes - for (size_t i = 0; i < len; ++i) - { - result.push_back(from_msgpack_internal(v, idx)); - } - return result; - } - - case 0xde: // map 16 - { - basic_json result = value_t::object; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 2; // skip 2 size bytes - for (size_t i = 0; i < len; ++i) - { - std::string key = from_msgpack_internal(v, idx); - result[key] = from_msgpack_internal(v, idx); - } - return result; - } - - case 0xdf: // map 32 - { - basic_json result = value_t::object; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 4; // skip 4 size bytes - for (size_t i = 0; i < len; ++i) - { - std::string key = from_msgpack_internal(v, idx); - result[key] = from_msgpack_internal(v, idx); - } - return result; - } - - default: - { - JSON_THROW(std::invalid_argument("error parsing a msgpack @ " + std::to_string(current_idx) + ": " + std::to_string(static_cast(v[current_idx])))); - } - } - } - } - - /*! - @brief create a JSON value from a given CBOR vector - - @param[in] v CBOR serialization - @param[in] idx byte index to start reading from @a v - - @return deserialized JSON value - - @throw std::invalid_argument if unsupported features from CBOR were used in - the given vector @a v or if the input is not valid CBOR - @throw std::out_of_range if the given vector ends prematurely - - @sa https://tools.ietf.org/html/rfc7049 - */ - static basic_json from_cbor_internal(const std::vector& v, size_t& idx) - { - // store and increment index - const size_t current_idx = idx++; - - switch (v.at(current_idx)) - { - // Integer 0x00..0x17 (0..23) - case 0x00: - case 0x01: - case 0x02: - case 0x03: - case 0x04: - case 0x05: - case 0x06: - case 0x07: - case 0x08: - case 0x09: - case 0x0a: - case 0x0b: - case 0x0c: - case 0x0d: - case 0x0e: - case 0x0f: - case 0x10: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - { - return v[current_idx]; - } - - case 0x18: // Unsigned integer (one-byte uint8_t follows) - { - idx += 1; // skip content byte - return get_from_vector(v, current_idx); - } - - case 0x19: // Unsigned integer (two-byte uint16_t follows) - { - idx += 2; // skip 2 content bytes - return get_from_vector(v, current_idx); - } - - case 0x1a: // Unsigned integer (four-byte uint32_t follows) - { - idx += 4; // skip 4 content bytes - return get_from_vector(v, current_idx); - } - - case 0x1b: // Unsigned integer (eight-byte uint64_t follows) - { - idx += 8; // skip 8 content bytes - return get_from_vector(v, current_idx); - } - - // Negative integer -1-0x00..-1-0x17 (-1..-24) - case 0x20: - case 0x21: - case 0x22: - case 0x23: - case 0x24: - case 0x25: - case 0x26: - case 0x27: - case 0x28: - case 0x29: - case 0x2a: - case 0x2b: - case 0x2c: - case 0x2d: - case 0x2e: - case 0x2f: - case 0x30: - case 0x31: - case 0x32: - case 0x33: - case 0x34: - case 0x35: - case 0x36: - case 0x37: - { - return static_cast(0x20 - 1 - v[current_idx]); - } - - case 0x38: // Negative integer (one-byte uint8_t follows) - { - idx += 1; // skip content byte - // must be uint8_t ! - return static_cast(-1) - get_from_vector(v, current_idx); - } - - case 0x39: // Negative integer -1-n (two-byte uint16_t follows) - { - idx += 2; // skip 2 content bytes - return static_cast(-1) - get_from_vector(v, current_idx); - } - - case 0x3a: // Negative integer -1-n (four-byte uint32_t follows) - { - idx += 4; // skip 4 content bytes - return static_cast(-1) - get_from_vector(v, current_idx); - } - - case 0x3b: // Negative integer -1-n (eight-byte uint64_t follows) - { - idx += 8; // skip 8 content bytes - return static_cast(-1) - static_cast(get_from_vector(v, current_idx)); - } - - // UTF-8 string (0x00..0x17 bytes follow) - case 0x60: - case 0x61: - case 0x62: - case 0x63: - case 0x64: - case 0x65: - case 0x66: - case 0x67: - case 0x68: - case 0x69: - case 0x6a: - case 0x6b: - case 0x6c: - case 0x6d: - case 0x6e: - case 0x6f: - case 0x70: - case 0x71: - case 0x72: - case 0x73: - case 0x74: - case 0x75: - case 0x76: - case 0x77: - { - const auto len = static_cast(v[current_idx] - 0x60); - const size_t offset = current_idx + 1; - idx += len; // skip content bytes - check_length(v.size(), len, offset); - return std::string(reinterpret_cast(v.data()) + offset, len); - } - - case 0x78: // UTF-8 string (one-byte uint8_t for n follows) - { - const auto len = static_cast(get_from_vector(v, current_idx)); - const size_t offset = current_idx + 2; - idx += len + 1; // skip size byte + content bytes - check_length(v.size(), len, offset); - return std::string(reinterpret_cast(v.data()) + offset, len); - } - - case 0x79: // UTF-8 string (two-byte uint16_t for n follow) - { - const auto len = static_cast(get_from_vector(v, current_idx)); - const size_t offset = current_idx + 3; - idx += len + 2; // skip 2 size bytes + content bytes - check_length(v.size(), len, offset); - return std::string(reinterpret_cast(v.data()) + offset, len); - } - - case 0x7a: // UTF-8 string (four-byte uint32_t for n follow) - { - const auto len = static_cast(get_from_vector(v, current_idx)); - const size_t offset = current_idx + 5; - idx += len + 4; // skip 4 size bytes + content bytes - check_length(v.size(), len, offset); - return std::string(reinterpret_cast(v.data()) + offset, len); - } - - case 0x7b: // UTF-8 string (eight-byte uint64_t for n follow) - { - const auto len = static_cast(get_from_vector(v, current_idx)); - const size_t offset = current_idx + 9; - idx += len + 8; // skip 8 size bytes + content bytes - check_length(v.size(), len, offset); - return std::string(reinterpret_cast(v.data()) + offset, len); - } - - case 0x7f: // UTF-8 string (indefinite length) - { - std::string result; - while (v.at(idx) != 0xff) - { - string_t s = from_cbor_internal(v, idx); - result += s; - } - // skip break byte (0xFF) - idx += 1; - return result; - } - - // array (0x00..0x17 data items follow) - case 0x80: - case 0x81: - case 0x82: - case 0x83: - case 0x84: - case 0x85: - case 0x86: - case 0x87: - case 0x88: - case 0x89: - case 0x8a: - case 0x8b: - case 0x8c: - case 0x8d: - case 0x8e: - case 0x8f: - case 0x90: - case 0x91: - case 0x92: - case 0x93: - case 0x94: - case 0x95: - case 0x96: - case 0x97: - { - basic_json result = value_t::array; - const auto len = static_cast(v[current_idx] - 0x80); - for (size_t i = 0; i < len; ++i) - { - result.push_back(from_cbor_internal(v, idx)); - } - return result; - } - - case 0x98: // array (one-byte uint8_t for n follows) - { - basic_json result = value_t::array; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 1; // skip 1 size byte - for (size_t i = 0; i < len; ++i) - { - result.push_back(from_cbor_internal(v, idx)); - } - return result; - } - - case 0x99: // array (two-byte uint16_t for n follow) - { - basic_json result = value_t::array; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 2; // skip 4 size bytes - for (size_t i = 0; i < len; ++i) - { - result.push_back(from_cbor_internal(v, idx)); - } - return result; - } - - case 0x9a: // array (four-byte uint32_t for n follow) - { - basic_json result = value_t::array; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 4; // skip 4 size bytes - for (size_t i = 0; i < len; ++i) - { - result.push_back(from_cbor_internal(v, idx)); - } - return result; - } - - case 0x9b: // array (eight-byte uint64_t for n follow) - { - basic_json result = value_t::array; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 8; // skip 8 size bytes - for (size_t i = 0; i < len; ++i) - { - result.push_back(from_cbor_internal(v, idx)); - } - return result; - } - - case 0x9f: // array (indefinite length) - { - basic_json result = value_t::array; - while (v.at(idx) != 0xff) - { - result.push_back(from_cbor_internal(v, idx)); - } - // skip break byte (0xFF) - idx += 1; - return result; - } - - // map (0x00..0x17 pairs of data items follow) - case 0xa0: - case 0xa1: - case 0xa2: - case 0xa3: - case 0xa4: - case 0xa5: - case 0xa6: - case 0xa7: - case 0xa8: - case 0xa9: - case 0xaa: - case 0xab: - case 0xac: - case 0xad: - case 0xae: - case 0xaf: - case 0xb0: - case 0xb1: - case 0xb2: - case 0xb3: - case 0xb4: - case 0xb5: - case 0xb6: - case 0xb7: - { - basic_json result = value_t::object; - const auto len = static_cast(v[current_idx] - 0xa0); - for (size_t i = 0; i < len; ++i) - { - std::string key = from_cbor_internal(v, idx); - result[key] = from_cbor_internal(v, idx); - } - return result; - } - - case 0xb8: // map (one-byte uint8_t for n follows) - { - basic_json result = value_t::object; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 1; // skip 1 size byte - for (size_t i = 0; i < len; ++i) - { - std::string key = from_cbor_internal(v, idx); - result[key] = from_cbor_internal(v, idx); - } - return result; - } - - case 0xb9: // map (two-byte uint16_t for n follow) - { - basic_json result = value_t::object; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 2; // skip 2 size bytes - for (size_t i = 0; i < len; ++i) - { - std::string key = from_cbor_internal(v, idx); - result[key] = from_cbor_internal(v, idx); - } - return result; - } - - case 0xba: // map (four-byte uint32_t for n follow) - { - basic_json result = value_t::object; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 4; // skip 4 size bytes - for (size_t i = 0; i < len; ++i) - { - std::string key = from_cbor_internal(v, idx); - result[key] = from_cbor_internal(v, idx); - } - return result; - } - - case 0xbb: // map (eight-byte uint64_t for n follow) - { - basic_json result = value_t::object; - const auto len = static_cast(get_from_vector(v, current_idx)); - idx += 8; // skip 8 size bytes - for (size_t i = 0; i < len; ++i) - { - std::string key = from_cbor_internal(v, idx); - result[key] = from_cbor_internal(v, idx); - } - return result; - } - - case 0xbf: // map (indefinite length) - { - basic_json result = value_t::object; - while (v.at(idx) != 0xff) - { - std::string key = from_cbor_internal(v, idx); - result[key] = from_cbor_internal(v, idx); - } - // skip break byte (0xFF) - idx += 1; - return result; - } - - case 0xf4: // false - { - return false; - } - - case 0xf5: // true - { - return true; - } - - case 0xf6: // null - { - return value_t::null; - } - - case 0xf9: // Half-Precision Float (two-byte IEEE 754) - { - idx += 2; // skip two content bytes - - // code from RFC 7049, Appendix D, Figure 3: - // As half-precision floating-point numbers were only added to - // IEEE 754 in 2008, today's programming platforms often still - // only have limited support for them. It is very easy to - // include at least decoding support for them even without such - // support. An example of a small decoder for half-precision - // floating-point numbers in the C language is shown in Fig. 3. - const int half = (v.at(current_idx + 1) << 8) + v.at(current_idx + 2); - const int exp = (half >> 10) & 0x1f; - const int mant = half & 0x3ff; - double val; - if (exp == 0) - { - val = std::ldexp(mant, -24); - } - else if (exp != 31) - { - val = std::ldexp(mant + 1024, exp - 25); - } - else - { - val = mant == 0 - ? std::numeric_limits::infinity() - : std::numeric_limits::quiet_NaN(); - } - return (half & 0x8000) != 0 ? -val : val; - } - - case 0xfa: // Single-Precision Float (four-byte IEEE 754) - { - // copy bytes in reverse order into the float variable - float res; - for (size_t byte = 0; byte < sizeof(float); ++byte) - { - reinterpret_cast(&res)[sizeof(float) - byte - 1] = v.at(current_idx + 1 + byte); - } - idx += sizeof(float); // skip content bytes - return res; - } - - case 0xfb: // Double-Precision Float (eight-byte IEEE 754) - { - // copy bytes in reverse order into the double variable - double res; - for (size_t byte = 0; byte < sizeof(double); ++byte) - { - reinterpret_cast(&res)[sizeof(double) - byte - 1] = v.at(current_idx + 1 + byte); - } - idx += sizeof(double); // skip content bytes - return res; - } - - default: // anything else (0xFF is handled inside the other types) - { - JSON_THROW(std::invalid_argument("error parsing a CBOR @ " + std::to_string(current_idx) + ": " + std::to_string(static_cast(v[current_idx])))); - } - } - } - - public: - /*! - @brief create a MessagePack serialization of a given JSON value - - Serializes a given JSON value @a j to a byte vector using the MessagePack - serialization format. MessagePack is a binary serialization format which - aims to be more compact than JSON itself, yet more efficient to parse. - - @param[in] j JSON value to serialize - @return MessagePack serialization as byte vector - - @complexity Linear in the size of the JSON value @a j. - - @liveexample{The example shows the serialization of a JSON value to a byte - vector in MessagePack format.,to_msgpack} - - @sa http://msgpack.org - @sa @ref from_msgpack(const std::vector&, const size_t) for the - analogous deserialization - @sa @ref to_cbor(const basic_json& for the related CBOR format - - @since version 2.0.9 - */ - static std::vector to_msgpack(const basic_json& j) - { - std::vector result; - to_msgpack_internal(j, result); - return result; - } - - /*! - @brief create a JSON value from a byte vector in MessagePack format - - Deserializes a given byte vector @a v to a JSON value using the MessagePack - serialization format. - - @param[in] v a byte vector in MessagePack format - @param[in] start_index the index to start reading from @a v (0 by default) - @return deserialized JSON value - - @throw std::invalid_argument if unsupported features from MessagePack were - used in the given vector @a v or if the input is not valid MessagePack - @throw std::out_of_range if the given vector ends prematurely - - @complexity Linear in the size of the byte vector @a v. - - @liveexample{The example shows the deserialization of a byte vector in - MessagePack format to a JSON value.,from_msgpack} - - @sa http://msgpack.org - @sa @ref to_msgpack(const basic_json&) for the analogous serialization - @sa @ref from_cbor(const std::vector&, const size_t) for the - related CBOR format - - @since version 2.0.9, parameter @a start_index since 2.1.1 - */ - static basic_json from_msgpack(const std::vector& v, - const size_t start_index = 0) - { - size_t i = start_index; - return from_msgpack_internal(v, i); - } - - /*! - @brief create a MessagePack serialization of a given JSON value - - Serializes a given JSON value @a j to a byte vector using the CBOR (Concise - Binary Object Representation) serialization format. CBOR is a binary - serialization format which aims to be more compact than JSON itself, yet - more efficient to parse. - - @param[in] j JSON value to serialize - @return MessagePack serialization as byte vector - - @complexity Linear in the size of the JSON value @a j. - - @liveexample{The example shows the serialization of a JSON value to a byte - vector in CBOR format.,to_cbor} - - @sa http://cbor.io - @sa @ref from_cbor(const std::vector&, const size_t) for the - analogous deserialization - @sa @ref to_msgpack(const basic_json& for the related MessagePack format - - @since version 2.0.9 - */ - static std::vector to_cbor(const basic_json& j) - { - std::vector result; - to_cbor_internal(j, result); - return result; - } - - /*! - @brief create a JSON value from a byte vector in CBOR format - - Deserializes a given byte vector @a v to a JSON value using the CBOR - (Concise Binary Object Representation) serialization format. - - @param[in] v a byte vector in CBOR format - @param[in] start_index the index to start reading from @a v (0 by default) - @return deserialized JSON value - - @throw std::invalid_argument if unsupported features from CBOR were used in - the given vector @a v or if the input is not valid MessagePack - @throw std::out_of_range if the given vector ends prematurely - - @complexity Linear in the size of the byte vector @a v. - - @liveexample{The example shows the deserialization of a byte vector in CBOR - format to a JSON value.,from_cbor} - - @sa http://cbor.io - @sa @ref to_cbor(const basic_json&) for the analogous serialization - @sa @ref from_msgpack(const std::vector&, const size_t) for the - related MessagePack format - - @since version 2.0.9, parameter @a start_index since 2.1.1 - */ - static basic_json from_cbor(const std::vector& v, - const size_t start_index = 0) - { - size_t i = start_index; - return from_cbor_internal(v, i); - } - - /// @} - - /////////////////////////// - // convenience functions // - /////////////////////////// - - /*! - @brief return the type as string - - Returns the type name as string to be used in error messages - usually to - indicate that a function was called on a wrong JSON type. - - @return basically a string representation of a the @a m_type member - - @complexity Constant. - - @liveexample{The following code exemplifies `type_name()` for all JSON - types.,type_name} - - @since version 1.0.0, public since 2.1.0 - */ - std::string type_name() const - { - { - switch (m_type) - { - case value_t::null: - return "null"; - case value_t::object: - return "object"; - case value_t::array: - return "array"; - case value_t::string: - return "string"; - case value_t::boolean: - return "boolean"; - case value_t::discarded: - return "discarded"; - default: - return "number"; - } - } - } - - private: - /*! - @brief calculates the extra space to escape a JSON string - - @param[in] s the string to escape - @return the number of characters required to escape string @a s - - @complexity Linear in the length of string @a s. - */ - static std::size_t extra_space(const string_t& s) noexcept - { - return std::accumulate(s.begin(), s.end(), size_t{}, - [](size_t res, typename string_t::value_type c) - { - switch (c) - { - case '"': - case '\\': - case '\b': - case '\f': - case '\n': - case '\r': - case '\t': - { - // from c (1 byte) to \x (2 bytes) - return res + 1; - } - - default: - { - if (c >= 0x00 and c <= 0x1f) - { - // from c (1 byte) to \uxxxx (6 bytes) - return res + 5; - } - - return res; - } - } - }); - } - - /*! - @brief escape a string - - Escape a string by replacing certain special characters by a sequence of - an escape character (backslash) and another character and other control - characters by a sequence of "\u" followed by a four-digit hex - representation. - - @param[in] s the string to escape - @return the escaped string - - @complexity Linear in the length of string @a s. - */ - static string_t escape_string(const string_t& s) - { - const auto space = extra_space(s); - if (space == 0) - { - return s; - } - - // create a result string of necessary size - string_t result(s.size() + space, '\\'); - std::size_t pos = 0; - - for (const auto& c : s) - { - switch (c) - { - // quotation mark (0x22) - case '"': - { - result[pos + 1] = '"'; - pos += 2; - break; - } - - // reverse solidus (0x5c) - case '\\': - { - // nothing to change - pos += 2; - break; - } - - // backspace (0x08) - case '\b': - { - result[pos + 1] = 'b'; - pos += 2; - break; - } - - // formfeed (0x0c) - case '\f': - { - result[pos + 1] = 'f'; - pos += 2; - break; - } - - // newline (0x0a) - case '\n': - { - result[pos + 1] = 'n'; - pos += 2; - break; - } - - // carriage return (0x0d) - case '\r': - { - result[pos + 1] = 'r'; - pos += 2; - break; - } - - // horizontal tab (0x09) - case '\t': - { - result[pos + 1] = 't'; - pos += 2; - break; - } - - default: - { - if (c >= 0x00 and c <= 0x1f) - { - // convert a number 0..15 to its hex representation - // (0..f) - static const char hexify[16] = - { - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' - }; - - // print character c as \uxxxx - for (const char m : - { 'u', '0', '0', hexify[c >> 4], hexify[c & 0x0f] - }) - { - result[++pos] = m; - } - - ++pos; - } - else - { - // all other characters are added as-is - result[pos++] = c; - } - break; - } - } - } - - return result; - } - - - /*! - @brief locale-independent serialization for built-in arithmetic types - */ - struct numtostr - { - public: - template - numtostr(NumberType value) - { - x_write(value, std::is_integral()); - } - - const char* c_str() const - { - return m_buf.data(); - } - - private: - /// a (hopefully) large enough character buffer - std::array < char, 64 > m_buf{{}}; - - template - void x_write(NumberType x, /*is_integral=*/std::true_type) - { - // special case for "0" - if (x == 0) - { - m_buf[0] = '0'; - return; - } - - const bool is_negative = x < 0; - size_t i = 0; - - // spare 1 byte for '\0' - while (x != 0 and i < m_buf.size() - 1) - { - const auto digit = std::labs(static_cast(x % 10)); - m_buf[i++] = static_cast('0' + digit); - x /= 10; - } - - // make sure the number has been processed completely - assert(x == 0); - - if (is_negative) - { - // make sure there is capacity for the '-' - assert(i < m_buf.size() - 2); - m_buf[i++] = '-'; - } - - std::reverse(m_buf.begin(), m_buf.begin() + i); - } - - template - void x_write(NumberType x, /*is_integral=*/std::false_type) - { - // special case for 0.0 and -0.0 - if (x == 0) - { - size_t i = 0; - if (std::signbit(x)) - { - m_buf[i++] = '-'; - } - m_buf[i++] = '0'; - m_buf[i++] = '.'; - m_buf[i] = '0'; - return; - } - - // get number of digits for a text -> float -> text round-trip - static constexpr auto d = std::numeric_limits::digits10; - - // the actual conversion - const auto written_bytes = snprintf(m_buf.data(), m_buf.size(), "%.*g", d, x); - - // negative value indicates an error - assert(written_bytes > 0); - // check if buffer was large enough - assert(static_cast(written_bytes) < m_buf.size()); - - // read information from locale - const auto loc = localeconv(); - assert(loc != nullptr); - const char thousands_sep = !loc->thousands_sep ? '\0' - : loc->thousands_sep[0]; - - const char decimal_point = !loc->decimal_point ? '\0' - : loc->decimal_point[0]; - - // erase thousands separator - if (thousands_sep != '\0') - { - const auto end = std::remove(m_buf.begin(), m_buf.begin() + written_bytes, thousands_sep); - std::fill(end, m_buf.end(), '\0'); - } - - // convert decimal point to '.' - if (decimal_point != '\0' and decimal_point != '.') - { - for (auto& c : m_buf) - { - if (c == decimal_point) - { - c = '.'; - break; - } - } - } - - // determine if need to append ".0" - size_t i = 0; - bool value_is_int_like = true; - for (i = 0; i < m_buf.size(); ++i) - { - // break when end of number is reached - if (m_buf[i] == '\0') - { - break; - } - - // check if we find non-int character - value_is_int_like = value_is_int_like and m_buf[i] != '.' and - m_buf[i] != 'e' and m_buf[i] != 'E'; - } - - if (value_is_int_like) - { - // there must be 2 bytes left for ".0" - assert((i + 2) < m_buf.size()); - // we write to the end of the number - assert(m_buf[i] == '\0'); - assert(m_buf[i - 1] != '\0'); - - // add ".0" - m_buf[i] = '.'; - m_buf[i + 1] = '0'; - - // the resulting string is properly terminated - assert(m_buf[i + 2] == '\0'); - } - } - }; - - - /*! - @brief internal implementation of the serialization function - - This function is called by the public member function dump and organizes - the serialization internally. The indentation level is propagated as - additional parameter. In case of arrays and objects, the function is - called recursively. Note that - - - strings and object keys are escaped using `escape_string()` - - integer numbers are converted implicitly via `operator<<` - - floating-point numbers are converted to a string using `"%g"` format - - @param[out] o stream to write to - @param[in] pretty_print whether the output shall be pretty-printed - @param[in] indent_step the indent level - @param[in] current_indent the current indent level (only used internally) - */ - void dump(std::ostream& o, - const bool pretty_print, - const unsigned int indent_step, - const unsigned int current_indent = 0) const - { - // variable to hold indentation for recursive calls - unsigned int new_indent = current_indent; - - switch (m_type) - { - case value_t::object: - { - if (m_value.object->empty()) - { - o << "{}"; - return; - } - - o << "{"; - - // increase indentation - if (pretty_print) - { - new_indent += indent_step; - o << "\n"; - } - - for (auto i = m_value.object->cbegin(); i != m_value.object->cend(); ++i) - { - if (i != m_value.object->cbegin()) - { - o << (pretty_print ? ",\n" : ","); - } - o << string_t(new_indent, ' ') << "\"" - << escape_string(i->first) << "\":" - << (pretty_print ? " " : ""); - i->second.dump(o, pretty_print, indent_step, new_indent); - } - - // decrease indentation - if (pretty_print) - { - new_indent -= indent_step; - o << "\n"; - } - - o << string_t(new_indent, ' ') + "}"; - return; - } - - case value_t::array: - { - if (m_value.array->empty()) - { - o << "[]"; - return; - } - - o << "["; - - // increase indentation - if (pretty_print) - { - new_indent += indent_step; - o << "\n"; - } - - for (auto i = m_value.array->cbegin(); i != m_value.array->cend(); ++i) - { - if (i != m_value.array->cbegin()) - { - o << (pretty_print ? ",\n" : ","); - } - o << string_t(new_indent, ' '); - i->dump(o, pretty_print, indent_step, new_indent); - } - - // decrease indentation - if (pretty_print) - { - new_indent -= indent_step; - o << "\n"; - } - - o << string_t(new_indent, ' ') << "]"; - return; - } - - case value_t::string: - { - o << string_t("\"") << escape_string(*m_value.string) << "\""; - return; - } - - case value_t::boolean: - { - o << (m_value.boolean ? "true" : "false"); - return; - } - - case value_t::number_integer: - { - o << numtostr(m_value.number_integer).c_str(); - return; - } - - case value_t::number_unsigned: - { - o << numtostr(m_value.number_unsigned).c_str(); - return; - } - - case value_t::number_float: - { - o << numtostr(m_value.number_float).c_str(); - return; - } - - case value_t::discarded: - { - o << ""; - return; - } - - case value_t::null: - { - o << "null"; - return; - } - } - } - - private: - ////////////////////// - // member variables // - ////////////////////// - - /// the type of the current element - value_t m_type = value_t::null; - - /// the value of the current element - json_value m_value = {}; - - - private: - /////////////// - // iterators // - /////////////// - - /*! - @brief an iterator for primitive JSON types - - This class models an iterator for primitive JSON types (boolean, number, - string). It's only purpose is to allow the iterator/const_iterator classes - to "iterate" over primitive values. Internally, the iterator is modeled by - a `difference_type` variable. Value begin_value (`0`) models the begin, - end_value (`1`) models past the end. - */ - class primitive_iterator_t - { - public: - - difference_type get_value() const noexcept - { - return m_it; - } - /// set iterator to a defined beginning - void set_begin() noexcept - { - m_it = begin_value; - } - - /// set iterator to a defined past the end - void set_end() noexcept - { - m_it = end_value; - } - - /// return whether the iterator can be dereferenced - constexpr bool is_begin() const noexcept - { - return (m_it == begin_value); - } - - /// return whether the iterator is at end - constexpr bool is_end() const noexcept - { - return (m_it == end_value); - } - - friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return lhs.m_it == rhs.m_it; - } - - friend constexpr bool operator!=(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return !(lhs == rhs); - } - - friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return lhs.m_it < rhs.m_it; - } - - friend constexpr bool operator<=(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return lhs.m_it <= rhs.m_it; - } - - friend constexpr bool operator>(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return lhs.m_it > rhs.m_it; - } - - friend constexpr bool operator>=(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return lhs.m_it >= rhs.m_it; - } - - primitive_iterator_t operator+(difference_type i) - { - auto result = *this; - result += i; - return result; - } - - friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return lhs.m_it - rhs.m_it; - } - - friend std::ostream& operator<<(std::ostream& os, primitive_iterator_t it) - { - return os << it.m_it; - } - - primitive_iterator_t& operator++() - { - ++m_it; - return *this; - } - - primitive_iterator_t operator++(int) - { - auto result = *this; - m_it++; - return result; - } - - primitive_iterator_t& operator--() - { - --m_it; - return *this; - } - - primitive_iterator_t operator--(int) - { - auto result = *this; - m_it--; - return result; - } - - primitive_iterator_t& operator+=(difference_type n) - { - m_it += n; - return *this; - } - - primitive_iterator_t& operator-=(difference_type n) - { - m_it -= n; - return *this; - } - - private: - static constexpr difference_type begin_value = 0; - static constexpr difference_type end_value = begin_value + 1; - - /// iterator as signed integer type - difference_type m_it = std::numeric_limits::denorm_min(); - }; - - /*! - @brief an iterator value - - @note This structure could easily be a union, but MSVC currently does not - allow unions members with complex constructors, see - https://github.com/nlohmann/json/pull/105. - */ - struct internal_iterator - { - /// iterator for JSON objects - typename object_t::iterator object_iterator; - /// iterator for JSON arrays - typename array_t::iterator array_iterator; - /// generic iterator for all other types - primitive_iterator_t primitive_iterator; - - /// create an uninitialized internal_iterator - internal_iterator() noexcept - : object_iterator(), array_iterator(), primitive_iterator() - {} - }; - - /// proxy class for the iterator_wrapper functions - template - class iteration_proxy - { - private: - /// helper class for iteration - class iteration_proxy_internal - { - private: - /// the iterator - IteratorType anchor; - /// an index for arrays (used to create key names) - size_t array_index = 0; - - public: - explicit iteration_proxy_internal(IteratorType it) noexcept - : anchor(it) - {} - - /// dereference operator (needed for range-based for) - iteration_proxy_internal& operator*() - { - return *this; - } - - /// increment operator (needed for range-based for) - iteration_proxy_internal& operator++() - { - ++anchor; - ++array_index; - - return *this; - } - - /// inequality operator (needed for range-based for) - bool operator!= (const iteration_proxy_internal& o) const - { - return anchor != o.anchor; - } - - /// return key of the iterator - typename basic_json::string_t key() const - { - assert(anchor.m_object != nullptr); - - switch (anchor.m_object->type()) - { - // use integer array index as key - case value_t::array: - { - return std::to_string(array_index); - } - - // use key from the object - case value_t::object: - { - return anchor.key(); - } - - // use an empty key for all primitive types - default: - { - return ""; - } - } - } - - /// return value of the iterator - typename IteratorType::reference value() const - { - return anchor.value(); - } - }; - - /// the container to iterate - typename IteratorType::reference container; - - public: - /// construct iteration proxy from a container - explicit iteration_proxy(typename IteratorType::reference cont) - : container(cont) - {} - - /// return iterator begin (needed for range-based for) - iteration_proxy_internal begin() noexcept - { - return iteration_proxy_internal(container.begin()); - } - - /// return iterator end (needed for range-based for) - iteration_proxy_internal end() noexcept - { - return iteration_proxy_internal(container.end()); - } - }; - - public: - /*! - @brief a template for a random access iterator for the @ref basic_json class - - This class implements a both iterators (iterator and const_iterator) for the - @ref basic_json class. - - @note An iterator is called *initialized* when a pointer to a JSON value - has been set (e.g., by a constructor or a copy assignment). If the - iterator is default-constructed, it is *uninitialized* and most - methods are undefined. **The library uses assertions to detect calls - on uninitialized iterators.** - - @requirement The class satisfies the following concept requirements: - - [RandomAccessIterator](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator): - The iterator that can be moved to point (forward and backward) to any - element in constant time. - - @since version 1.0.0, simplified in version 2.0.9 - */ - template - class iter_impl : public std::iterator - { - /// allow basic_json to access private members - friend class basic_json; - - // make sure U is basic_json or const basic_json - static_assert(std::is_same::value - or std::is_same::value, - "iter_impl only accepts (const) basic_json"); - - public: - /// the type of the values when the iterator is dereferenced - using value_type = typename basic_json::value_type; - /// a type to represent differences between iterators - using difference_type = typename basic_json::difference_type; - /// defines a pointer to the type iterated over (value_type) - using pointer = typename std::conditional::value, - typename basic_json::const_pointer, - typename basic_json::pointer>::type; - /// defines a reference to the type iterated over (value_type) - using reference = typename std::conditional::value, - typename basic_json::const_reference, - typename basic_json::reference>::type; - /// the category of the iterator - using iterator_category = std::bidirectional_iterator_tag; - - /// default constructor - iter_impl() = default; - - /*! - @brief constructor for a given JSON instance - @param[in] object pointer to a JSON object for this iterator - @pre object != nullptr - @post The iterator is initialized; i.e. `m_object != nullptr`. - */ - explicit iter_impl(pointer object) noexcept - : m_object(object) - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - m_it.object_iterator = typename object_t::iterator(); - break; - } - - case basic_json::value_t::array: - { - m_it.array_iterator = typename array_t::iterator(); - break; - } - - default: - { - m_it.primitive_iterator = primitive_iterator_t(); - break; - } - } - } - - /* - Use operator `const_iterator` instead of `const_iterator(const iterator& - other) noexcept` to avoid two class definitions for @ref iterator and - @ref const_iterator. - - This function is only called if this class is an @ref iterator. If this - class is a @ref const_iterator this function is not called. - */ - operator const_iterator() const - { - const_iterator ret; - - if (m_object) - { - ret.m_object = m_object; - ret.m_it = m_it; - } - - return ret; - } - - /*! - @brief copy constructor - @param[in] other iterator to copy from - @note It is not checked whether @a other is initialized. - */ - iter_impl(const iter_impl& other) noexcept - : m_object(other.m_object), m_it(other.m_it) - {} - - /*! - @brief copy assignment - @param[in,out] other iterator to copy from - @note It is not checked whether @a other is initialized. - */ - iter_impl& operator=(iter_impl other) noexcept( - std::is_nothrow_move_constructible::value and - std::is_nothrow_move_assignable::value and - std::is_nothrow_move_constructible::value and - std::is_nothrow_move_assignable::value - ) - { - std::swap(m_object, other.m_object); - std::swap(m_it, other.m_it); - return *this; - } - - private: - /*! - @brief set the iterator to the first value - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - void set_begin() noexcept - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - m_it.object_iterator = m_object->m_value.object->begin(); - break; - } - - case basic_json::value_t::array: - { - m_it.array_iterator = m_object->m_value.array->begin(); - break; - } - - case basic_json::value_t::null: - { - // set to end so begin()==end() is true: null is empty - m_it.primitive_iterator.set_end(); - break; - } - - default: - { - m_it.primitive_iterator.set_begin(); - break; - } - } - } - - /*! - @brief set the iterator past the last value - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - void set_end() noexcept - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - m_it.object_iterator = m_object->m_value.object->end(); - break; - } - - case basic_json::value_t::array: - { - m_it.array_iterator = m_object->m_value.array->end(); - break; - } - - default: - { - m_it.primitive_iterator.set_end(); - break; - } - } - } - - public: - /*! - @brief return a reference to the value pointed to by the iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - reference operator*() const - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - assert(m_it.object_iterator != m_object->m_value.object->end()); - return m_it.object_iterator->second; - } - - case basic_json::value_t::array: - { - assert(m_it.array_iterator != m_object->m_value.array->end()); - return *m_it.array_iterator; - } - - case basic_json::value_t::null: - { - JSON_THROW(std::out_of_range("cannot get value")); - } - - default: - { - if (m_it.primitive_iterator.is_begin()) - { - return *m_object; - } - - JSON_THROW(std::out_of_range("cannot get value")); - } - } - } - - /*! - @brief dereference the iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - pointer operator->() const - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - assert(m_it.object_iterator != m_object->m_value.object->end()); - return &(m_it.object_iterator->second); - } - - case basic_json::value_t::array: - { - assert(m_it.array_iterator != m_object->m_value.array->end()); - return &*m_it.array_iterator; - } - - default: - { - if (m_it.primitive_iterator.is_begin()) - { - return m_object; - } - - JSON_THROW(std::out_of_range("cannot get value")); - } - } - } - - /*! - @brief post-increment (it++) - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl operator++(int) - { - auto result = *this; - ++(*this); - return result; - } - - /*! - @brief pre-increment (++it) - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl& operator++() - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - std::advance(m_it.object_iterator, 1); - break; - } - - case basic_json::value_t::array: - { - std::advance(m_it.array_iterator, 1); - break; - } - - default: - { - ++m_it.primitive_iterator; - break; - } - } - - return *this; - } - - /*! - @brief post-decrement (it--) - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl operator--(int) - { - auto result = *this; - --(*this); - return result; - } - - /*! - @brief pre-decrement (--it) - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl& operator--() - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - std::advance(m_it.object_iterator, -1); - break; - } - - case basic_json::value_t::array: - { - std::advance(m_it.array_iterator, -1); - break; - } - - default: - { - --m_it.primitive_iterator; - break; - } - } - - return *this; - } - - /*! - @brief comparison: equal - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator==(const iter_impl& other) const - { - // if objects are not the same, the comparison is undefined - if (m_object != other.m_object) - { - JSON_THROW(std::domain_error("cannot compare iterators of different containers")); - } - - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - return (m_it.object_iterator == other.m_it.object_iterator); - } - - case basic_json::value_t::array: - { - return (m_it.array_iterator == other.m_it.array_iterator); - } - - default: - { - return (m_it.primitive_iterator == other.m_it.primitive_iterator); - } - } - } - - /*! - @brief comparison: not equal - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator!=(const iter_impl& other) const - { - return not operator==(other); - } - - /*! - @brief comparison: smaller - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator<(const iter_impl& other) const - { - // if objects are not the same, the comparison is undefined - if (m_object != other.m_object) - { - JSON_THROW(std::domain_error("cannot compare iterators of different containers")); - } - - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - JSON_THROW(std::domain_error("cannot compare order of object iterators")); - } - - case basic_json::value_t::array: - { - return (m_it.array_iterator < other.m_it.array_iterator); - } - - default: - { - return (m_it.primitive_iterator < other.m_it.primitive_iterator); - } - } - } - - /*! - @brief comparison: less than or equal - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator<=(const iter_impl& other) const - { - return not other.operator < (*this); - } - - /*! - @brief comparison: greater than - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator>(const iter_impl& other) const - { - return not operator<=(other); - } - - /*! - @brief comparison: greater than or equal - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator>=(const iter_impl& other) const - { - return not operator<(other); - } - - /*! - @brief add to iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl& operator+=(difference_type i) - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - JSON_THROW(std::domain_error("cannot use offsets with object iterators")); - } - - case basic_json::value_t::array: - { - std::advance(m_it.array_iterator, i); - break; - } - - default: - { - m_it.primitive_iterator += i; - break; - } - } - - return *this; - } - - /*! - @brief subtract from iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl& operator-=(difference_type i) - { - return operator+=(-i); - } - - /*! - @brief add to iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl operator+(difference_type i) - { - auto result = *this; - result += i; - return result; - } - - /*! - @brief subtract from iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl operator-(difference_type i) - { - auto result = *this; - result -= i; - return result; - } - - /*! - @brief return difference - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - difference_type operator-(const iter_impl& other) const - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - JSON_THROW(std::domain_error("cannot use offsets with object iterators")); - } - - case basic_json::value_t::array: - { - return m_it.array_iterator - other.m_it.array_iterator; - } - - default: - { - return m_it.primitive_iterator - other.m_it.primitive_iterator; - } - } - } - - /*! - @brief access to successor - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - reference operator[](difference_type n) const - { - assert(m_object != nullptr); - - switch (m_object->m_type) - { - case basic_json::value_t::object: - { - JSON_THROW(std::domain_error("cannot use operator[] for object iterators")); - } - - case basic_json::value_t::array: - { - return *std::next(m_it.array_iterator, n); - } - - case basic_json::value_t::null: - { - JSON_THROW(std::out_of_range("cannot get value")); - } - - default: - { - if (m_it.primitive_iterator.get_value() == -n) - { - return *m_object; - } - - JSON_THROW(std::out_of_range("cannot get value")); - } - } - } - - /*! - @brief return the key of an object iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - typename object_t::key_type key() const - { - assert(m_object != nullptr); - - if (m_object->is_object()) - { - return m_it.object_iterator->first; - } - - JSON_THROW(std::domain_error("cannot use key() for non-object iterators")); - } - - /*! - @brief return the value of an iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - reference value() const - { - return operator*(); - } - - private: - /// associated JSON instance - pointer m_object = nullptr; - /// the actual iterator of the associated instance - internal_iterator m_it = internal_iterator(); - }; - - /*! - @brief a template for a reverse iterator class - - @tparam Base the base iterator type to reverse. Valid types are @ref - iterator (to create @ref reverse_iterator) and @ref const_iterator (to - create @ref const_reverse_iterator). - - @requirement The class satisfies the following concept requirements: - - [RandomAccessIterator](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator): - The iterator that can be moved to point (forward and backward) to any - element in constant time. - - [OutputIterator](http://en.cppreference.com/w/cpp/concept/OutputIterator): - It is possible to write to the pointed-to element (only if @a Base is - @ref iterator). - - @since version 1.0.0 - */ - template - class json_reverse_iterator : public std::reverse_iterator - { - public: - /// shortcut to the reverse iterator adaptor - using base_iterator = std::reverse_iterator; - /// the reference type for the pointed-to element - using reference = typename Base::reference; - - /// create reverse iterator from iterator - json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept - : base_iterator(it) - {} - - /// create reverse iterator from base class - json_reverse_iterator(const base_iterator& it) noexcept - : base_iterator(it) - {} - - /// post-increment (it++) - json_reverse_iterator operator++(int) - { - return base_iterator::operator++(1); - } - - /// pre-increment (++it) - json_reverse_iterator& operator++() - { - base_iterator::operator++(); - return *this; - } - - /// post-decrement (it--) - json_reverse_iterator operator--(int) - { - return base_iterator::operator--(1); - } - - /// pre-decrement (--it) - json_reverse_iterator& operator--() - { - base_iterator::operator--(); - return *this; - } - - /// add to iterator - json_reverse_iterator& operator+=(difference_type i) - { - base_iterator::operator+=(i); - return *this; - } - - /// add to iterator - json_reverse_iterator operator+(difference_type i) const - { - auto result = *this; - result += i; - return result; - } - - /// subtract from iterator - json_reverse_iterator operator-(difference_type i) const - { - auto result = *this; - result -= i; - return result; - } - - /// return difference - difference_type operator-(const json_reverse_iterator& other) const - { - return this->base() - other.base(); - } - - /// access to successor - reference operator[](difference_type n) const - { - return *(this->operator+(n)); - } - - /// return the key of an object iterator - typename object_t::key_type key() const - { - auto it = --this->base(); - return it.key(); - } - - /// return the value of an iterator - reference value() const - { - auto it = --this->base(); - return it.operator * (); - } - }; - - - private: - ////////////////////// - // lexer and parser // - ////////////////////// - - /*! - @brief lexical analysis - - This class organizes the lexical analysis during JSON deserialization. The - core of it is a scanner generated by [re2c](http://re2c.org) that - processes a buffer and recognizes tokens according to RFC 7159. - */ - class lexer - { - public: - /// token types for the parser - enum class token_type - { - uninitialized, ///< indicating the scanner is uninitialized - literal_true, ///< the `true` literal - literal_false, ///< the `false` literal - literal_null, ///< the `null` literal - value_string, ///< a string -- use get_string() for actual value - value_unsigned, ///< an unsigned integer -- use get_number() for actual value - value_integer, ///< a signed integer -- use get_number() for actual value - value_float, ///< an floating point number -- use get_number() for actual value - begin_array, ///< the character for array begin `[` - begin_object, ///< the character for object begin `{` - end_array, ///< the character for array end `]` - end_object, ///< the character for object end `}` - name_separator, ///< the name separator `:` - value_separator, ///< the value separator `,` - parse_error, ///< indicating a parse error - end_of_input ///< indicating the end of the input buffer - }; - - /// the char type to use in the lexer - using lexer_char_t = unsigned char; - - /// a lexer from a buffer with given length - lexer(const lexer_char_t* buff, const size_t len) noexcept - : m_content(buff) - { - assert(m_content != nullptr); - m_start = m_cursor = m_content; - m_limit = m_content + len; - } - - /// a lexer from an input stream - explicit lexer(std::istream& s) - : m_stream(&s), m_line_buffer() - { - // immediately abort if stream is erroneous - if (s.fail()) - { - JSON_THROW(std::invalid_argument("stream error")); - } - - // fill buffer - fill_line_buffer(); - - // skip UTF-8 byte-order mark - if (m_line_buffer.size() >= 3 and m_line_buffer.substr(0, 3) == "\xEF\xBB\xBF") - { - m_line_buffer[0] = ' '; - m_line_buffer[1] = ' '; - m_line_buffer[2] = ' '; - } - } - - // switch off unwanted functions (due to pointer members) - lexer() = delete; - lexer(const lexer&) = delete; - lexer operator=(const lexer&) = delete; - - /*! - @brief create a string from one or two Unicode code points - - There are two cases: (1) @a codepoint1 is in the Basic Multilingual - Plane (U+0000 through U+FFFF) and @a codepoint2 is 0, or (2) - @a codepoint1 and @a codepoint2 are a UTF-16 surrogate pair to - represent a code point above U+FFFF. - - @param[in] codepoint1 the code point (can be high surrogate) - @param[in] codepoint2 the code point (can be low surrogate or 0) - - @return string representation of the code point; the length of the - result string is between 1 and 4 characters. - - @throw std::out_of_range if code point is > 0x10ffff; example: `"code - points above 0x10FFFF are invalid"` - @throw std::invalid_argument if the low surrogate is invalid; example: - `""missing or wrong low surrogate""` - - @complexity Constant. - - @see - */ - static string_t to_unicode(const std::size_t codepoint1, - const std::size_t codepoint2 = 0) - { - // calculate the code point from the given code points - std::size_t codepoint = codepoint1; - - // check if codepoint1 is a high surrogate - if (codepoint1 >= 0xD800 and codepoint1 <= 0xDBFF) - { - // check if codepoint2 is a low surrogate - if (codepoint2 >= 0xDC00 and codepoint2 <= 0xDFFF) - { - codepoint = - // high surrogate occupies the most significant 22 bits - (codepoint1 << 10) - // low surrogate occupies the least significant 15 bits - + codepoint2 - // there is still the 0xD800, 0xDC00 and 0x10000 noise - // in the result so we have to subtract with: - // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 - - 0x35FDC00; - } - else - { - JSON_THROW(std::invalid_argument("missing or wrong low surrogate")); - } - } - - string_t result; - - if (codepoint < 0x80) - { - // 1-byte characters: 0xxxxxxx (ASCII) - result.append(1, static_cast(codepoint)); - } - else if (codepoint <= 0x7ff) - { - // 2-byte characters: 110xxxxx 10xxxxxx - result.append(1, static_cast(0xC0 | ((codepoint >> 6) & 0x1F))); - result.append(1, static_cast(0x80 | (codepoint & 0x3F))); - } - else if (codepoint <= 0xffff) - { - // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx - result.append(1, static_cast(0xE0 | ((codepoint >> 12) & 0x0F))); - result.append(1, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); - result.append(1, static_cast(0x80 | (codepoint & 0x3F))); - } - else if (codepoint <= 0x10ffff) - { - // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - result.append(1, static_cast(0xF0 | ((codepoint >> 18) & 0x07))); - result.append(1, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); - result.append(1, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); - result.append(1, static_cast(0x80 | (codepoint & 0x3F))); - } - else - { - JSON_THROW(std::out_of_range("code points above 0x10FFFF are invalid")); - } - - return result; - } - - /// return name of values of type token_type (only used for errors) - static std::string token_type_name(const token_type t) - { - switch (t) - { - case token_type::uninitialized: - return ""; - case token_type::literal_true: - return "true literal"; - case token_type::literal_false: - return "false literal"; - case token_type::literal_null: - return "null literal"; - case token_type::value_string: - return "string literal"; - case lexer::token_type::value_unsigned: - case lexer::token_type::value_integer: - case lexer::token_type::value_float: - return "number literal"; - case token_type::begin_array: - return "'['"; - case token_type::begin_object: - return "'{'"; - case token_type::end_array: - return "']'"; - case token_type::end_object: - return "'}'"; - case token_type::name_separator: - return "':'"; - case token_type::value_separator: - return "','"; - case token_type::parse_error: - return ""; - case token_type::end_of_input: - return "end of input"; - default: - { - // catch non-enum values - return "unknown token"; // LCOV_EXCL_LINE - } - } - } - - /*! - This function implements a scanner for JSON. It is specified using - regular expressions that try to follow RFC 7159 as close as possible. - These regular expressions are then translated into a minimized - deterministic finite automaton (DFA) by the tool - [re2c](http://re2c.org). As a result, the translated code for this - function consists of a large block of code with `goto` jumps. - - @return the class of the next token read from the buffer - - @complexity Linear in the length of the input.\n - - Proposition: The loop below will always terminate for finite input.\n - - Proof (by contradiction): Assume a finite input. To loop forever, the - loop must never hit code with a `break` statement. The only code - snippets without a `break` statement are the continue statements for - whitespace and byte-order-marks. To loop forever, the input must be an - infinite sequence of whitespace or byte-order-marks. This contradicts - the assumption of finite input, q.e.d. - */ - token_type scan() - { - while (true) - { - // pointer for backtracking information - m_marker = nullptr; - - // remember the begin of the token - m_start = m_cursor; - assert(m_start != nullptr); - - - { - lexer_char_t yych; - unsigned int yyaccept = 0; - static const unsigned char yybm[] = - { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 32, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 160, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 0, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - if ((m_limit - m_cursor) < 5) - { - fill_line_buffer(5); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yybm[0 + yych] & 32) - { - goto basic_json_parser_6; - } - if (yych <= '[') - { - if (yych <= '-') - { - if (yych <= '"') - { - if (yych <= 0x00) - { - goto basic_json_parser_2; - } - if (yych <= '!') - { - goto basic_json_parser_4; - } - goto basic_json_parser_9; - } - else - { - if (yych <= '+') - { - goto basic_json_parser_4; - } - if (yych <= ',') - { - goto basic_json_parser_10; - } - goto basic_json_parser_12; - } - } - else - { - if (yych <= '9') - { - if (yych <= '/') - { - goto basic_json_parser_4; - } - if (yych <= '0') - { - goto basic_json_parser_13; - } - goto basic_json_parser_15; - } - else - { - if (yych <= ':') - { - goto basic_json_parser_17; - } - if (yych <= 'Z') - { - goto basic_json_parser_4; - } - goto basic_json_parser_19; - } - } - } - else - { - if (yych <= 'n') - { - if (yych <= 'e') - { - if (yych == ']') - { - goto basic_json_parser_21; - } - goto basic_json_parser_4; - } - else - { - if (yych <= 'f') - { - goto basic_json_parser_23; - } - if (yych <= 'm') - { - goto basic_json_parser_4; - } - goto basic_json_parser_24; - } - } - else - { - if (yych <= 'z') - { - if (yych == 't') - { - goto basic_json_parser_25; - } - goto basic_json_parser_4; - } - else - { - if (yych <= '{') - { - goto basic_json_parser_26; - } - if (yych == '}') - { - goto basic_json_parser_28; - } - goto basic_json_parser_4; - } - } - } -basic_json_parser_2: - ++m_cursor; - { - last_token_type = token_type::end_of_input; - break; - } -basic_json_parser_4: - ++m_cursor; -basic_json_parser_5: - { - last_token_type = token_type::parse_error; - break; - } -basic_json_parser_6: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yybm[0 + yych] & 32) - { - goto basic_json_parser_6; - } - { - continue; - } -basic_json_parser_9: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych <= 0x1F) - { - goto basic_json_parser_5; - } - if (yych <= 0x7F) - { - goto basic_json_parser_31; - } - if (yych <= 0xC1) - { - goto basic_json_parser_5; - } - if (yych <= 0xF4) - { - goto basic_json_parser_31; - } - goto basic_json_parser_5; -basic_json_parser_10: - ++m_cursor; - { - last_token_type = token_type::value_separator; - break; - } -basic_json_parser_12: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_5; - } - if (yych <= '0') - { - goto basic_json_parser_43; - } - if (yych <= '9') - { - goto basic_json_parser_45; - } - goto basic_json_parser_5; -basic_json_parser_13: - yyaccept = 1; - yych = *(m_marker = ++m_cursor); - if (yych <= '9') - { - if (yych == '.') - { - goto basic_json_parser_47; - } - if (yych >= '0') - { - goto basic_json_parser_48; - } - } - else - { - if (yych <= 'E') - { - if (yych >= 'E') - { - goto basic_json_parser_51; - } - } - else - { - if (yych == 'e') - { - goto basic_json_parser_51; - } - } - } -basic_json_parser_14: - { - last_token_type = token_type::value_unsigned; - break; - } -basic_json_parser_15: - yyaccept = 1; - m_marker = ++m_cursor; - if ((m_limit - m_cursor) < 3) - { - fill_line_buffer(3); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yybm[0 + yych] & 64) - { - goto basic_json_parser_15; - } - if (yych <= 'D') - { - if (yych == '.') - { - goto basic_json_parser_47; - } - goto basic_json_parser_14; - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_51; - } - if (yych == 'e') - { - goto basic_json_parser_51; - } - goto basic_json_parser_14; - } -basic_json_parser_17: - ++m_cursor; - { - last_token_type = token_type::name_separator; - break; - } -basic_json_parser_19: - ++m_cursor; - { - last_token_type = token_type::begin_array; - break; - } -basic_json_parser_21: - ++m_cursor; - { - last_token_type = token_type::end_array; - break; - } -basic_json_parser_23: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'a') - { - goto basic_json_parser_52; - } - goto basic_json_parser_5; -basic_json_parser_24: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'u') - { - goto basic_json_parser_53; - } - goto basic_json_parser_5; -basic_json_parser_25: - yyaccept = 0; - yych = *(m_marker = ++m_cursor); - if (yych == 'r') - { - goto basic_json_parser_54; - } - goto basic_json_parser_5; -basic_json_parser_26: - ++m_cursor; - { - last_token_type = token_type::begin_object; - break; - } -basic_json_parser_28: - ++m_cursor; - { - last_token_type = token_type::end_object; - break; - } -basic_json_parser_30: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; -basic_json_parser_31: - if (yybm[0 + yych] & 128) - { - goto basic_json_parser_30; - } - if (yych <= 0xE0) - { - if (yych <= '\\') - { - if (yych <= 0x1F) - { - goto basic_json_parser_32; - } - if (yych <= '"') - { - goto basic_json_parser_33; - } - goto basic_json_parser_35; - } - else - { - if (yych <= 0xC1) - { - goto basic_json_parser_32; - } - if (yych <= 0xDF) - { - goto basic_json_parser_36; - } - goto basic_json_parser_37; - } - } - else - { - if (yych <= 0xEF) - { - if (yych == 0xED) - { - goto basic_json_parser_39; - } - goto basic_json_parser_38; - } - else - { - if (yych <= 0xF0) - { - goto basic_json_parser_40; - } - if (yych <= 0xF3) - { - goto basic_json_parser_41; - } - if (yych <= 0xF4) - { - goto basic_json_parser_42; - } - } - } -basic_json_parser_32: - m_cursor = m_marker; - if (yyaccept <= 1) - { - if (yyaccept == 0) - { - goto basic_json_parser_5; - } - else - { - goto basic_json_parser_14; - } - } - else - { - if (yyaccept == 2) - { - goto basic_json_parser_44; - } - else - { - goto basic_json_parser_58; - } - } -basic_json_parser_33: - ++m_cursor; - { - last_token_type = token_type::value_string; - break; - } -basic_json_parser_35: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= 'e') - { - if (yych <= '/') - { - if (yych == '"') - { - goto basic_json_parser_30; - } - if (yych <= '.') - { - goto basic_json_parser_32; - } - goto basic_json_parser_30; - } - else - { - if (yych <= '\\') - { - if (yych <= '[') - { - goto basic_json_parser_32; - } - goto basic_json_parser_30; - } - else - { - if (yych == 'b') - { - goto basic_json_parser_30; - } - goto basic_json_parser_32; - } - } - } - else - { - if (yych <= 'q') - { - if (yych <= 'f') - { - goto basic_json_parser_30; - } - if (yych == 'n') - { - goto basic_json_parser_30; - } - goto basic_json_parser_32; - } - else - { - if (yych <= 's') - { - if (yych <= 'r') - { - goto basic_json_parser_30; - } - goto basic_json_parser_32; - } - else - { - if (yych <= 't') - { - goto basic_json_parser_30; - } - if (yych <= 'u') - { - goto basic_json_parser_55; - } - goto basic_json_parser_32; - } - } - } -basic_json_parser_36: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= 0x7F) - { - goto basic_json_parser_32; - } - if (yych <= 0xBF) - { - goto basic_json_parser_30; - } - goto basic_json_parser_32; -basic_json_parser_37: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= 0x9F) - { - goto basic_json_parser_32; - } - if (yych <= 0xBF) - { - goto basic_json_parser_36; - } - goto basic_json_parser_32; -basic_json_parser_38: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= 0x7F) - { - goto basic_json_parser_32; - } - if (yych <= 0xBF) - { - goto basic_json_parser_36; - } - goto basic_json_parser_32; -basic_json_parser_39: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= 0x7F) - { - goto basic_json_parser_32; - } - if (yych <= 0x9F) - { - goto basic_json_parser_36; - } - goto basic_json_parser_32; -basic_json_parser_40: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= 0x8F) - { - goto basic_json_parser_32; - } - if (yych <= 0xBF) - { - goto basic_json_parser_38; - } - goto basic_json_parser_32; -basic_json_parser_41: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= 0x7F) - { - goto basic_json_parser_32; - } - if (yych <= 0xBF) - { - goto basic_json_parser_38; - } - goto basic_json_parser_32; -basic_json_parser_42: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= 0x7F) - { - goto basic_json_parser_32; - } - if (yych <= 0x8F) - { - goto basic_json_parser_38; - } - goto basic_json_parser_32; -basic_json_parser_43: - yyaccept = 2; - yych = *(m_marker = ++m_cursor); - if (yych <= '9') - { - if (yych == '.') - { - goto basic_json_parser_47; - } - if (yych >= '0') - { - goto basic_json_parser_48; - } - } - else - { - if (yych <= 'E') - { - if (yych >= 'E') - { - goto basic_json_parser_51; - } - } - else - { - if (yych == 'e') - { - goto basic_json_parser_51; - } - } - } -basic_json_parser_44: - { - last_token_type = token_type::value_integer; - break; - } -basic_json_parser_45: - yyaccept = 2; - m_marker = ++m_cursor; - if ((m_limit - m_cursor) < 3) - { - fill_line_buffer(3); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= '9') - { - if (yych == '.') - { - goto basic_json_parser_47; - } - if (yych <= '/') - { - goto basic_json_parser_44; - } - goto basic_json_parser_45; - } - else - { - if (yych <= 'E') - { - if (yych <= 'D') - { - goto basic_json_parser_44; - } - goto basic_json_parser_51; - } - else - { - if (yych == 'e') - { - goto basic_json_parser_51; - } - goto basic_json_parser_44; - } - } -basic_json_parser_47: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_32; - } - if (yych <= '9') - { - goto basic_json_parser_56; - } - goto basic_json_parser_32; -basic_json_parser_48: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= '/') - { - goto basic_json_parser_50; - } - if (yych <= '9') - { - goto basic_json_parser_48; - } -basic_json_parser_50: - { - last_token_type = token_type::parse_error; - break; - } -basic_json_parser_51: - yych = *++m_cursor; - if (yych <= ',') - { - if (yych == '+') - { - goto basic_json_parser_59; - } - goto basic_json_parser_32; - } - else - { - if (yych <= '-') - { - goto basic_json_parser_59; - } - if (yych <= '/') - { - goto basic_json_parser_32; - } - if (yych <= '9') - { - goto basic_json_parser_60; - } - goto basic_json_parser_32; - } -basic_json_parser_52: - yych = *++m_cursor; - if (yych == 'l') - { - goto basic_json_parser_62; - } - goto basic_json_parser_32; -basic_json_parser_53: - yych = *++m_cursor; - if (yych == 'l') - { - goto basic_json_parser_63; - } - goto basic_json_parser_32; -basic_json_parser_54: - yych = *++m_cursor; - if (yych == 'u') - { - goto basic_json_parser_64; - } - goto basic_json_parser_32; -basic_json_parser_55: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= '@') - { - if (yych <= '/') - { - goto basic_json_parser_32; - } - if (yych <= '9') - { - goto basic_json_parser_65; - } - goto basic_json_parser_32; - } - else - { - if (yych <= 'F') - { - goto basic_json_parser_65; - } - if (yych <= '`') - { - goto basic_json_parser_32; - } - if (yych <= 'f') - { - goto basic_json_parser_65; - } - goto basic_json_parser_32; - } -basic_json_parser_56: - yyaccept = 3; - m_marker = ++m_cursor; - if ((m_limit - m_cursor) < 3) - { - fill_line_buffer(3); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= 'D') - { - if (yych <= '/') - { - goto basic_json_parser_58; - } - if (yych <= '9') - { - goto basic_json_parser_56; - } - } - else - { - if (yych <= 'E') - { - goto basic_json_parser_51; - } - if (yych == 'e') - { - goto basic_json_parser_51; - } - } -basic_json_parser_58: - { - last_token_type = token_type::value_float; - break; - } -basic_json_parser_59: - yych = *++m_cursor; - if (yych <= '/') - { - goto basic_json_parser_32; - } - if (yych >= ':') - { - goto basic_json_parser_32; - } -basic_json_parser_60: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= '/') - { - goto basic_json_parser_58; - } - if (yych <= '9') - { - goto basic_json_parser_60; - } - goto basic_json_parser_58; -basic_json_parser_62: - yych = *++m_cursor; - if (yych == 's') - { - goto basic_json_parser_66; - } - goto basic_json_parser_32; -basic_json_parser_63: - yych = *++m_cursor; - if (yych == 'l') - { - goto basic_json_parser_67; - } - goto basic_json_parser_32; -basic_json_parser_64: - yych = *++m_cursor; - if (yych == 'e') - { - goto basic_json_parser_69; - } - goto basic_json_parser_32; -basic_json_parser_65: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= '@') - { - if (yych <= '/') - { - goto basic_json_parser_32; - } - if (yych <= '9') - { - goto basic_json_parser_71; - } - goto basic_json_parser_32; - } - else - { - if (yych <= 'F') - { - goto basic_json_parser_71; - } - if (yych <= '`') - { - goto basic_json_parser_32; - } - if (yych <= 'f') - { - goto basic_json_parser_71; - } - goto basic_json_parser_32; - } -basic_json_parser_66: - yych = *++m_cursor; - if (yych == 'e') - { - goto basic_json_parser_72; - } - goto basic_json_parser_32; -basic_json_parser_67: - ++m_cursor; - { - last_token_type = token_type::literal_null; - break; - } -basic_json_parser_69: - ++m_cursor; - { - last_token_type = token_type::literal_true; - break; - } -basic_json_parser_71: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= '@') - { - if (yych <= '/') - { - goto basic_json_parser_32; - } - if (yych <= '9') - { - goto basic_json_parser_74; - } - goto basic_json_parser_32; - } - else - { - if (yych <= 'F') - { - goto basic_json_parser_74; - } - if (yych <= '`') - { - goto basic_json_parser_32; - } - if (yych <= 'f') - { - goto basic_json_parser_74; - } - goto basic_json_parser_32; - } -basic_json_parser_72: - ++m_cursor; - { - last_token_type = token_type::literal_false; - break; - } -basic_json_parser_74: - ++m_cursor; - if (m_limit <= m_cursor) - { - fill_line_buffer(1); // LCOV_EXCL_LINE - } - yych = *m_cursor; - if (yych <= '@') - { - if (yych <= '/') - { - goto basic_json_parser_32; - } - if (yych <= '9') - { - goto basic_json_parser_30; - } - goto basic_json_parser_32; - } - else - { - if (yych <= 'F') - { - goto basic_json_parser_30; - } - if (yych <= '`') - { - goto basic_json_parser_32; - } - if (yych <= 'f') - { - goto basic_json_parser_30; - } - goto basic_json_parser_32; - } - } - - } - - return last_token_type; - } - - /*! - @brief append data from the stream to the line buffer - - This function is called by the scan() function when the end of the - buffer (`m_limit`) is reached and the `m_cursor` pointer cannot be - incremented without leaving the limits of the line buffer. Note re2c - decides when to call this function. - - If the lexer reads from contiguous storage, there is no trailing null - byte. Therefore, this function must make sure to add these padding - null bytes. - - If the lexer reads from an input stream, this function reads the next - line of the input. - - @pre - p p p p p p u u u u u x . . . . . . - ^ ^ ^ ^ - m_content m_start | m_limit - m_cursor - - @post - u u u u u x x x x x x x . . . . . . - ^ ^ ^ - | m_cursor m_limit - m_start - m_content - */ - void fill_line_buffer(size_t n = 0) - { - // if line buffer is used, m_content points to its data - assert(m_line_buffer.empty() - or m_content == reinterpret_cast(m_line_buffer.data())); - - // if line buffer is used, m_limit is set past the end of its data - assert(m_line_buffer.empty() - or m_limit == m_content + m_line_buffer.size()); - - // pointer relationships - assert(m_content <= m_start); - assert(m_start <= m_cursor); - assert(m_cursor <= m_limit); - assert(m_marker == nullptr or m_marker <= m_limit); - - // number of processed characters (p) - const auto num_processed_chars = static_cast(m_start - m_content); - // offset for m_marker wrt. to m_start - const auto offset_marker = (m_marker == nullptr) ? 0 : m_marker - m_start; - // number of unprocessed characters (u) - const auto offset_cursor = m_cursor - m_start; - - // no stream is used or end of file is reached - if (m_stream == nullptr or m_stream->eof()) - { - // m_start may or may not be pointing into m_line_buffer at - // this point. We trust the standard library to do the right - // thing. See http://stackoverflow.com/q/28142011/266378 - m_line_buffer.assign(m_start, m_limit); - - // append n characters to make sure that there is sufficient - // space between m_cursor and m_limit - m_line_buffer.append(1, '\x00'); - if (n > 0) - { - m_line_buffer.append(n - 1, '\x01'); - } - } - else - { - // delete processed characters from line buffer - m_line_buffer.erase(0, num_processed_chars); - // read next line from input stream - m_line_buffer_tmp.clear(); - std::getline(*m_stream, m_line_buffer_tmp, '\n'); - - // add line with newline symbol to the line buffer - m_line_buffer += m_line_buffer_tmp; - m_line_buffer.push_back('\n'); - } - - // set pointers - m_content = reinterpret_cast(m_line_buffer.data()); - assert(m_content != nullptr); - m_start = m_content; - m_marker = m_start + offset_marker; - m_cursor = m_start + offset_cursor; - m_limit = m_start + m_line_buffer.size(); - } - - /// return string representation of last read token - string_t get_token_string() const - { - assert(m_start != nullptr); - return string_t(reinterpret_cast(m_start), - static_cast(m_cursor - m_start)); - } - - /*! - @brief return string value for string tokens - - The function iterates the characters between the opening and closing - quotes of the string value. The complete string is the range - [m_start,m_cursor). Consequently, we iterate from m_start+1 to - m_cursor-1. - - We differentiate two cases: - - 1. Escaped characters. In this case, a new character is constructed - according to the nature of the escape. Some escapes create new - characters (e.g., `"\\n"` is replaced by `"\n"`), some are copied - as is (e.g., `"\\\\"`). Furthermore, Unicode escapes of the shape - `"\\uxxxx"` need special care. In this case, to_unicode takes care - of the construction of the values. - 2. Unescaped characters are copied as is. - - @pre `m_cursor - m_start >= 2`, meaning the length of the last token - is at least 2 bytes which is trivially true for any string (which - consists of at least two quotes). - - " c1 c2 c3 ... " - ^ ^ - m_start m_cursor - - @complexity Linear in the length of the string.\n - - Lemma: The loop body will always terminate.\n - - Proof (by contradiction): Assume the loop body does not terminate. As - the loop body does not contain another loop, one of the called - functions must never return. The called functions are `std::strtoul` - and to_unicode. Neither function can loop forever, so the loop body - will never loop forever which contradicts the assumption that the loop - body does not terminate, q.e.d.\n - - Lemma: The loop condition for the for loop is eventually false.\n - - Proof (by contradiction): Assume the loop does not terminate. Due to - the above lemma, this can only be due to a tautological loop - condition; that is, the loop condition i < m_cursor - 1 must always be - true. Let x be the change of i for any loop iteration. Then - m_start + 1 + x < m_cursor - 1 must hold to loop indefinitely. This - can be rephrased to m_cursor - m_start - 2 > x. With the - precondition, we x <= 0, meaning that the loop condition holds - indefinitely if i is always decreased. However, observe that the value - of i is strictly increasing with each iteration, as it is incremented - by 1 in the iteration expression and never decremented inside the loop - body. Hence, the loop condition will eventually be false which - contradicts the assumption that the loop condition is a tautology, - q.e.d. - - @return string value of current token without opening and closing - quotes - @throw std::out_of_range if to_unicode fails - */ - string_t get_string() const - { - assert(m_cursor - m_start >= 2); - - string_t result; - result.reserve(static_cast(m_cursor - m_start - 2)); - - // iterate the result between the quotes - for (const lexer_char_t* i = m_start + 1; i < m_cursor - 1; ++i) - { - // find next escape character - auto e = std::find(i, m_cursor - 1, '\\'); - if (e != i) - { - // see https://github.com/nlohmann/json/issues/365#issuecomment-262874705 - for (auto k = i; k < e; k++) - { - result.push_back(static_cast(*k)); - } - i = e - 1; // -1 because of ++i - } - else - { - // processing escaped character - // read next character - ++i; - - switch (*i) - { - // the default escapes - case 't': - { - result += "\t"; - break; - } - case 'b': - { - result += "\b"; - break; - } - case 'f': - { - result += "\f"; - break; - } - case 'n': - { - result += "\n"; - break; - } - case 'r': - { - result += "\r"; - break; - } - case '\\': - { - result += "\\"; - break; - } - case '/': - { - result += "/"; - break; - } - case '"': - { - result += "\""; - break; - } - - // unicode - case 'u': - { - // get code xxxx from uxxxx - auto codepoint = std::strtoul(std::string(reinterpret_cast(i + 1), - 4).c_str(), nullptr, 16); - - // check if codepoint is a high surrogate - if (codepoint >= 0xD800 and codepoint <= 0xDBFF) - { - // make sure there is a subsequent unicode - if ((i + 6 >= m_limit) or * (i + 5) != '\\' or * (i + 6) != 'u') - { - JSON_THROW(std::invalid_argument("missing low surrogate")); - } - - // get code yyyy from uxxxx\uyyyy - auto codepoint2 = std::strtoul(std::string(reinterpret_cast - (i + 7), 4).c_str(), nullptr, 16); - result += to_unicode(codepoint, codepoint2); - // skip the next 10 characters (xxxx\uyyyy) - i += 10; - } - else if (codepoint >= 0xDC00 and codepoint <= 0xDFFF) - { - // we found a lone low surrogate - JSON_THROW(std::invalid_argument("missing high surrogate")); - } - else - { - // add unicode character(s) - result += to_unicode(codepoint); - // skip the next four characters (xxxx) - i += 4; - } - break; - } - } - } - } - - return result; - } - - - /*! - @brief parse string into a built-in arithmetic type as if the current - locale is POSIX. - - @note in floating-point case strtod may parse past the token's end - - this is not an error - - @note any leading blanks are not handled - */ - struct strtonum - { - public: - strtonum(const char* start, const char* end) - : m_start(start), m_end(end) - {} - - /*! - @return true iff parsed successfully as number of type T - - @param[in,out] val shall contain parsed value, or undefined value - if could not parse - */ - template::value>::type> - bool to(T& val) const - { - return parse(val, std::is_integral()); - } - - private: - const char* const m_start = nullptr; - const char* const m_end = nullptr; - - // floating-point conversion - - // overloaded wrappers for strtod/strtof/strtold - // that will be called from parse - static void strtof(float& f, const char* str, char** endptr) - { - f = std::strtof(str, endptr); - } - - static void strtof(double& f, const char* str, char** endptr) - { - f = std::strtod(str, endptr); - } - - static void strtof(long double& f, const char* str, char** endptr) - { - f = std::strtold(str, endptr); - } - - template - bool parse(T& value, /*is_integral=*/std::false_type) const - { - // replace decimal separator with locale-specific version, - // when necessary; data will point to either the original - // string, or buf, or tempstr containing the fixed string. - std::string tempstr; - std::array buf; - const size_t len = static_cast(m_end - m_start); - - // lexer will reject empty numbers - assert(len > 0); - - // since dealing with strtod family of functions, we're - // getting the decimal point char from the C locale facilities - // instead of C++'s numpunct facet of the current std::locale - const auto loc = localeconv(); - assert(loc != nullptr); - const char decimal_point_char = (loc->decimal_point == nullptr) ? '.' : loc->decimal_point[0]; - - const char* data = m_start; - - if (decimal_point_char != '.') - { - const size_t ds_pos = static_cast(std::find(m_start, m_end, '.') - m_start); - - if (ds_pos != len) - { - // copy the data into the local buffer or tempstr, if - // buffer is too small; replace decimal separator, and - // update data to point to the modified bytes - if ((len + 1) < buf.size()) - { - std::copy(m_start, m_end, buf.begin()); - buf[len] = 0; - buf[ds_pos] = decimal_point_char; - data = buf.data(); - } - else - { - tempstr.assign(m_start, m_end); - tempstr[ds_pos] = decimal_point_char; - data = tempstr.c_str(); - } - } - } - - char* endptr = nullptr; - value = 0; - // this calls appropriate overload depending on T - strtof(value, data, &endptr); - - // parsing was successful iff strtof parsed exactly the number - // of characters determined by the lexer (len) - const bool ok = (endptr == (data + len)); - - if (ok and (value == static_cast(0.0)) and (*data == '-')) - { - // some implementations forget to negate the zero - value = -0.0; - } - - return ok; - } - - // integral conversion - - signed long long parse_integral(char** endptr, /*is_signed*/std::true_type) const - { - return std::strtoll(m_start, endptr, 10); - } - - unsigned long long parse_integral(char** endptr, /*is_signed*/std::false_type) const - { - return std::strtoull(m_start, endptr, 10); - } - - template - bool parse(T& value, /*is_integral=*/std::true_type) const - { - char* endptr = nullptr; - errno = 0; // these are thread-local - const auto x = parse_integral(&endptr, std::is_signed()); - - // called right overload? - static_assert(std::is_signed() == std::is_signed(), ""); - - value = static_cast(x); - - return (x == static_cast(value)) // x fits into destination T - and (x < 0) == (value < 0) // preserved sign - //and ((x != 0) or is_integral()) // strto[u]ll did nto fail - and (errno == 0) // strto[u]ll did not overflow - and (m_start < m_end) // token was not empty - and (endptr == m_end); // parsed entire token exactly - } - }; - - /*! - @brief return number value for number tokens - - This function translates the last token into the most appropriate - number type (either integer, unsigned integer or floating point), - which is passed back to the caller via the result parameter. - - integral numbers that don't fit into the the range of the respective - type are parsed as number_float_t - - floating-point values do not satisfy std::isfinite predicate - are converted to value_t::null - - throws if the entire string [m_start .. m_cursor) cannot be - interpreted as a number - - @param[out] result @ref basic_json object to receive the number. - @param[in] token the type of the number token - */ - bool get_number(basic_json& result, const token_type token) const - { - assert(m_start != nullptr); - assert(m_start < m_cursor); - assert((token == token_type::value_unsigned) or - (token == token_type::value_integer) or - (token == token_type::value_float)); - - strtonum num_converter(reinterpret_cast(m_start), - reinterpret_cast(m_cursor)); - - switch (token) - { - case lexer::token_type::value_unsigned: - { - number_unsigned_t val; - if (num_converter.to(val)) - { - // parsing successful - result.m_type = value_t::number_unsigned; - result.m_value = val; - return true; - } - break; - } - - case lexer::token_type::value_integer: - { - number_integer_t val; - if (num_converter.to(val)) - { - // parsing successful - result.m_type = value_t::number_integer; - result.m_value = val; - return true; - } - break; - } - - default: - { - break; - } - } - - // parse float (either explicitly or because a previous conversion - // failed) - number_float_t val; - if (num_converter.to(val)) - { - // parsing successful - result.m_type = value_t::number_float; - result.m_value = val; - - // replace infinity and NAN by null - if (not std::isfinite(result.m_value.number_float)) - { - result.m_type = value_t::null; - result.m_value = basic_json::json_value(); - } - - return true; - } - - // couldn't parse number in any format - return false; - } - - private: - /// optional input stream - std::istream* m_stream = nullptr; - /// line buffer buffer for m_stream - string_t m_line_buffer {}; - /// used for filling m_line_buffer - string_t m_line_buffer_tmp {}; - /// the buffer pointer - const lexer_char_t* m_content = nullptr; - /// pointer to the beginning of the current symbol - const lexer_char_t* m_start = nullptr; - /// pointer for backtracking information - const lexer_char_t* m_marker = nullptr; - /// pointer to the current symbol - const lexer_char_t* m_cursor = nullptr; - /// pointer to the end of the buffer - const lexer_char_t* m_limit = nullptr; - /// the last token type - token_type last_token_type = token_type::end_of_input; - }; - - /*! - @brief syntax analysis - - This class implements a recursive decent parser. - */ - class parser - { - public: - /// a parser reading from a string literal - parser(const char* buff, const parser_callback_t cb = nullptr) - : callback(cb), - m_lexer(reinterpret_cast(buff), std::strlen(buff)) - {} - - /// a parser reading from an input stream - parser(std::istream& is, const parser_callback_t cb = nullptr) - : callback(cb), m_lexer(is) - {} - - /// a parser reading from an iterator range with contiguous storage - template::iterator_category, std::random_access_iterator_tag>::value - , int>::type - = 0> - parser(IteratorType first, IteratorType last, const parser_callback_t cb = nullptr) - : callback(cb), - m_lexer(reinterpret_cast(&(*first)), - static_cast(std::distance(first, last))) - {} - - /// public parser interface - basic_json parse() - { - // read first token - get_token(); - - basic_json result = parse_internal(true); - result.assert_invariant(); - - expect(lexer::token_type::end_of_input); - - // return parser result and replace it with null in case the - // top-level value was discarded by the callback function - return result.is_discarded() ? basic_json() : std::move(result); - } - - private: - /// the actual parser - basic_json parse_internal(bool keep) - { - auto result = basic_json(value_t::discarded); - - switch (last_token) - { - case lexer::token_type::begin_object: - { - if (keep and (not callback - or ((keep = callback(depth++, parse_event_t::object_start, result)) != 0))) - { - // explicitly set result to object to cope with {} - result.m_type = value_t::object; - result.m_value = value_t::object; - } - - // read next token - get_token(); - - // closing } -> we are done - if (last_token == lexer::token_type::end_object) - { - get_token(); - if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) - { - result = basic_json(value_t::discarded); - } - return result; - } - - // no comma is expected here - unexpect(lexer::token_type::value_separator); - - // otherwise: parse key-value pairs - do - { - // ugly, but could be fixed with loop reorganization - if (last_token == lexer::token_type::value_separator) - { - get_token(); - } - - // store key - expect(lexer::token_type::value_string); - const auto key = m_lexer.get_string(); - - bool keep_tag = false; - if (keep) - { - if (callback) - { - basic_json k(key); - keep_tag = callback(depth, parse_event_t::key, k); - } - else - { - keep_tag = true; - } - } - - // parse separator (:) - get_token(); - expect(lexer::token_type::name_separator); - - // parse and add value - get_token(); - auto value = parse_internal(keep); - if (keep and keep_tag and not value.is_discarded()) - { - result[key] = std::move(value); - } - } - while (last_token == lexer::token_type::value_separator); - - // closing } - expect(lexer::token_type::end_object); - get_token(); - if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) - { - result = basic_json(value_t::discarded); - } - - return result; - } - - case lexer::token_type::begin_array: - { - if (keep and (not callback - or ((keep = callback(depth++, parse_event_t::array_start, result)) != 0))) - { - // explicitly set result to object to cope with [] - result.m_type = value_t::array; - result.m_value = value_t::array; - } - - // read next token - get_token(); - - // closing ] -> we are done - if (last_token == lexer::token_type::end_array) - { - get_token(); - if (callback and not callback(--depth, parse_event_t::array_end, result)) - { - result = basic_json(value_t::discarded); - } - return result; - } - - // no comma is expected here - unexpect(lexer::token_type::value_separator); - - // otherwise: parse values - do - { - // ugly, but could be fixed with loop reorganization - if (last_token == lexer::token_type::value_separator) - { - get_token(); - } - - // parse value - auto value = parse_internal(keep); - if (keep and not value.is_discarded()) - { - result.push_back(std::move(value)); - } - } - while (last_token == lexer::token_type::value_separator); - - // closing ] - expect(lexer::token_type::end_array); - get_token(); - if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) - { - result = basic_json(value_t::discarded); - } - - return result; - } - - case lexer::token_type::literal_null: - { - get_token(); - result.m_type = value_t::null; - break; - } - - case lexer::token_type::value_string: - { - const auto s = m_lexer.get_string(); - get_token(); - result = basic_json(s); - break; - } - - case lexer::token_type::literal_true: - { - get_token(); - result.m_type = value_t::boolean; - result.m_value = true; - break; - } - - case lexer::token_type::literal_false: - { - get_token(); - result.m_type = value_t::boolean; - result.m_value = false; - break; - } - - case lexer::token_type::value_unsigned: - case lexer::token_type::value_integer: - case lexer::token_type::value_float: - { - m_lexer.get_number(result, last_token); - get_token(); - break; - } - - default: - { - // the last token was unexpected - unexpect(last_token); - } - } - - if (keep and callback and not callback(depth, parse_event_t::value, result)) - { - result = basic_json(value_t::discarded); - } - return result; - } - - /// get next token from lexer - typename lexer::token_type get_token() - { - last_token = m_lexer.scan(); - return last_token; - } - - void expect(typename lexer::token_type t) const - { - if (t != last_token) - { - std::string error_msg = "parse error - unexpected "; - error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() + - "'") : - lexer::token_type_name(last_token)); - error_msg += "; expected " + lexer::token_type_name(t); - JSON_THROW(std::invalid_argument(error_msg)); - } - } - - void unexpect(typename lexer::token_type t) const - { - if (t == last_token) - { - std::string error_msg = "parse error - unexpected "; - error_msg += (last_token == lexer::token_type::parse_error ? ("'" + m_lexer.get_token_string() + - "'") : - lexer::token_type_name(last_token)); - JSON_THROW(std::invalid_argument(error_msg)); - } - } - - private: - /// current level of recursion - int depth = 0; - /// callback function - const parser_callback_t callback = nullptr; - /// the type of the last read token - typename lexer::token_type last_token = lexer::token_type::uninitialized; - /// the lexer - lexer m_lexer; - }; - - public: - /*! - @brief JSON Pointer - - A JSON pointer defines a string syntax for identifying a specific value - within a JSON document. It can be used with functions `at` and - `operator[]`. Furthermore, JSON pointers are the base for JSON patches. - - @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) - - @since version 2.0.0 - */ - class json_pointer - { - /// allow basic_json to access private members - friend class basic_json; - - public: - /*! - @brief create JSON pointer - - Create a JSON pointer according to the syntax described in - [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3). - - @param[in] s string representing the JSON pointer; if omitted, the - empty string is assumed which references the whole JSON - value - - @throw std::domain_error if reference token is nonempty and does not - begin with a slash (`/`); example: `"JSON pointer must be empty or - begin with /"` - @throw std::domain_error if a tilde (`~`) is not followed by `0` - (representing `~`) or `1` (representing `/`); example: `"escape error: - ~ must be followed with 0 or 1"` - - @liveexample{The example shows the construction several valid JSON - pointers as well as the exceptional behavior.,json_pointer} - - @since version 2.0.0 - */ - explicit json_pointer(const std::string& s = "") - : reference_tokens(split(s)) - {} - - /*! - @brief return a string representation of the JSON pointer - - @invariant For each JSON pointer `ptr`, it holds: - @code {.cpp} - ptr == json_pointer(ptr.to_string()); - @endcode - - @return a string representation of the JSON pointer - - @liveexample{The example shows the result of `to_string`., - json_pointer__to_string} - - @since version 2.0.0 - */ - std::string to_string() const noexcept - { - return std::accumulate(reference_tokens.begin(), - reference_tokens.end(), std::string{}, - [](const std::string & a, const std::string & b) - { - return a + "/" + escape(b); - }); - } - - /// @copydoc to_string() - operator std::string() const - { - return to_string(); - } - - private: - /// remove and return last reference pointer - std::string pop_back() - { - if (is_root()) - { - JSON_THROW(std::domain_error("JSON pointer has no parent")); - } - - auto last = reference_tokens.back(); - reference_tokens.pop_back(); - return last; - } - - /// return whether pointer points to the root document - bool is_root() const - { - return reference_tokens.empty(); - } - - json_pointer top() const - { - if (is_root()) - { - JSON_THROW(std::domain_error("JSON pointer has no parent")); - } - - json_pointer result = *this; - result.reference_tokens = {reference_tokens[0]}; - return result; - } - - /*! - @brief create and return a reference to the pointed to value - - @complexity Linear in the number of reference tokens. - */ - reference get_and_create(reference j) const - { - pointer result = &j; - - // in case no reference tokens exist, return a reference to the - // JSON value j which will be overwritten by a primitive value - for (const auto& reference_token : reference_tokens) - { - switch (result->m_type) - { - case value_t::null: - { - if (reference_token == "0") - { - // start a new array if reference token is 0 - result = &result->operator[](0); - } - else - { - // start a new object otherwise - result = &result->operator[](reference_token); - } - break; - } - - case value_t::object: - { - // create an entry in the object - result = &result->operator[](reference_token); - break; - } - - case value_t::array: - { - // create an entry in the array - result = &result->operator[](static_cast(std::stoi(reference_token))); - break; - } - - /* - The following code is only reached if there exists a - reference token _and_ the current value is primitive. In - this case, we have an error situation, because primitive - values may only occur as single value; that is, with an - empty list of reference tokens. - */ - default: - { - JSON_THROW(std::domain_error("invalid value to unflatten")); - } - } - } - - return *result; - } - - /*! - @brief return a reference to the pointed to value - - @note This version does not throw if a value is not present, but tries - to create nested values instead. For instance, calling this function - with pointer `"/this/that"` on a null value is equivalent to calling - `operator[]("this").operator[]("that")` on that value, effectively - changing the null value to an object. - - @param[in] ptr a JSON value - - @return reference to the JSON value pointed to by the JSON pointer - - @complexity Linear in the length of the JSON pointer. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - */ - reference get_unchecked(pointer ptr) const - { - for (const auto& reference_token : reference_tokens) - { - // convert null values to arrays or objects before continuing - if (ptr->m_type == value_t::null) - { - // check if reference token is a number - const bool nums = std::all_of(reference_token.begin(), - reference_token.end(), - [](const char x) - { - return std::isdigit(x); - }); - - // change value to array for numbers or "-" or to object - // otherwise - if (nums or reference_token == "-") - { - *ptr = value_t::array; - } - else - { - *ptr = value_t::object; - } - } - - switch (ptr->m_type) - { - case value_t::object: - { - // use unchecked object access - ptr = &ptr->operator[](reference_token); - break; - } - - case value_t::array: - { - // error condition (cf. RFC 6901, Sect. 4) - if (reference_token.size() > 1 and reference_token[0] == '0') - { - JSON_THROW(std::domain_error("array index must not begin with '0'")); - } - - if (reference_token == "-") - { - // explicitly treat "-" as index beyond the end - ptr = &ptr->operator[](ptr->m_value.array->size()); - } - else - { - // convert array index to number; unchecked access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); - } - break; - } - - default: - { - JSON_THROW(std::out_of_range("unresolved reference token '" + reference_token + "'")); - } - } - } - - return *ptr; - } - - reference get_checked(pointer ptr) const - { - for (const auto& reference_token : reference_tokens) - { - switch (ptr->m_type) - { - case value_t::object: - { - // note: at performs range check - ptr = &ptr->at(reference_token); - break; - } - - case value_t::array: - { - if (reference_token == "-") - { - // "-" always fails the range check - JSON_THROW(std::out_of_range("array index '-' (" + - std::to_string(ptr->m_value.array->size()) + - ") is out of range")); - } - - // error condition (cf. RFC 6901, Sect. 4) - if (reference_token.size() > 1 and reference_token[0] == '0') - { - JSON_THROW(std::domain_error("array index must not begin with '0'")); - } - - // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); - break; - } - - default: - { - JSON_THROW(std::out_of_range("unresolved reference token '" + reference_token + "'")); - } - } - } - - return *ptr; - } - - /*! - @brief return a const reference to the pointed to value - - @param[in] ptr a JSON value - - @return const reference to the JSON value pointed to by the JSON - pointer - */ - const_reference get_unchecked(const_pointer ptr) const - { - for (const auto& reference_token : reference_tokens) - { - switch (ptr->m_type) - { - case value_t::object: - { - // use unchecked object access - ptr = &ptr->operator[](reference_token); - break; - } - - case value_t::array: - { - if (reference_token == "-") - { - // "-" cannot be used for const access - JSON_THROW(std::out_of_range("array index '-' (" + - std::to_string(ptr->m_value.array->size()) + - ") is out of range")); - } - - // error condition (cf. RFC 6901, Sect. 4) - if (reference_token.size() > 1 and reference_token[0] == '0') - { - JSON_THROW(std::domain_error("array index must not begin with '0'")); - } - - // use unchecked array access - ptr = &ptr->operator[](static_cast(std::stoi(reference_token))); - break; - } - - default: - { - JSON_THROW(std::out_of_range("unresolved reference token '" + reference_token + "'")); - } - } - } - - return *ptr; - } - - const_reference get_checked(const_pointer ptr) const - { - for (const auto& reference_token : reference_tokens) - { - switch (ptr->m_type) - { - case value_t::object: - { - // note: at performs range check - ptr = &ptr->at(reference_token); - break; - } - - case value_t::array: - { - if (reference_token == "-") - { - // "-" always fails the range check - JSON_THROW(std::out_of_range("array index '-' (" + - std::to_string(ptr->m_value.array->size()) + - ") is out of range")); - } - - // error condition (cf. RFC 6901, Sect. 4) - if (reference_token.size() > 1 and reference_token[0] == '0') - { - JSON_THROW(std::domain_error("array index must not begin with '0'")); - } - - // note: at performs range check - ptr = &ptr->at(static_cast(std::stoi(reference_token))); - break; - } - - default: - { - JSON_THROW(std::out_of_range("unresolved reference token '" + reference_token + "'")); - } - } - } - - return *ptr; - } - - /// split the string input to reference tokens - static std::vector split(const std::string& reference_string) - { - std::vector result; - - // special case: empty reference string -> no reference tokens - if (reference_string.empty()) - { - return result; - } - - // check if nonempty reference string begins with slash - if (reference_string[0] != '/') - { - JSON_THROW(std::domain_error("JSON pointer must be empty or begin with '/'")); - } - - // extract the reference tokens: - // - slash: position of the last read slash (or end of string) - // - start: position after the previous slash - for ( - // search for the first slash after the first character - size_t slash = reference_string.find_first_of('/', 1), - // set the beginning of the first reference token - start = 1; - // we can stop if start == string::npos+1 = 0 - start != 0; - // set the beginning of the next reference token - // (will eventually be 0 if slash == std::string::npos) - start = slash + 1, - // find next slash - slash = reference_string.find_first_of('/', start)) - { - // use the text between the beginning of the reference token - // (start) and the last slash (slash). - auto reference_token = reference_string.substr(start, slash - start); - - // check reference tokens are properly escaped - for (size_t pos = reference_token.find_first_of('~'); - pos != std::string::npos; - pos = reference_token.find_first_of('~', pos + 1)) - { - assert(reference_token[pos] == '~'); - - // ~ must be followed by 0 or 1 - if (pos == reference_token.size() - 1 or - (reference_token[pos + 1] != '0' and - reference_token[pos + 1] != '1')) - { - JSON_THROW(std::domain_error("escape error: '~' must be followed with '0' or '1'")); - } - } - - // finally, store the reference token - unescape(reference_token); - result.push_back(reference_token); - } - - return result; - } - - private: - /*! - @brief replace all occurrences of a substring by another string - - @param[in,out] s the string to manipulate; changed so that all - occurrences of @a f are replaced with @a t - @param[in] f the substring to replace with @a t - @param[in] t the string to replace @a f - - @pre The search string @a f must not be empty. - - @since version 2.0.0 - */ - static void replace_substring(std::string& s, - const std::string& f, - const std::string& t) - { - assert(not f.empty()); - - for ( - size_t pos = s.find(f); // find first occurrence of f - pos != std::string::npos; // make sure f was found - s.replace(pos, f.size(), t), // replace with t - pos = s.find(f, pos + t.size()) // find next occurrence of f - ); - } - - /// escape tilde and slash - static std::string escape(std::string s) - { - // escape "~"" to "~0" and "/" to "~1" - replace_substring(s, "~", "~0"); - replace_substring(s, "/", "~1"); - return s; - } - - /// unescape tilde and slash - static void unescape(std::string& s) - { - // first transform any occurrence of the sequence '~1' to '/' - replace_substring(s, "~1", "/"); - // then transform any occurrence of the sequence '~0' to '~' - replace_substring(s, "~0", "~"); - } - - /*! - @param[in] reference_string the reference string to the current value - @param[in] value the value to consider - @param[in,out] result the result object to insert values to - - @note Empty objects or arrays are flattened to `null`. - */ - static void flatten(const std::string& reference_string, - const basic_json& value, - basic_json& result) - { - switch (value.m_type) - { - case value_t::array: - { - if (value.m_value.array->empty()) - { - // flatten empty array as null - result[reference_string] = nullptr; - } - else - { - // iterate array and use index as reference string - for (size_t i = 0; i < value.m_value.array->size(); ++i) - { - flatten(reference_string + "/" + std::to_string(i), - value.m_value.array->operator[](i), result); - } - } - break; - } - - case value_t::object: - { - if (value.m_value.object->empty()) - { - // flatten empty object as null - result[reference_string] = nullptr; - } - else - { - // iterate object and use keys as reference string - for (const auto& element : *value.m_value.object) - { - flatten(reference_string + "/" + escape(element.first), - element.second, result); - } - } - break; - } - - default: - { - // add primitive value with its reference string - result[reference_string] = value; - break; - } - } - } - - /*! - @param[in] value flattened JSON - - @return unflattened JSON - */ - static basic_json unflatten(const basic_json& value) - { - if (not value.is_object()) - { - JSON_THROW(std::domain_error("only objects can be unflattened")); - } - - basic_json result; - - // iterate the JSON object values - for (const auto& element : *value.m_value.object) - { - if (not element.second.is_primitive()) - { - JSON_THROW(std::domain_error("values in object must be primitive")); - } - - // assign value to reference pointed to by JSON pointer; Note - // that if the JSON pointer is "" (i.e., points to the whole - // value), function get_and_create returns a reference to - // result itself. An assignment will then create a primitive - // value. - json_pointer(element.first).get_and_create(result) = element.second; - } - - return result; - } - - private: - friend bool operator==(json_pointer const& lhs, - json_pointer const& rhs) noexcept - { - return lhs.reference_tokens == rhs.reference_tokens; - } - - friend bool operator!=(json_pointer const& lhs, - json_pointer const& rhs) noexcept - { - return !(lhs == rhs); - } - - /// the reference tokens - std::vector reference_tokens {}; - }; - - ////////////////////////// - // JSON Pointer support // - ////////////////////////// - - /// @name JSON Pointer functions - /// @{ - - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to @ref operator[](const typename - object_t::key_type&), `null` values are created in arrays and objects if - necessary. - - In particular: - - If the JSON pointer points to an object key that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. - - If the JSON pointer points to an array index that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. All indices between the current maximum and the given - index are also filled with `null`. - - The special value `-` is treated as a synonym for the index past the - end. - - @param[in] ptr a JSON pointer - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer} - - @since version 2.0.0 - */ - reference operator[](const json_pointer& ptr) - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. The function does not change the JSON - value; no `null` values are created. In particular, the the special value - `-` yields an exception. - - @param[in] ptr JSON pointer to the desired element - - @return const reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} - - @since version 2.0.0 - */ - const_reference operator[](const json_pointer& ptr) const - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a reference to the element at with specified JSON pointer @a ptr, - with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer} - - @since version 2.0.0 - */ - reference at(const json_pointer& ptr) - { - return ptr.get_checked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a const reference to the element at with specified JSON pointer @a - ptr, with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw std::out_of_range if the JSON pointer can not be resolved - @throw std::domain_error if an array index begins with '0' - @throw std::invalid_argument if an array index was not a number - - @liveexample{The behavior is shown in the example.,at_json_pointer_const} - - @since version 2.0.0 - */ - const_reference at(const json_pointer& ptr) const - { - return ptr.get_checked(this); - } - - /*! - @brief return flattened JSON value - - The function creates a JSON object whose keys are JSON pointers (see [RFC - 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all - primitive. The original JSON value can be restored using the @ref - unflatten() function. - - @return an object that maps JSON pointers to primitive values - - @note Empty objects and arrays are flattened to `null` and will not be - reconstructed correctly by the @ref unflatten() function. - - @complexity Linear in the size the JSON value. - - @liveexample{The following code shows how a JSON object is flattened to an - object whose keys consist of JSON pointers.,flatten} - - @sa @ref unflatten() for the reverse function - - @since version 2.0.0 - */ - basic_json flatten() const - { - basic_json result(value_t::object); - json_pointer::flatten("", *this, result); - return result; - } - - /*! - @brief unflatten a previously flattened JSON value - - The function restores the arbitrary nesting of a JSON value that has been - flattened before using the @ref flatten() function. The JSON value must - meet certain constraints: - 1. The value must be an object. - 2. The keys must be JSON pointers (see - [RFC 6901](https://tools.ietf.org/html/rfc6901)) - 3. The mapped values must be primitive JSON types. - - @return the original JSON from a flattened version - - @note Empty objects and arrays are flattened by @ref flatten() to `null` - values and can not unflattened to their original type. Apart from - this example, for a JSON value `j`, the following is always true: - `j == j.flatten().unflatten()`. - - @complexity Linear in the size the JSON value. - - @liveexample{The following code shows how a flattened JSON object is - unflattened into the original nested JSON object.,unflatten} - - @sa @ref flatten() for the reverse function - - @since version 2.0.0 - */ - basic_json unflatten() const - { - return json_pointer::unflatten(*this); - } - - /// @} - - ////////////////////////// - // JSON Patch functions // - ////////////////////////// - - /// @name JSON Patch functions - /// @{ - - /*! - @brief applies a JSON patch - - [JSON Patch](http://jsonpatch.com) defines a JSON document structure for - expressing a sequence of operations to apply to a JSON) document. With - this function, a JSON Patch is applied to the current JSON value by - executing all operations from the patch. - - @param[in] json_patch JSON patch document - @return patched document - - @note The application of a patch is atomic: Either all operations succeed - and the patched document is returned or an exception is thrown. In - any case, the original value is not changed: the patch is applied - to a copy of the value. - - @throw std::out_of_range if a JSON pointer inside the patch could not - be resolved successfully in the current JSON value; example: `"key baz - not found"` - @throw invalid_argument if the JSON patch is malformed (e.g., mandatory - attributes are missing); example: `"operation add must have member path"` - - @complexity Linear in the size of the JSON value and the length of the - JSON patch. As usually only a fraction of the JSON value is affected by - the patch, the complexity can usually be neglected. - - @liveexample{The following code shows how a JSON patch is applied to a - value.,patch} - - @sa @ref diff -- create a JSON patch by comparing two JSON values - - @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) - @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901) - - @since version 2.0.0 - */ - basic_json patch(const basic_json& json_patch) const - { - // make a working copy to apply the patch to - basic_json result = *this; - - // the valid JSON Patch operations - enum class patch_operations {add, remove, replace, move, copy, test, invalid}; - - const auto get_op = [](const std::string op) - { - if (op == "add") - { - return patch_operations::add; - } - if (op == "remove") - { - return patch_operations::remove; - } - if (op == "replace") - { - return patch_operations::replace; - } - if (op == "move") - { - return patch_operations::move; - } - if (op == "copy") - { - return patch_operations::copy; - } - if (op == "test") - { - return patch_operations::test; - } - - return patch_operations::invalid; - }; - - // wrapper for "add" operation; add value at ptr - const auto operation_add = [&result](json_pointer & ptr, basic_json val) - { - // adding to the root of the target document means replacing it - if (ptr.is_root()) - { - result = val; - } - else - { - // make sure the top element of the pointer exists - json_pointer top_pointer = ptr.top(); - if (top_pointer != ptr) - { - result.at(top_pointer); - } - - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.pop_back(); - basic_json& parent = result[ptr]; - - switch (parent.m_type) - { - case value_t::null: - case value_t::object: - { - // use operator[] to add value - parent[last_path] = val; - break; - } - - case value_t::array: - { - if (last_path == "-") - { - // special case: append to back - parent.push_back(val); - } - else - { - const auto idx = std::stoi(last_path); - if (static_cast(idx) > parent.size()) - { - // avoid undefined behavior - JSON_THROW(std::out_of_range("array index " + std::to_string(idx) + " is out of range")); - } - else - { - // default case: insert add offset - parent.insert(parent.begin() + static_cast(idx), val); - } - } - break; - } - - default: - { - // if there exists a parent it cannot be primitive - assert(false); // LCOV_EXCL_LINE - } - } - } - }; - - // wrapper for "remove" operation; remove value at ptr - const auto operation_remove = [&result](json_pointer & ptr) - { - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.pop_back(); - basic_json& parent = result.at(ptr); - - // remove child - if (parent.is_object()) - { - // perform range check - auto it = parent.find(last_path); - if (it != parent.end()) - { - parent.erase(it); - } - else - { - JSON_THROW(std::out_of_range("key '" + last_path + "' not found")); - } - } - else if (parent.is_array()) - { - // note erase performs range check - parent.erase(static_cast(std::stoi(last_path))); - } - }; - - // type check - if (not json_patch.is_array()) - { - // a JSON patch must be an array of objects - JSON_THROW(std::invalid_argument("JSON patch must be an array of objects")); - } - - // iterate and apply the operations - for (const auto& val : json_patch) - { - // wrapper to get a value for an operation - const auto get_value = [&val](const std::string & op, - const std::string & member, - bool string_type) -> basic_json& - { - // find value - auto it = val.m_value.object->find(member); - - // context-sensitive error message - const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; - - // check if desired value is present - if (it == val.m_value.object->end()) - { - JSON_THROW(std::invalid_argument(error_msg + " must have member '" + member + "'")); - } - - // check if result is of type string - if (string_type and not it->second.is_string()) - { - JSON_THROW(std::invalid_argument(error_msg + " must have string member '" + member + "'")); - } - - // no error: return value - return it->second; - }; - - // type check - if (not val.is_object()) - { - JSON_THROW(std::invalid_argument("JSON patch must be an array of objects")); - } - - // collect mandatory members - const std::string op = get_value("op", "op", true); - const std::string path = get_value(op, "path", true); - json_pointer ptr(path); - - switch (get_op(op)) - { - case patch_operations::add: - { - operation_add(ptr, get_value("add", "value", false)); - break; - } - - case patch_operations::remove: - { - operation_remove(ptr); - break; - } - - case patch_operations::replace: - { - // the "path" location must exist - use at() - result.at(ptr) = get_value("replace", "value", false); - break; - } - - case patch_operations::move: - { - const std::string from_path = get_value("move", "from", true); - json_pointer from_ptr(from_path); - - // the "from" location must exist - use at() - basic_json v = result.at(from_ptr); - - // The move operation is functionally identical to a - // "remove" operation on the "from" location, followed - // immediately by an "add" operation at the target - // location with the value that was just removed. - operation_remove(from_ptr); - operation_add(ptr, v); - break; - } - - case patch_operations::copy: - { - const std::string from_path = get_value("copy", "from", true);; - const json_pointer from_ptr(from_path); - - // the "from" location must exist - use at() - result[ptr] = result.at(from_ptr); - break; - } - - case patch_operations::test: - { - bool success = false; - JSON_TRY - { - // check if "value" matches the one at "path" - // the "path" location must exist - use at() - success = (result.at(ptr) == get_value("test", "value", false)); - } - JSON_CATCH (std::out_of_range&) - { - // ignore out of range errors: success remains false - } - - // throw an exception if test fails - if (not success) - { - JSON_THROW(std::domain_error("unsuccessful: " + val.dump())); - } - - break; - } - - case patch_operations::invalid: - { - // op must be "add", "remove", "replace", "move", "copy", or - // "test" - JSON_THROW(std::invalid_argument("operation value '" + op + "' is invalid")); - } - } - } - - return result; - } - - /*! - @brief creates a diff as a JSON patch - - Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can - be changed into the value @a target by calling @ref patch function. - - @invariant For two JSON values @a source and @a target, the following code - yields always `true`: - @code {.cpp} - source.patch(diff(source, target)) == target; - @endcode - - @note Currently, only `remove`, `add`, and `replace` operations are - generated. - - @param[in] source JSON value to compare from - @param[in] target JSON value to compare against - @param[in] path helper value to create JSON pointers - - @return a JSON patch to convert the @a source to @a target - - @complexity Linear in the lengths of @a source and @a target. - - @liveexample{The following code shows how a JSON patch is created as a - diff for two JSON values.,diff} - - @sa @ref patch -- apply a JSON patch - - @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) - - @since version 2.0.0 - */ - static basic_json diff(const basic_json& source, - const basic_json& target, - const std::string& path = "") - { - // the patch - basic_json result(value_t::array); - - // if the values are the same, return empty patch - if (source == target) - { - return result; - } - - if (source.type() != target.type()) - { - // different types: replace value - result.push_back( - { - {"op", "replace"}, - {"path", path}, - {"value", target} - }); - } - else - { - switch (source.type()) - { - case value_t::array: - { - // first pass: traverse common elements - size_t i = 0; - while (i < source.size() and i < target.size()) - { - // recursive call to compare array values at index i - auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); - result.insert(result.end(), temp_diff.begin(), temp_diff.end()); - ++i; - } - - // i now reached the end of at least one array - // in a second pass, traverse the remaining elements - - // remove my remaining elements - const auto end_index = static_cast(result.size()); - while (i < source.size()) - { - // add operations in reverse order to avoid invalid - // indices - result.insert(result.begin() + end_index, object( - { - {"op", "remove"}, - {"path", path + "/" + std::to_string(i)} - })); - ++i; - } - - // add other remaining elements - while (i < target.size()) - { - result.push_back( - { - {"op", "add"}, - {"path", path + "/" + std::to_string(i)}, - {"value", target[i]} - }); - ++i; - } - - break; - } - - case value_t::object: - { - // first pass: traverse this object's elements - for (auto it = source.begin(); it != source.end(); ++it) - { - // escape the key name to be used in a JSON patch - const auto key = json_pointer::escape(it.key()); - - if (target.find(it.key()) != target.end()) - { - // recursive call to compare object values at key it - auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key); - result.insert(result.end(), temp_diff.begin(), temp_diff.end()); - } - else - { - // found a key that is not in o -> remove it - result.push_back(object( - { - {"op", "remove"}, - {"path", path + "/" + key} - })); - } - } - - // second pass: traverse other object's elements - for (auto it = target.begin(); it != target.end(); ++it) - { - if (source.find(it.key()) == source.end()) - { - // found a key that is not in this -> add it - const auto key = json_pointer::escape(it.key()); - result.push_back( - { - {"op", "add"}, - {"path", path + "/" + key}, - {"value", it.value()} - }); - } - } - - break; - } - - default: - { - // both primitive type: replace value - result.push_back( - { - {"op", "replace"}, - {"path", path}, - {"value", target} - }); - break; - } - } - } - - return result; - } - - /// @} -}; - -///////////// -// presets // -///////////// - -/*! -@brief default JSON class - -This type is the default specialization of the @ref basic_json class which -uses the standard template types. - -@since version 1.0.0 -*/ -using json = basic_json<>; -} // namespace nlohmann - - -/////////////////////// -// nonmember support // -/////////////////////// - -// specialization of std::swap, and std::hash -namespace std -{ -/*! -@brief exchanges the values of two JSON objects - -@since version 1.0.0 -*/ -template<> -inline void swap(nlohmann::json& j1, - nlohmann::json& j2) noexcept( - is_nothrow_move_constructible::value and - is_nothrow_move_assignable::value - ) -{ - j1.swap(j2); -} - -/// hash value for JSON objects -template<> -struct hash -{ - /*! - @brief return a hash value for a JSON object - - @since version 1.0.0 - */ - std::size_t operator()(const nlohmann::json& j) const - { - // a naive hashing via the string representation - const auto& h = hash(); - return h(j.dump()); - } -}; -} // namespace std - -/*! -@brief user-defined string literal for JSON values - -This operator implements a user-defined string literal for JSON objects. It -can be used by adding `"_json"` to a string literal and returns a JSON object -if no parse error occurred. - -@param[in] s a string representation of a JSON object -@param[in] n the length of string @a s -@return a JSON object - -@since version 1.0.0 -*/ -inline nlohmann::json operator "" _json(const char* s, std::size_t n) -{ - return nlohmann::json::parse(s, s + n); -} - -/*! -@brief user-defined string literal for JSON pointer - -This operator implements a user-defined string literal for JSON Pointers. It -can be used by adding `"_json_pointer"` to a string literal and returns a JSON pointer -object if no parse error occurred. - -@param[in] s a string representation of a JSON Pointer -@param[in] n the length of string @a s -@return a JSON pointer object - -@since version 2.0.0 -*/ -inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) -{ - return nlohmann::json::json_pointer(std::string(s, n)); -} - -// restore GCC/clang diagnostic settings -#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #pragma GCC diagnostic pop -#endif - -// clean up -#undef JSON_CATCH -#undef JSON_DEPRECATED -#undef JSON_THROW -#undef JSON_TRY - -#endif diff --git a/deps/stb/CMakeLists.txt b/deps/stb/CMakeLists.txt deleted file mode 100644 index 3d8ba4381..000000000 --- a/deps/stb/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Create a library for the viewer code -add_library( - stb - stb_impl.cpp -) - -target_include_directories(stb PUBLIC ".") - -set_target_properties(stb PROPERTIES POSITION_INDEPENDENT_CODE TRUE) diff --git a/deps/stb/stb_image.h b/deps/stb/stb_image.h deleted file mode 100755 index f0ce2c25e..000000000 --- a/deps/stb/stb_image.h +++ /dev/null @@ -1,7548 +0,0 @@ -/* stb_image - v2.22 - public domain image loader - http://nothings.org/stb - no warranty implied; use at your own risk - - Do this: - #define STB_IMAGE_IMPLEMENTATION - before you include this file in *one* C or C++ file to create the implementation. - - // i.e. it should look like this: - #include ... - #include ... - #include ... - #define STB_IMAGE_IMPLEMENTATION - #include "stb_image.h" - - You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. - And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free - - - QUICK NOTES: - Primarily of interest to game developers and other people who can - avoid problematic images and only need the trivial interface - - JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) - PNG 1/2/4/8/16-bit-per-channel - - TGA (not sure what subset, if a subset) - BMP non-1bpp, non-RLE - PSD (composited view only, no extra channels, 8/16 bit-per-channel) - - GIF (*comp always reports as 4-channel) - HDR (radiance rgbE format) - PIC (Softimage PIC) - PNM (PPM and PGM binary only) - - Animated GIF still needs a proper API, but here's one way to do it: - http://gist.github.com/urraka/685d9a6340b26b830d49 - - - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - - decode from arbitrary I/O callbacks - - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) - - Full documentation under "DOCUMENTATION" below. - - -LICENSE - - See end of file for license information. - -RECENT REVISION HISTORY: - - 2.22 (2019-03-04) gif fixes, fix warnings - 2.21 (2019-02-25) fix typo in comment - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings - 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes - 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 - RGB-format JPEG; remove white matting in PSD; - allocate large structures on the stack; - correct channel count for PNG & BMP - 2.10 (2016-01-22) avoid warning introduced in 2.09 - 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED - - See end of file for full revision history. - - - ============================ Contributors ========================= - - Image formats Extensions, features - Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) - Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) - Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) - Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) - Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) - Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) - Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) - github:urraka (animated gif) Junggon Kim (PNM comments) - Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) - socks-the-fox (16-bit PNG) - Jeremy Sawicki (handle all ImageNet JPGs) - Optimizations & bugfixes Mikhail Morozov (1-bit BMP) - Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) - Arseny Kapoulkine - John-Mark Allen - Carmelo J Fdez-Aguera - - Bug & warning fixes - Marc LeBlanc David Woo Guillaume George Martins Mozeiko - Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan - Dave Moore Roy Eltham Hayaki Saito Nathan Reed - Won Chun Luke Graham Johan Duparc Nick Verigakis - the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh - Janez Zemva John Bartholomew Michal Cichon github:romigrou - Jonathan Blow Ken Hamada Tero Hanninen github:svdijk - Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar - Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex - Ryamond Barbiero Paul Du Bois Engin Manap github:grim210 - Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw - Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus - Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo - Christian Floisand Kevin Schmidt JR Smith github:darealshinji - Blazej Dariusz Roszkowski github:Michaelangel007 -*/ - -#ifndef STBI_INCLUDE_STB_IMAGE_H -#define STBI_INCLUDE_STB_IMAGE_H - -// DOCUMENTATION -// -// Limitations: -// - no 12-bit-per-channel JPEG -// - no JPEGs with arithmetic coding -// - GIF always returns *comp=4 -// -// Basic usage (see HDR discussion below for HDR usage): -// int x,y,n; -// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); -// // ... process data if not NULL ... -// // ... x = width, y = height, n = # 8-bit components per pixel ... -// // ... replace '0' with '1'..'4' to force that many components per pixel -// // ... but 'n' will always be the number that it would have been if you said 0 -// stbi_image_free(data) -// -// Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *channels_in_file -- outputs # of image components in image file -// int desired_channels -- if non-zero, # of image components requested in result -// -// The return value from an image loader is an 'unsigned char *' which points -// to the pixel data, or NULL on an allocation failure or if the image is -// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, -// with each pixel consisting of N interleaved 8-bit components; the first -// pixel pointed to is top-left-most in the image. There is no padding between -// image scanlines or between pixels, regardless of format. The number of -// components N is 'desired_channels' if desired_channels is non-zero, or -// *channels_in_file otherwise. If desired_channels is non-zero, -// *channels_in_file has the number of components that _would_ have been -// output otherwise. E.g. if you set desired_channels to 4, you will always -// get RGBA output, but you can check *channels_in_file to see if it's trivially -// opaque because e.g. there were only 3 channels in the source image. -// -// An output image with N components has the following components interleaved -// in this order in each pixel: -// -// N=#comp components -// 1 grey -// 2 grey, alpha -// 3 red, green, blue -// 4 red, green, blue, alpha -// -// If image loading fails for any reason, the return value will be NULL, -// and *x, *y, *channels_in_file will be unchanged. The function -// stbi_failure_reason() can be queried for an extremely brief, end-user -// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS -// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly -// more user-friendly ones. -// -// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. -// -// =========================================================================== -// -// UNICODE: -// -// If compiling for Windows and you wish to use Unicode filenames, compile -// with -// #define STBI_WINDOWS_UTF8 -// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert -// Windows wchar_t filenames to utf8. -// -// =========================================================================== -// -// Philosophy -// -// stb libraries are designed with the following priorities: -// -// 1. easy to use -// 2. easy to maintain -// 3. good performance -// -// Sometimes I let "good performance" creep up in priority over "easy to maintain", -// and for best performance I may provide less-easy-to-use APIs that give higher -// performance, in addition to the easy-to-use ones. Nevertheless, it's important -// to keep in mind that from the standpoint of you, a client of this library, -// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. -// -// Some secondary priorities arise directly from the first two, some of which -// provide more explicit reasons why performance can't be emphasized. -// -// - Portable ("ease of use") -// - Small source code footprint ("easy to maintain") -// - No dependencies ("ease of use") -// -// =========================================================================== -// -// I/O callbacks -// -// I/O callbacks allow you to read from arbitrary sources, like packaged -// files or some other source. Data read from callbacks are processed -// through a small internal buffer (currently 128 bytes) to try to reduce -// overhead. -// -// The three functions you must define are "read" (reads some bytes of data), -// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). -// -// =========================================================================== -// -// SIMD support -// -// The JPEG decoder will try to automatically use SIMD kernels on x86 when -// supported by the compiler. For ARM Neon support, you must explicitly -// request it. -// -// (The old do-it-yourself SIMD API is no longer supported in the current -// code.) -// -// On x86, SSE2 will automatically be used when available based on a run-time -// test; if not, the generic C versions are used as a fall-back. On ARM targets, -// the typical path is to have separate builds for NEON and non-NEON devices -// (at least this is true for iOS and Android). Therefore, the NEON support is -// toggled by a build flag: define STBI_NEON to get NEON loops. -// -// If for some reason you do not want to use any of SIMD code, or if -// you have issues compiling it, you can disable it entirely by -// defining STBI_NO_SIMD. -// -// =========================================================================== -// -// HDR image support (disable by defining STBI_NO_HDR) -// -// stb_image supports loading HDR images in general, and currently the Radiance -// .HDR file format specifically. You can still load any file through the existing -// interface; if you attempt to load an HDR file, it will be automatically remapped -// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; -// both of these constants can be reconfigured through this interface: -// -// stbi_hdr_to_ldr_gamma(2.2f); -// stbi_hdr_to_ldr_scale(1.0f); -// -// (note, do not use _inverse_ constants; stbi_image will invert them -// appropriately). -// -// Additionally, there is a new, parallel interface for loading files as -// (linear) floats to preserve the full dynamic range: -// -// float *data = stbi_loadf(filename, &x, &y, &n, 0); -// -// If you load LDR images through this interface, those images will -// be promoted to floating point values, run through the inverse of -// constants corresponding to the above: -// -// stbi_ldr_to_hdr_scale(1.0f); -// stbi_ldr_to_hdr_gamma(2.2f); -// -// Finally, given a filename (or an open file or memory block--see header -// file for details) containing image data, you can query for the "most -// appropriate" interface to use (that is, whether the image is HDR or -// not), using: -// -// stbi_is_hdr(char *filename); -// -// =========================================================================== -// -// iPhone PNG support: -// -// By default we convert iphone-formatted PNGs back to RGB, even though -// they are internally encoded differently. You can disable this conversion -// by calling stbi_convert_iphone_png_to_rgb(0), in which case -// you will always just get the native iphone "format" through (which -// is BGR stored in RGB). -// -// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per -// pixel to remove any premultiplied alpha *only* if the image file explicitly -// says there's premultiplied data (currently only happens in iPhone images, -// and only if iPhone convert-to-rgb processing is on). -// -// =========================================================================== -// -// ADDITIONAL CONFIGURATION -// -// - You can suppress implementation of any of the decoders to reduce -// your code footprint by #defining one or more of the following -// symbols before creating the implementation. -// -// STBI_NO_JPEG -// STBI_NO_PNG -// STBI_NO_BMP -// STBI_NO_PSD -// STBI_NO_TGA -// STBI_NO_GIF -// STBI_NO_HDR -// STBI_NO_PIC -// STBI_NO_PNM (.ppm and .pgm) -// -// - You can request *only* certain decoders and suppress all other ones -// (this will be more forward-compatible, as addition of new decoders -// doesn't require you to disable them explicitly): -// -// STBI_ONLY_JPEG -// STBI_ONLY_PNG -// STBI_ONLY_BMP -// STBI_ONLY_PSD -// STBI_ONLY_TGA -// STBI_ONLY_GIF -// STBI_ONLY_HDR -// STBI_ONLY_PIC -// STBI_ONLY_PNM (.ppm and .pgm) -// -// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still -// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB -// - - -#ifndef STBI_NO_STDIO -#include -#endif // STBI_NO_STDIO - -#define STBI_VERSION 1 - -enum -{ - STBI_default = 0, // only used for desired_channels - - STBI_grey = 1, - STBI_grey_alpha = 2, - STBI_rgb = 3, - STBI_rgb_alpha = 4 -}; - -#include -typedef unsigned char stbi_uc; -typedef unsigned short stbi_us; - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef STBIDEF -#ifdef STB_IMAGE_STATIC -#define STBIDEF static -#else -#define STBIDEF extern -#endif -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// PRIMARY API - works on images of any type -// - -// -// load image by filename, open file, or memory buffer -// - -typedef struct -{ - int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read - void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative - int (*eof) (void *user); // returns nonzero if we are at end of file/data -} stbi_io_callbacks; - -//////////////////////////////////// -// -// 8-bits-per-channel interface -// - -STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -// for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -#endif - -#ifdef STBI_WINDOWS_UTF8 -STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -#endif - -//////////////////////////////////// -// -// 16-bits-per-channel interface -// - -STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -#endif - -//////////////////////////////////// -// -// float-per-channel interface -// -#ifndef STBI_NO_LINEAR - STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - - #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); - #endif -#endif - -#ifndef STBI_NO_HDR - STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); - STBIDEF void stbi_hdr_to_ldr_scale(float scale); -#endif // STBI_NO_HDR - -#ifndef STBI_NO_LINEAR - STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); - STBIDEF void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_LINEAR - -// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename); -STBIDEF int stbi_is_hdr_from_file(FILE *f); -#endif // STBI_NO_STDIO - - -// get a VERY brief reason for failure -// NOT THREADSAFE -STBIDEF const char *stbi_failure_reason (void); - -// free the loaded image -- this is just free() -STBIDEF void stbi_image_free (void *retval_from_stbi_load); - -// get image dimensions & components without fully decoding -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); -STBIDEF int stbi_is_16_bit (char const *filename); -STBIDEF int stbi_is_16_bit_from_file(FILE *f); -#endif - - - -// for image formats that explicitly notate that they have premultiplied alpha, -// we just return the colors as stored in the file. set this flag to force -// unpremultiplication. results are undefined if the unpremultiply overflow. -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); - -// indicate whether we should process iphone images back to canonical format, -// or just pass them through "as-is" -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); - -// flip the image vertically, so the first pixel in the output array is the bottom left -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); - -// ZLIB client - used by PNG, available for other purposes - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); -STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - -STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - - -#ifdef __cplusplus -} -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // STBI_INCLUDE_STB_IMAGE_H - -#ifdef STB_IMAGE_IMPLEMENTATION - -#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ - || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ - || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ - || defined(STBI_ONLY_ZLIB) - #ifndef STBI_ONLY_JPEG - #define STBI_NO_JPEG - #endif - #ifndef STBI_ONLY_PNG - #define STBI_NO_PNG - #endif - #ifndef STBI_ONLY_BMP - #define STBI_NO_BMP - #endif - #ifndef STBI_ONLY_PSD - #define STBI_NO_PSD - #endif - #ifndef STBI_ONLY_TGA - #define STBI_NO_TGA - #endif - #ifndef STBI_ONLY_GIF - #define STBI_NO_GIF - #endif - #ifndef STBI_ONLY_HDR - #define STBI_NO_HDR - #endif - #ifndef STBI_ONLY_PIC - #define STBI_NO_PIC - #endif - #ifndef STBI_ONLY_PNM - #define STBI_NO_PNM - #endif -#endif - -#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) -#define STBI_NO_ZLIB -#endif - - -#include -#include // ptrdiff_t on osx -#include -#include -#include - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include // ldexp, pow -#endif - -#ifndef STBI_NO_STDIO -#include -#endif - -#ifndef STBI_ASSERT -#include -#define STBI_ASSERT(x) assert(x) -#endif - -#ifdef __cplusplus -#define STBI_EXTERN extern "C" -#else -#define STBI_EXTERN extern -#endif - - -#ifndef _MSC_VER - #ifdef __cplusplus - #define stbi_inline inline - #else - #define stbi_inline - #endif -#else - #define stbi_inline __forceinline -#endif - - -#ifdef _MSC_VER -typedef unsigned short stbi__uint16; -typedef signed short stbi__int16; -typedef unsigned int stbi__uint32; -typedef signed int stbi__int32; -#else -#include -typedef uint16_t stbi__uint16; -typedef int16_t stbi__int16; -typedef uint32_t stbi__uint32; -typedef int32_t stbi__int32; -#endif - -// should produce compiler error if size is wrong -typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; - -#ifdef _MSC_VER -#define STBI_NOTUSED(v) (void)(v) -#else -#define STBI_NOTUSED(v) (void)sizeof(v) -#endif - -#ifdef _MSC_VER -#define STBI_HAS_LROTL -#endif - -#ifdef STBI_HAS_LROTL - #define stbi_lrot(x,y) _lrotl(x,y) -#else - #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) -#endif - -#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) -// ok -#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." -#endif - -#ifndef STBI_MALLOC -#define STBI_MALLOC(sz) malloc(sz) -#define STBI_REALLOC(p,newsz) realloc(p,newsz) -#define STBI_FREE(p) free(p) -#endif - -#ifndef STBI_REALLOC_SIZED -#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) -#endif - -// x86/x64 detection -#if defined(__x86_64__) || defined(_M_X64) -#define STBI__X64_TARGET -#elif defined(__i386) || defined(_M_IX86) -#define STBI__X86_TARGET -#endif - -#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// which in turn means it gets to use SSE2 everywhere. This is unfortunate, -// but previous attempts to provide the SSE2 functions with runtime -// detection caused numerous issues. The way architecture extensions are -// exposed in GCC/Clang is, sadly, not really suited for one-file libs. -// New behavior: if compiled with -msse2, we use SSE2 without any -// detection; if not, we don't use it at all. -#define STBI_NO_SIMD -#endif - -#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) -// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET -// -// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the -// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. -// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not -// simultaneously enabling "-mstackrealign". -// -// See https://github.com/nothings/stb/issues/81 for more information. -// -// So default to no SSE2 on 32-bit MinGW. If you've read this far and added -// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. -#define STBI_NO_SIMD -#endif - -#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) -#define STBI_SSE2 -#include - -#ifdef _MSC_VER - -#if _MSC_VER >= 1400 // not VC6 -#include // __cpuid -static int stbi__cpuid3(void) -{ - int info[4]; - __cpuid(info,1); - return info[3]; -} -#else -static int stbi__cpuid3(void) -{ - int res; - __asm { - mov eax,1 - cpuid - mov res,edx - } - return res; -} -#endif - -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - int info3 = stbi__cpuid3(); - return ((info3 >> 26) & 1) != 0; -} -#endif - -#else // assume GCC-style if not VC++ -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) - -#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) -static int stbi__sse2_available(void) -{ - // If we're even attempting to compile this on GCC/Clang, that means - // -msse2 is on, which means the compiler is allowed to use SSE2 - // instructions at will, and so are we. - return 1; -} -#endif - -#endif -#endif - -// ARM NEON -#if defined(STBI_NO_SIMD) && defined(STBI_NEON) -#undef STBI_NEON -#endif - -#ifdef STBI_NEON -#include -// assume GCC or Clang on ARM targets -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -#endif - -#ifndef STBI_SIMD_ALIGN -#define STBI_SIMD_ALIGN(type, name) type name -#endif - -/////////////////////////////////////////////// -// -// stbi__context struct and start_xxx functions - -// stbi__context structure is our basic context used by all images, so it -// contains all the IO context, plus some basic image information -typedef struct -{ - stbi__uint32 img_x, img_y; - int img_n, img_out_n; - - stbi_io_callbacks io; - void *io_user_data; - - int read_from_callbacks; - int buflen; - stbi_uc buffer_start[128]; - - stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original, *img_buffer_original_end; -} stbi__context; - - -static void stbi__refill_buffer(stbi__context *s); - -// initialize a memory-decode context -static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) -{ - s->io.read = NULL; - s->read_from_callbacks = 0; - s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; -} - -// initialize a callback-based context -static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) -{ - s->io = *c; - s->io_user_data = user; - s->buflen = sizeof(s->buffer_start); - s->read_from_callbacks = 1; - s->img_buffer_original = s->buffer_start; - stbi__refill_buffer(s); - s->img_buffer_original_end = s->img_buffer_end; -} - -#ifndef STBI_NO_STDIO - -static int stbi__stdio_read(void *user, char *data, int size) -{ - return (int) fread(data,1,size,(FILE*) user); -} - -static void stbi__stdio_skip(void *user, int n) -{ - fseek((FILE*) user, n, SEEK_CUR); -} - -static int stbi__stdio_eof(void *user) -{ - return feof((FILE*) user); -} - -static stbi_io_callbacks stbi__stdio_callbacks = -{ - stbi__stdio_read, - stbi__stdio_skip, - stbi__stdio_eof, -}; - -static void stbi__start_file(stbi__context *s, FILE *f) -{ - stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); -} - -//static void stop_file(stbi__context *s) { } - -#endif // !STBI_NO_STDIO - -static void stbi__rewind(stbi__context *s) -{ - // conceptually rewind SHOULD rewind to the beginning of the stream, - // but we just rewind to the beginning of the initial buffer, because - // we only use it after doing 'test', which only ever looks at at most 92 bytes - s->img_buffer = s->img_buffer_original; - s->img_buffer_end = s->img_buffer_original_end; -} - -enum -{ - STBI_ORDER_RGB, - STBI_ORDER_BGR -}; - -typedef struct -{ - int bits_per_channel; - int num_channels; - int channel_order; -} stbi__result_info; - -#ifndef STBI_NO_JPEG -static int stbi__jpeg_test(stbi__context *s); -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNG -static int stbi__png_test(stbi__context *s); -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__png_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_BMP -static int stbi__bmp_test(stbi__context *s); -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_TGA -static int stbi__tga_test(stbi__context *s); -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s); -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); -static int stbi__psd_is16(stbi__context *s); -#endif - -#ifndef STBI_NO_HDR -static int stbi__hdr_test(stbi__context *s); -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_test(stbi__context *s); -static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_GIF -static int stbi__gif_test(stbi__context *s); -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNM -static int stbi__pnm_test(stbi__context *s); -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -// this is not threadsafe -static const char *stbi__g_failure_reason; - -STBIDEF const char *stbi_failure_reason(void) -{ - return stbi__g_failure_reason; -} - -static int stbi__err(const char *str) -{ - stbi__g_failure_reason = str; - return 0; -} - -static void *stbi__malloc(size_t size) -{ - return STBI_MALLOC(size); -} - -// stb_image uses ints pervasively, including for offset calculations. -// therefore the largest decoded image size we can support with the -// current code, even on 64-bit targets, is INT_MAX. this is not a -// significant limitation for the intended use case. -// -// we do, however, need to make sure our size calculations don't -// overflow. hence a few helper functions for size calculations that -// multiply integers together, making sure that they're non-negative -// and no overflow occurs. - -// return 1 if the sum is valid, 0 on overflow. -// negative terms are considered invalid. -static int stbi__addsizes_valid(int a, int b) -{ - if (b < 0) return 0; - // now 0 <= b <= INT_MAX, hence also - // 0 <= INT_MAX - b <= INTMAX. - // And "a + b <= INT_MAX" (which might overflow) is the - // same as a <= INT_MAX - b (no overflow) - return a <= INT_MAX - b; -} - -// returns 1 if the product is valid, 0 on overflow. -// negative factors are considered invalid. -static int stbi__mul2sizes_valid(int a, int b) -{ - if (a < 0 || b < 0) return 0; - if (b == 0) return 1; // mul-by-0 is always safe - // portable way to check for no overflows in a*b - return a <= INT_MAX/b; -} - -// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow -static int stbi__mad2sizes_valid(int a, int b, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); -} - -// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow -static int stbi__mad3sizes_valid(int a, int b, int c, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__addsizes_valid(a*b*c, add); -} - -// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); -} -#endif - -// mallocs with size overflow checking -static void *stbi__malloc_mad2(int a, int b, int add) -{ - if (!stbi__mad2sizes_valid(a, b, add)) return NULL; - return stbi__malloc(a*b + add); -} - -static void *stbi__malloc_mad3(int a, int b, int c, int add) -{ - if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; - return stbi__malloc(a*b*c + add); -} - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) -{ - if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; - return stbi__malloc(a*b*c*d + add); -} -#endif - -// stbi__err - error -// stbi__errpf - error returning pointer to float -// stbi__errpuc - error returning pointer to unsigned char - -#ifdef STBI_NO_FAILURE_STRINGS - #define stbi__err(x,y) 0 -#elif defined(STBI_FAILURE_USERMSG) - #define stbi__err(x,y) stbi__err(y) -#else - #define stbi__err(x,y) stbi__err(x) -#endif - -#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) -#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) - -STBIDEF void stbi_image_free(void *retval_from_stbi_load) -{ - STBI_FREE(retval_from_stbi_load); -} - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); -#endif - -#ifndef STBI_NO_HDR -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); -#endif - -static int stbi__vertically_flip_on_load = 0; - -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) -{ - stbi__vertically_flip_on_load = flag_true_if_should_flip; -} - -static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields - ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed - ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order - ri->num_channels = 0; - - #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_GIF - if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); - #endif - #ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); - return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } - #endif - - #ifndef STBI_NO_TGA - // test tga last because it's a crappy test! - if (stbi__tga_test(s)) - return stbi__tga_load(s,x,y,comp,req_comp, ri); - #endif - - return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); -} - -static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi_uc *reduced; - - reduced = (stbi_uc *) stbi__malloc(img_len); - if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling - - STBI_FREE(orig); - return reduced; -} - -static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi__uint16 *enlarged; - - enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); - if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff - - STBI_FREE(orig); - return enlarged; -} - -static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) -{ - int row; - size_t bytes_per_row = (size_t)w * bytes_per_pixel; - stbi_uc temp[2048]; - stbi_uc *bytes = (stbi_uc *)image; - - for (row = 0; row < (h>>1); row++) { - stbi_uc *row0 = bytes + row*bytes_per_row; - stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; - // swap row0 with row1 - size_t bytes_left = bytes_per_row; - while (bytes_left) { - size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); - memcpy(temp, row0, bytes_copy); - memcpy(row0, row1, bytes_copy); - memcpy(row1, temp, bytes_copy); - row0 += bytes_copy; - row1 += bytes_copy; - bytes_left -= bytes_copy; - } - } -} - -#ifndef STBI_NO_GIF -static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) -{ - int slice; - int slice_size = w * h * bytes_per_pixel; - - stbi_uc *bytes = (stbi_uc *)image; - for (slice = 0; slice < z; ++slice) { - stbi__vertical_flip(bytes, w, h, bytes_per_pixel); - bytes += slice_size; - } -} -#endif - -static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); - - if (result == NULL) - return NULL; - - if (ri.bits_per_channel != 8) { - STBI_ASSERT(ri.bits_per_channel == 16); - result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 8; - } - - // @TODO: move stbi__convert_format to here - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); - } - - return (unsigned char *) result; -} - -static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); - - if (result == NULL) - return NULL; - - if (ri.bits_per_channel != 16) { - STBI_ASSERT(ri.bits_per_channel == 8); - result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 16; - } - - // @TODO: move stbi__convert_format16 to here - // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); - } - - return (stbi__uint16 *) result; -} - -#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) -static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) -{ - if (stbi__vertically_flip_on_load && result != NULL) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); - } -} -#endif - -#ifndef STBI_NO_STDIO - -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) -STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); -#endif - -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) -STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -{ - return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -} -#endif - -static FILE *stbi__fopen(char const *filename, char const *mode) -{ - FILE *f; -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode))) - return 0; - -#if _MSC_VER >= 1400 - if (0 != _wfopen_s(&f, wFilename, wMode)) - f = 0; -#else - f = _wfopen(wFilename, wMode); -#endif - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; -#else - f = fopen(filename, mode); -#endif - return f; -} - - -STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - unsigned char *result; - if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__uint16 *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - stbi__uint16 *result; - if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file_16(f,x,y,comp,req_comp); - fclose(f); - return result; -} - - -#endif //!STBI_NO_STDIO - -STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_GIF -STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_mem(&s,buffer,len); - - result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); - if (stbi__vertically_flip_on_load) { - stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); - } - - return result; -} -#endif - -#ifndef STBI_NO_LINEAR -static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - stbi__result_info ri; - float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); - if (hdr_data) - stbi__float_postprocess(hdr_data,x,y,comp,req_comp); - return hdr_data; - } - #endif - data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); - if (data) - return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); -} - -STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_STDIO -STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - float *result; - FILE *f = stbi__fopen(filename, "rb"); - if (!f) return stbi__errpf("can't fopen", "Unable to open file"); - result = stbi_loadf_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_file(&s,f); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} -#endif // !STBI_NO_STDIO - -#endif // !STBI_NO_LINEAR - -// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is -// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always -// reports false! - -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(buffer); - STBI_NOTUSED(len); - return 0; - #endif -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result=0; - if (f) { - result = stbi_is_hdr_from_file(f); - fclose(f); - } - return result; -} - -STBIDEF int stbi_is_hdr_from_file(FILE *f) -{ - #ifndef STBI_NO_HDR - long pos = ftell(f); - int res; - stbi__context s; - stbi__start_file(&s,f); - res = stbi__hdr_test(&s); - fseek(f, pos, SEEK_SET); - return res; - #else - STBI_NOTUSED(f); - return 0; - #endif -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(clbk); - STBI_NOTUSED(user); - return 0; - #endif -} - -#ifndef STBI_NO_LINEAR -static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; - -STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } -STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } -#endif - -static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; - -STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } -STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } - - -////////////////////////////////////////////////////////////////////////////// -// -// Common code used by all image loaders -// - -enum -{ - STBI__SCAN_load=0, - STBI__SCAN_type, - STBI__SCAN_header -}; - -static void stbi__refill_buffer(stbi__context *s) -{ - int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); - if (n == 0) { - // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file - s->read_from_callbacks = 0; - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start+1; - *s->img_buffer = 0; - } else { - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start + n; - } -} - -stbi_inline static stbi_uc stbi__get8(stbi__context *s) -{ - if (s->img_buffer < s->img_buffer_end) - return *s->img_buffer++; - if (s->read_from_callbacks) { - stbi__refill_buffer(s); - return *s->img_buffer++; - } - return 0; -} - -stbi_inline static int stbi__at_eof(stbi__context *s) -{ - if (s->io.read) { - if (!(s->io.eof)(s->io_user_data)) return 0; - // if feof() is true, check if buffer = end - // special case: we've only got the special 0 character at the end - if (s->read_from_callbacks == 0) return 1; - } - - return s->img_buffer >= s->img_buffer_end; -} - -static void stbi__skip(stbi__context *s, int n) -{ - if (n < 0) { - s->img_buffer = s->img_buffer_end; - return; - } - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - s->img_buffer = s->img_buffer_end; - (s->io.skip)(s->io_user_data, n - blen); - return; - } - } - s->img_buffer += n; -} - -static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) -{ - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - int res, count; - - memcpy(buffer, s->img_buffer, blen); - - count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); - res = (count == (n-blen)); - s->img_buffer = s->img_buffer_end; - return res; - } - } - - if (s->img_buffer+n <= s->img_buffer_end) { - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; - return 1; - } else - return 0; -} - -static int stbi__get16be(stbi__context *s) -{ - int z = stbi__get8(s); - return (z << 8) + stbi__get8(s); -} - -static stbi__uint32 stbi__get32be(stbi__context *s) -{ - stbi__uint32 z = stbi__get16be(s); - return (z << 16) + stbi__get16be(s); -} - -#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) -// nothing -#else -static int stbi__get16le(stbi__context *s) -{ - int z = stbi__get8(s); - return z + (stbi__get8(s) << 8); -} -#endif - -#ifndef STBI_NO_BMP -static stbi__uint32 stbi__get32le(stbi__context *s) -{ - stbi__uint32 z = stbi__get16le(s); - return z + (stbi__get16le(s) << 16); -} -#endif - -#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings - - -////////////////////////////////////////////////////////////////////////////// -// -// generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (e.g. jpeg -// does all cases internally since it needs to colorspace convert anyway, -// and it never has alpha, so very few cases ). png can automatically -// interleave an alpha=255 channel, but falls back to this for other cases -// -// assume data buffer is malloced, so malloc a new one and free that one -// only failure mode is malloc failing - -static stbi_uc stbi__compute_y(int r, int g, int b) -{ - return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); -} - -static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - unsigned char *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); - if (good == NULL) { - STBI_FREE(data); - return stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - unsigned char *src = data + j * x * img_n ; - unsigned char *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} - -static stbi__uint16 stbi__compute_y_16(int r, int g, int b) -{ - return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); -} - -static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - stbi__uint16 *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); - if (good == NULL) { - STBI_FREE(data); - return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - stbi__uint16 *src = data + j * x * img_n ; - stbi__uint16 *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; - default: STBI_ASSERT(0); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) -{ - int i,k,n; - float *output; - if (!data) return NULL; - output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); - } - } - if (n < comp) { - for (i=0; i < x*y; ++i) { - output[i*comp + n] = data[i*comp + n]/255.0f; - } - } - STBI_FREE(data); - return output; -} -#endif - -#ifndef STBI_NO_HDR -#define stbi__float2int(x) ((int) (x)) -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) -{ - int i,k,n; - stbi_uc *output; - if (!data) return NULL; - output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - if (k < comp) { - float z = data[i*comp+k] * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - } - STBI_FREE(data); - return output; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// "baseline" JPEG/JFIF decoder -// -// simple implementation -// - doesn't support delayed output of y-dimension -// - simple interface (only one output format: 8-bit interleaved RGB) -// - doesn't try to recover corrupt jpegs -// - doesn't allow partial loading, loading multiple at once -// - still fast on x86 (copying globals into locals doesn't help x86) -// - allocates lots of intermediate memory (full size of all components) -// - non-interleaved case requires this anyway -// - allows good upsampling (see next) -// high-quality -// - upsampled channels are bilinearly interpolated, even across blocks -// - quality integer IDCT derived from IJG's 'slow' -// performance -// - fast huffman; reasonable integer IDCT -// - some SIMD kernels for common paths on targets with SSE2/NEON -// - uses a lot of intermediate memory, could cache poorly - -#ifndef STBI_NO_JPEG - -// huffman decoding acceleration -#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache - -typedef struct -{ - stbi_uc fast[1 << FAST_BITS]; - // weirdly, repacking this into AoS is a 10% speed loss, instead of a win - stbi__uint16 code[256]; - stbi_uc values[256]; - stbi_uc size[257]; - unsigned int maxcode[18]; - int delta[17]; // old 'firstsymbol' - old 'firstcode' -} stbi__huffman; - -typedef struct -{ - stbi__context *s; - stbi__huffman huff_dc[4]; - stbi__huffman huff_ac[4]; - stbi__uint16 dequant[4][64]; - stbi__int16 fast_ac[4][1 << FAST_BITS]; - -// sizes for components, interleaved MCUs - int img_h_max, img_v_max; - int img_mcu_x, img_mcu_y; - int img_mcu_w, img_mcu_h; - -// definition of jpeg image component - struct - { - int id; - int h,v; - int tq; - int hd,ha; - int dc_pred; - - int x,y,w2,h2; - stbi_uc *data; - void *raw_data, *raw_coeff; - stbi_uc *linebuf; - short *coeff; // progressive only - int coeff_w, coeff_h; // number of 8x8 coefficient blocks - } img_comp[4]; - - stbi__uint32 code_buffer; // jpeg entropy-coded buffer - int code_bits; // number of valid bits - unsigned char marker; // marker seen while filling entropy buffer - int nomore; // flag if we saw a marker so must stop - - int progressive; - int spec_start; - int spec_end; - int succ_high; - int succ_low; - int eob_run; - int jfif; - int app14_color_transform; // Adobe APP14 tag - int rgb; - - int scan_n, order[4]; - int restart_interval, todo; - -// kernels - void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); - void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); - stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); -} stbi__jpeg; - -static int stbi__build_huffman(stbi__huffman *h, int *count) -{ - int i,j,k=0; - unsigned int code; - // build size list for each symbol (from JPEG spec) - for (i=0; i < 16; ++i) - for (j=0; j < count[i]; ++j) - h->size[k++] = (stbi_uc) (i+1); - h->size[k] = 0; - - // compute actual symbols (from jpeg spec) - code = 0; - k = 0; - for(j=1; j <= 16; ++j) { - // compute delta to add to code to compute symbol id - h->delta[j] = k - code; - if (h->size[k] == j) { - while (h->size[k] == j) - h->code[k++] = (stbi__uint16) (code++); - if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); - } - // compute largest code + 1 for this size, preshifted as needed later - h->maxcode[j] = code << (16-j); - code <<= 1; - } - h->maxcode[j] = 0xffffffff; - - // build non-spec acceleration table; 255 is flag for not-accelerated - memset(h->fast, 255, 1 << FAST_BITS); - for (i=0; i < k; ++i) { - int s = h->size[i]; - if (s <= FAST_BITS) { - int c = h->code[i] << (FAST_BITS-s); - int m = 1 << (FAST_BITS-s); - for (j=0; j < m; ++j) { - h->fast[c+j] = (stbi_uc) i; - } - } - } - return 1; -} - -// build a table that decodes both magnitude and value of small ACs in -// one go. -static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) -{ - int i; - for (i=0; i < (1 << FAST_BITS); ++i) { - stbi_uc fast = h->fast[i]; - fast_ac[i] = 0; - if (fast < 255) { - int rs = h->values[fast]; - int run = (rs >> 4) & 15; - int magbits = rs & 15; - int len = h->size[fast]; - - if (magbits && len + magbits <= FAST_BITS) { - // magnitude code followed by receive_extend code - int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); - int m = 1 << (magbits - 1); - if (k < m) k += (~0U << magbits) + 1; - // if the result is small enough, we can fit it in fast_ac table - if (k >= -128 && k <= 127) - fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); - } - } - } -} - -static void stbi__grow_buffer_unsafe(stbi__jpeg *j) -{ - do { - unsigned int b = j->nomore ? 0 : stbi__get8(j->s); - if (b == 0xff) { - int c = stbi__get8(j->s); - while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes - if (c != 0) { - j->marker = (unsigned char) c; - j->nomore = 1; - return; - } - } - j->code_buffer |= b << (24 - j->code_bits); - j->code_bits += 8; - } while (j->code_bits <= 24); -} - -// (1 << n) - 1 -static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; - -// decode a jpeg huffman value from the bitstream -stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) -{ - unsigned int temp; - int c,k; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - // look at the top FAST_BITS and determine what symbol ID it is, - // if the code is <= FAST_BITS - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - k = h->fast[c]; - if (k < 255) { - int s = h->size[k]; - if (s > j->code_bits) - return -1; - j->code_buffer <<= s; - j->code_bits -= s; - return h->values[k]; - } - - // naive test is to shift the code_buffer down so k bits are - // valid, then test against maxcode. To speed this up, we've - // preshifted maxcode left so that it has (16-k) 0s at the - // end; in other words, regardless of the number of bits, it - // wants to be compared against something shifted to have 16; - // that way we don't need to shift inside the loop. - temp = j->code_buffer >> 16; - for (k=FAST_BITS+1 ; ; ++k) - if (temp < h->maxcode[k]) - break; - if (k == 17) { - // error! code not found - j->code_bits -= 16; - return -1; - } - - if (k > j->code_bits) - return -1; - - // convert the huffman code to the symbol id - c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; - STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); - - // convert the id to a symbol - j->code_bits -= k; - j->code_buffer <<= k; - return h->values[c]; -} - -// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); - - sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB - k = stbi_lrot(j->code_buffer, n); - STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k + (stbi__jbias[n] & ~sgn); -} - -// get some unsigned bits -stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) -{ - unsigned int k; - if (j->code_bits < n) stbi__grow_buffer_unsafe(j); - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k; -} - -stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) -{ - unsigned int k; - if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); - k = j->code_buffer; - j->code_buffer <<= 1; - --j->code_bits; - return k & 0x80000000; -} - -// given a value that's at position X in the zigzag stream, -// where does it appear in the 8x8 matrix coded as row-major? -static const stbi_uc stbi__jpeg_dezigzag[64+15] = -{ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - // let corrupt input sample past end - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63 -}; - -// decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) -{ - int diff,dc,k; - int t; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data,0,64*sizeof(data[0])); - - diff = t ? stbi__extend_receive(j, t) : 0; - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) (dc * dequant[0]); - - // decode AC components, see JPEG spec - k = 1; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - j->code_buffer <<= s; - j->code_bits -= s; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) * dequant[zig]); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); - } - } - } while (k < 64); - return 1; -} - -static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) -{ - int diff,dc; - int t; - if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - if (j->succ_high == 0) { - // first scan for DC coefficient, must be first - memset(data,0,64*sizeof(data[0])); // 0 all the ac values now - t = stbi__jpeg_huff_decode(j, hdc); - diff = t ? stbi__extend_receive(j, t) : 0; - - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) (dc << j->succ_low); - } else { - // refinement scan for DC coefficient - if (stbi__jpeg_get_bit(j)) - data[0] += (short) (1 << j->succ_low); - } - return 1; -} - -// @OPTIMIZE: store non-zigzagged during the decode passes, -// and only de-zigzag when dequantizing -static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) -{ - int k; - if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->succ_high == 0) { - int shift = j->succ_low; - - if (j->eob_run) { - --j->eob_run; - return 1; - } - - k = j->spec_start; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - j->code_buffer <<= s; - j->code_bits -= s; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) << shift); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r); - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - --j->eob_run; - break; - } - k += 16; - } else { - k += r; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) << shift); - } - } - } while (k <= j->spec_end); - } else { - // refinement scan for these AC coefficients - - short bit = (short) (1 << j->succ_low); - - if (j->eob_run) { - --j->eob_run; - for (k = j->spec_start; k <= j->spec_end; ++k) { - short *p = &data[stbi__jpeg_dezigzag[k]]; - if (*p != 0) - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } - } else { - k = j->spec_start; - do { - int r,s; - int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r) - 1; - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - r = 64; // force end of block - } else { - // r=15 s=0 should write 16 0s, so we just do - // a run of 15 0s and then write s (which is 0), - // so we don't have to do anything special here - } - } else { - if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); - // sign bit - if (stbi__jpeg_get_bit(j)) - s = bit; - else - s = -bit; - } - - // advance by r - while (k <= j->spec_end) { - short *p = &data[stbi__jpeg_dezigzag[k++]]; - if (*p != 0) { - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } else { - if (r == 0) { - *p = (short) s; - break; - } - --r; - } - } - } while (k <= j->spec_end); - } - } - return 1; -} - -// take a -128..127 value and stbi__clamp it and convert to 0..255 -stbi_inline static stbi_uc stbi__clamp(int x) -{ - // trick to use a single test to catch both cases - if ((unsigned int) x > 255) { - if (x < 0) return 0; - if (x > 255) return 255; - } - return (stbi_uc) x; -} - -#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) -#define stbi__fsh(x) ((x) * 4096) - -// derived from jidctint -- DCT_ISLOW -#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ - int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ - p2 = s2; \ - p3 = s6; \ - p1 = (p2+p3) * stbi__f2f(0.5411961f); \ - t2 = p1 + p3*stbi__f2f(-1.847759065f); \ - t3 = p1 + p2*stbi__f2f( 0.765366865f); \ - p2 = s0; \ - p3 = s4; \ - t0 = stbi__fsh(p2+p3); \ - t1 = stbi__fsh(p2-p3); \ - x0 = t0+t3; \ - x3 = t0-t3; \ - x1 = t1+t2; \ - x2 = t1-t2; \ - t0 = s7; \ - t1 = s5; \ - t2 = s3; \ - t3 = s1; \ - p3 = t0+t2; \ - p4 = t1+t3; \ - p1 = t0+t3; \ - p2 = t1+t2; \ - p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ - t0 = t0*stbi__f2f( 0.298631336f); \ - t1 = t1*stbi__f2f( 2.053119869f); \ - t2 = t2*stbi__f2f( 3.072711026f); \ - t3 = t3*stbi__f2f( 1.501321110f); \ - p1 = p5 + p1*stbi__f2f(-0.899976223f); \ - p2 = p5 + p2*stbi__f2f(-2.562915447f); \ - p3 = p3*stbi__f2f(-1.961570560f); \ - p4 = p4*stbi__f2f(-0.390180644f); \ - t3 += p1+p4; \ - t2 += p2+p3; \ - t1 += p2+p4; \ - t0 += p1+p3; - -static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) -{ - int i,val[64],*v=val; - stbi_uc *o; - short *d = data; - - // columns - for (i=0; i < 8; ++i,++d, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 - && d[40]==0 && d[48]==0 && d[56]==0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0]*4; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; x1 += 512; x2 += 512; x3 += 512; - v[ 0] = (x0+t3) >> 10; - v[56] = (x0-t3) >> 10; - v[ 8] = (x1+t2) >> 10; - v[48] = (x1-t2) >> 10; - v[16] = (x2+t1) >> 10; - v[40] = (x2-t1) >> 10; - v[24] = (x3+t0) >> 10; - v[32] = (x3-t0) >> 10; - } - } - - for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { - // no fast case since the first 1D IDCT spread components out - STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - // so we want to round that, which means adding 0.5 * 1<<17, - // aka 65536. Also, we'll end up with -128 to 127 that we want - // to encode as 0..255 by adding 128, so we'll add that before the shift - x0 += 65536 + (128<<17); - x1 += 65536 + (128<<17); - x2 += 65536 + (128<<17); - x3 += 65536 + (128<<17); - // tried computing the shifts into temps, or'ing the temps to see - // if any were out of range, but that was slower - o[0] = stbi__clamp((x0+t3) >> 17); - o[7] = stbi__clamp((x0-t3) >> 17); - o[1] = stbi__clamp((x1+t2) >> 17); - o[6] = stbi__clamp((x1-t2) >> 17); - o[2] = stbi__clamp((x2+t1) >> 17); - o[5] = stbi__clamp((x2-t1) >> 17); - o[3] = stbi__clamp((x3+t0) >> 17); - o[4] = stbi__clamp((x3-t0) >> 17); - } -} - -#ifdef STBI_SSE2 -// sse2 integer IDCT. not the fastest possible implementation but it -// produces bit-identical results to the generic C version so it's -// fully "transparent". -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - // This is constructed to match our regular (generic) integer IDCT exactly. - __m128i row0, row1, row2, row3, row4, row5, row6, row7; - __m128i tmp; - - // dot product constant: even elems=x, odd elems=y - #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) - - // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) - // out(1) = c1[even]*x + c1[odd]*y - #define dct_rot(out0,out1, x,y,c0,c1) \ - __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ - __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ - __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ - __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ - __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ - __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) - - // out = in << 12 (in 16-bit, out 32-bit) - #define dct_widen(out, in) \ - __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ - __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) - - // wide add - #define dct_wadd(out, a, b) \ - __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_add_epi32(a##_h, b##_h) - - // wide sub - #define dct_wsub(out, a, b) \ - __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) - - // butterfly a/b, add bias, then shift by "s" and pack - #define dct_bfly32o(out0, out1, a,b,bias,s) \ - { \ - __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ - __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ - dct_wadd(sum, abiased, b); \ - dct_wsub(dif, abiased, b); \ - out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ - out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ - } - - // 8-bit interleave step (for transposes) - #define dct_interleave8(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi8(a, b); \ - b = _mm_unpackhi_epi8(tmp, b) - - // 16-bit interleave step (for transposes) - #define dct_interleave16(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi16(a, b); \ - b = _mm_unpackhi_epi16(tmp, b) - - #define dct_pass(bias,shift) \ - { \ - /* even part */ \ - dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ - __m128i sum04 = _mm_add_epi16(row0, row4); \ - __m128i dif04 = _mm_sub_epi16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ - dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ - __m128i sum17 = _mm_add_epi16(row1, row7); \ - __m128i sum35 = _mm_add_epi16(row3, row5); \ - dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ - dct_wadd(x4, y0o, y4o); \ - dct_wadd(x5, y1o, y5o); \ - dct_wadd(x6, y2o, y5o); \ - dct_wadd(x7, y3o, y4o); \ - dct_bfly32o(row0,row7, x0,x7,bias,shift); \ - dct_bfly32o(row1,row6, x1,x6,bias,shift); \ - dct_bfly32o(row2,row5, x2,x5,bias,shift); \ - dct_bfly32o(row3,row4, x3,x4,bias,shift); \ - } - - __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); - __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); - __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); - __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); - __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); - __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); - __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); - __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); - - // rounding biases in column/row passes, see stbi__idct_block for explanation. - __m128i bias_0 = _mm_set1_epi32(512); - __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); - - // load - row0 = _mm_load_si128((const __m128i *) (data + 0*8)); - row1 = _mm_load_si128((const __m128i *) (data + 1*8)); - row2 = _mm_load_si128((const __m128i *) (data + 2*8)); - row3 = _mm_load_si128((const __m128i *) (data + 3*8)); - row4 = _mm_load_si128((const __m128i *) (data + 4*8)); - row5 = _mm_load_si128((const __m128i *) (data + 5*8)); - row6 = _mm_load_si128((const __m128i *) (data + 6*8)); - row7 = _mm_load_si128((const __m128i *) (data + 7*8)); - - // column pass - dct_pass(bias_0, 10); - - { - // 16bit 8x8 transpose pass 1 - dct_interleave16(row0, row4); - dct_interleave16(row1, row5); - dct_interleave16(row2, row6); - dct_interleave16(row3, row7); - - // transpose pass 2 - dct_interleave16(row0, row2); - dct_interleave16(row1, row3); - dct_interleave16(row4, row6); - dct_interleave16(row5, row7); - - // transpose pass 3 - dct_interleave16(row0, row1); - dct_interleave16(row2, row3); - dct_interleave16(row4, row5); - dct_interleave16(row6, row7); - } - - // row pass - dct_pass(bias_1, 17); - - { - // pack - __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 - __m128i p1 = _mm_packus_epi16(row2, row3); - __m128i p2 = _mm_packus_epi16(row4, row5); - __m128i p3 = _mm_packus_epi16(row6, row7); - - // 8bit 8x8 transpose pass 1 - dct_interleave8(p0, p2); // a0e0a1e1... - dct_interleave8(p1, p3); // c0g0c1g1... - - // transpose pass 2 - dct_interleave8(p0, p1); // a0c0e0g0... - dct_interleave8(p2, p3); // b0d0f0h0... - - // transpose pass 3 - dct_interleave8(p0, p2); // a0b0c0d0... - dct_interleave8(p1, p3); // a4b4c4d4... - - // store - _mm_storel_epi64((__m128i *) out, p0); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p2); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p1); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p3); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); - } - -#undef dct_const -#undef dct_rot -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_interleave8 -#undef dct_interleave16 -#undef dct_pass -} - -#endif // STBI_SSE2 - -#ifdef STBI_NEON - -// NEON integer IDCT. should produce bit-identical -// results to the generic C version. -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; - - int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); - int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); - int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); - int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); - int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); - int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); - int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); - int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); - int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); - int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); - int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); - int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); - -#define dct_long_mul(out, inq, coeff) \ - int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) - -#define dct_long_mac(out, acc, inq, coeff) \ - int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) - -#define dct_widen(out, inq) \ - int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ - int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) - -// wide add -#define dct_wadd(out, a, b) \ - int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vaddq_s32(a##_h, b##_h) - -// wide sub -#define dct_wsub(out, a, b) \ - int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vsubq_s32(a##_h, b##_h) - -// butterfly a/b, then shift using "shiftop" by "s" and pack -#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ - { \ - dct_wadd(sum, a, b); \ - dct_wsub(dif, a, b); \ - out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ - out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ - } - -#define dct_pass(shiftop, shift) \ - { \ - /* even part */ \ - int16x8_t sum26 = vaddq_s16(row2, row6); \ - dct_long_mul(p1e, sum26, rot0_0); \ - dct_long_mac(t2e, p1e, row6, rot0_1); \ - dct_long_mac(t3e, p1e, row2, rot0_2); \ - int16x8_t sum04 = vaddq_s16(row0, row4); \ - int16x8_t dif04 = vsubq_s16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - int16x8_t sum15 = vaddq_s16(row1, row5); \ - int16x8_t sum17 = vaddq_s16(row1, row7); \ - int16x8_t sum35 = vaddq_s16(row3, row5); \ - int16x8_t sum37 = vaddq_s16(row3, row7); \ - int16x8_t sumodd = vaddq_s16(sum17, sum35); \ - dct_long_mul(p5o, sumodd, rot1_0); \ - dct_long_mac(p1o, p5o, sum17, rot1_1); \ - dct_long_mac(p2o, p5o, sum35, rot1_2); \ - dct_long_mul(p3o, sum37, rot2_0); \ - dct_long_mul(p4o, sum15, rot2_1); \ - dct_wadd(sump13o, p1o, p3o); \ - dct_wadd(sump24o, p2o, p4o); \ - dct_wadd(sump23o, p2o, p3o); \ - dct_wadd(sump14o, p1o, p4o); \ - dct_long_mac(x4, sump13o, row7, rot3_0); \ - dct_long_mac(x5, sump24o, row5, rot3_1); \ - dct_long_mac(x6, sump23o, row3, rot3_2); \ - dct_long_mac(x7, sump14o, row1, rot3_3); \ - dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ - dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ - dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ - dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ - } - - // load - row0 = vld1q_s16(data + 0*8); - row1 = vld1q_s16(data + 1*8); - row2 = vld1q_s16(data + 2*8); - row3 = vld1q_s16(data + 3*8); - row4 = vld1q_s16(data + 4*8); - row5 = vld1q_s16(data + 5*8); - row6 = vld1q_s16(data + 6*8); - row7 = vld1q_s16(data + 7*8); - - // add DC bias - row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); - - // column pass - dct_pass(vrshrn_n_s32, 10); - - // 16bit 8x8 transpose - { -// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. -// whether compilers actually get this is another story, sadly. -#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } -#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } - - // pass 1 - dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 - dct_trn16(row2, row3); - dct_trn16(row4, row5); - dct_trn16(row6, row7); - - // pass 2 - dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 - dct_trn32(row1, row3); - dct_trn32(row4, row6); - dct_trn32(row5, row7); - - // pass 3 - dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 - dct_trn64(row1, row5); - dct_trn64(row2, row6); - dct_trn64(row3, row7); - -#undef dct_trn16 -#undef dct_trn32 -#undef dct_trn64 - } - - // row pass - // vrshrn_n_s32 only supports shifts up to 16, we need - // 17. so do a non-rounding shift of 16 first then follow - // up with a rounding shift by 1. - dct_pass(vshrn_n_s32, 16); - - { - // pack and round - uint8x8_t p0 = vqrshrun_n_s16(row0, 1); - uint8x8_t p1 = vqrshrun_n_s16(row1, 1); - uint8x8_t p2 = vqrshrun_n_s16(row2, 1); - uint8x8_t p3 = vqrshrun_n_s16(row3, 1); - uint8x8_t p4 = vqrshrun_n_s16(row4, 1); - uint8x8_t p5 = vqrshrun_n_s16(row5, 1); - uint8x8_t p6 = vqrshrun_n_s16(row6, 1); - uint8x8_t p7 = vqrshrun_n_s16(row7, 1); - - // again, these can translate into one instruction, but often don't. -#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } -#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } - - // sadly can't use interleaved stores here since we only write - // 8 bytes to each scan line! - - // 8x8 8-bit transpose pass 1 - dct_trn8_8(p0, p1); - dct_trn8_8(p2, p3); - dct_trn8_8(p4, p5); - dct_trn8_8(p6, p7); - - // pass 2 - dct_trn8_16(p0, p2); - dct_trn8_16(p1, p3); - dct_trn8_16(p4, p6); - dct_trn8_16(p5, p7); - - // pass 3 - dct_trn8_32(p0, p4); - dct_trn8_32(p1, p5); - dct_trn8_32(p2, p6); - dct_trn8_32(p3, p7); - - // store - vst1_u8(out, p0); out += out_stride; - vst1_u8(out, p1); out += out_stride; - vst1_u8(out, p2); out += out_stride; - vst1_u8(out, p3); out += out_stride; - vst1_u8(out, p4); out += out_stride; - vst1_u8(out, p5); out += out_stride; - vst1_u8(out, p6); out += out_stride; - vst1_u8(out, p7); - -#undef dct_trn8_8 -#undef dct_trn8_16 -#undef dct_trn8_32 - } - -#undef dct_long_mul -#undef dct_long_mac -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_pass -} - -#endif // STBI_NEON - -#define STBI__MARKER_none 0xff -// if there's a pending marker from the entropy stream, return that -// otherwise, fetch from the stream and get a marker. if there's no -// marker, return 0xff, which is never a valid marker value -static stbi_uc stbi__get_marker(stbi__jpeg *j) -{ - stbi_uc x; - if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } - x = stbi__get8(j->s); - if (x != 0xff) return STBI__MARKER_none; - while (x == 0xff) - x = stbi__get8(j->s); // consume repeated 0xff fill bytes - return x; -} - -// in each scan, we'll have scan_n components, and the order -// of the components is specified by order[] -#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) - -// after a restart interval, stbi__jpeg_reset the entropy decoder and -// the dc prediction -static void stbi__jpeg_reset(stbi__jpeg *j) -{ - j->code_bits = 0; - j->code_buffer = 0; - j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; - j->marker = STBI__MARKER_none; - j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; - j->eob_run = 0; - // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, - // since we don't even allow 1<<30 pixels -} - -static int stbi__parse_entropy_coded_data(stbi__jpeg *z) -{ - stbi__jpeg_reset(z); - if (!z->progressive) { - if (z->scan_n == 1) { - int i,j; - STBI_SIMD_ALIGN(short, data[64]); - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - STBI_SIMD_ALIGN(short, data[64]); - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } else { - if (z->scan_n == 1) { - int i,j; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - if (z->spec_start == 0) { - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } else { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) - return 0; - } - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x); - int y2 = (j*z->img_comp[n].v + y); - short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } -} - -static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) -{ - int i; - for (i=0; i < 64; ++i) - data[i] *= dequant[i]; -} - -static void stbi__jpeg_finish(stbi__jpeg *z) -{ - if (z->progressive) { - // dequantize and idct the data - int i,j,n; - for (n=0; n < z->s->img_n; ++n) { - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - } - } - } - } -} - -static int stbi__process_marker(stbi__jpeg *z, int m) -{ - int L; - switch (m) { - case STBI__MARKER_none: // no marker found - return stbi__err("expected marker","Corrupt JPEG"); - - case 0xDD: // DRI - specify restart interval - if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); - z->restart_interval = stbi__get16be(z->s); - return 1; - - case 0xDB: // DQT - define quantization table - L = stbi__get16be(z->s)-2; - while (L > 0) { - int q = stbi__get8(z->s); - int p = q >> 4, sixteen = (p != 0); - int t = q & 15,i; - if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); - if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); - - for (i=0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); - L -= (sixteen ? 129 : 65); - } - return L==0; - - case 0xC4: // DHT - define huffman table - L = stbi__get16be(z->s)-2; - while (L > 0) { - stbi_uc *v; - int sizes[16],i,n=0; - int q = stbi__get8(z->s); - int tc = q >> 4; - int th = q & 15; - if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); - for (i=0; i < 16; ++i) { - sizes[i] = stbi__get8(z->s); - n += sizes[i]; - } - L -= 17; - if (tc == 0) { - if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; - v = z->huff_dc[th].values; - } else { - if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; - v = z->huff_ac[th].values; - } - for (i=0; i < n; ++i) - v[i] = stbi__get8(z->s); - if (tc != 0) - stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); - L -= n; - } - return L==0; - } - - // check for comment block or APP blocks - if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - L = stbi__get16be(z->s); - if (L < 2) { - if (m == 0xFE) - return stbi__err("bad COM len","Corrupt JPEG"); - else - return stbi__err("bad APP len","Corrupt JPEG"); - } - L -= 2; - - if (m == 0xE0 && L >= 5) { // JFIF APP0 segment - static const unsigned char tag[5] = {'J','F','I','F','\0'}; - int ok = 1; - int i; - for (i=0; i < 5; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 5; - if (ok) - z->jfif = 1; - } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment - static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; - int ok = 1; - int i; - for (i=0; i < 6; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 6; - if (ok) { - stbi__get8(z->s); // version - stbi__get16be(z->s); // flags0 - stbi__get16be(z->s); // flags1 - z->app14_color_transform = stbi__get8(z->s); // color transform - L -= 6; - } - } - - stbi__skip(z->s, L); - return 1; - } - - return stbi__err("unknown marker","Corrupt JPEG"); -} - -// after we see SOS -static int stbi__process_scan_header(stbi__jpeg *z) -{ - int i; - int Ls = stbi__get16be(z->s); - z->scan_n = stbi__get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); - for (i=0; i < z->scan_n; ++i) { - int id = stbi__get8(z->s), which; - int q = stbi__get8(z->s); - for (which = 0; which < z->s->img_n; ++which) - if (z->img_comp[which].id == id) - break; - if (which == z->s->img_n) return 0; // no match - z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); - z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); - z->order[i] = which; - } - - { - int aa; - z->spec_start = stbi__get8(z->s); - z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 - aa = stbi__get8(z->s); - z->succ_high = (aa >> 4); - z->succ_low = (aa & 15); - if (z->progressive) { - if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) - return stbi__err("bad SOS", "Corrupt JPEG"); - } else { - if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); - if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); - z->spec_end = 63; - } - } - - return 1; -} - -static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) -{ - int i; - for (i=0; i < ncomp; ++i) { - if (z->img_comp[i].raw_data) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].raw_data = NULL; - z->img_comp[i].data = NULL; - } - if (z->img_comp[i].raw_coeff) { - STBI_FREE(z->img_comp[i].raw_coeff); - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].coeff = 0; - } - if (z->img_comp[i].linebuf) { - STBI_FREE(z->img_comp[i].linebuf); - z->img_comp[i].linebuf = NULL; - } - } - return why; -} - -static int stbi__process_frame_header(stbi__jpeg *z, int scan) -{ - stbi__context *s = z->s; - int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG - p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires - c = stbi__get8(s); - if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); - s->img_n = c; - for (i=0; i < c; ++i) { - z->img_comp[i].data = NULL; - z->img_comp[i].linebuf = NULL; - } - - if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); - - z->rgb = 0; - for (i=0; i < s->img_n; ++i) { - static const unsigned char rgb[3] = { 'R', 'G', 'B' }; - z->img_comp[i].id = stbi__get8(s); - if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) - ++z->rgb; - q = stbi__get8(s); - z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); - z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); - z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); - } - - if (scan != STBI__SCAN_load) return 1; - - if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); - - for (i=0; i < s->img_n; ++i) { - if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; - if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; - } - - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; - z->img_mcu_w = h_max * 8; - z->img_mcu_h = v_max * 8; - // these sizes can't be more than 17 bits - z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; - z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; - - for (i=0; i < s->img_n; ++i) { - // number of effective pixels (e.g. for non-interleaved MCU) - z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; - z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; - // to simplify generation, we'll allocate enough memory to decode - // the bogus oversized data from using interleaved MCUs and their - // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't - // discard the extra data until colorspace conversion - // - // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) - // so these muls can't overflow with 32-bit ints (which we require) - z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; - z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].linebuf = NULL; - z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); - if (z->img_comp[i].raw_data == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - // align blocks for idct using mmx/sse - z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - if (z->progressive) { - // w2, h2 are multiples of 8 (see above) - z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; - z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; - z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); - if (z->img_comp[i].raw_coeff == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); - } - } - - return 1; -} - -// use comparisons since in some cases we handle more than one case (e.g. SOF) -#define stbi__DNL(x) ((x) == 0xdc) -#define stbi__SOI(x) ((x) == 0xd8) -#define stbi__EOI(x) ((x) == 0xd9) -#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) -#define stbi__SOS(x) ((x) == 0xda) - -#define stbi__SOF_progressive(x) ((x) == 0xc2) - -static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) -{ - int m; - z->jfif = 0; - z->app14_color_transform = -1; // valid values are 0,1,2 - z->marker = STBI__MARKER_none; // initialize cached marker to empty - m = stbi__get_marker(z); - if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); - if (scan == STBI__SCAN_type) return 1; - m = stbi__get_marker(z); - while (!stbi__SOF(m)) { - if (!stbi__process_marker(z,m)) return 0; - m = stbi__get_marker(z); - while (m == STBI__MARKER_none) { - // some files have extra padding after their blocks, so ok, we'll scan - if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); - m = stbi__get_marker(z); - } - } - z->progressive = stbi__SOF_progressive(m); - if (!stbi__process_frame_header(z, scan)) return 0; - return 1; -} - -// decode image to YCbCr format -static int stbi__decode_jpeg_image(stbi__jpeg *j) -{ - int m; - for (m = 0; m < 4; m++) { - j->img_comp[m].raw_data = NULL; - j->img_comp[m].raw_coeff = NULL; - } - j->restart_interval = 0; - if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; - m = stbi__get_marker(j); - while (!stbi__EOI(m)) { - if (stbi__SOS(m)) { - if (!stbi__process_scan_header(j)) return 0; - if (!stbi__parse_entropy_coded_data(j)) return 0; - if (j->marker == STBI__MARKER_none ) { - // handle 0s at the end of image data from IP Kamera 9060 - while (!stbi__at_eof(j->s)) { - int x = stbi__get8(j->s); - if (x == 255) { - j->marker = stbi__get8(j->s); - break; - } - } - // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 - } - } else if (stbi__DNL(m)) { - int Ld = stbi__get16be(j->s); - stbi__uint32 NL = stbi__get16be(j->s); - if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); - if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); - } else { - if (!stbi__process_marker(j, m)) return 0; - } - m = stbi__get_marker(j); - } - if (j->progressive) - stbi__jpeg_finish(j); - return 1; -} - -// static jfif-centered resampling (across block boundaries) - -typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, - int w, int hs); - -#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) - -static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - STBI_NOTUSED(out); - STBI_NOTUSED(in_far); - STBI_NOTUSED(w); - STBI_NOTUSED(hs); - return in_near; -} - -static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples vertically for every one in input - int i; - STBI_NOTUSED(hs); - for (i=0; i < w; ++i) - out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); - return out; -} - -static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples horizontally for every one in input - int i; - stbi_uc *input = in_near; - - if (w == 1) { - // if only one sample, can't do any interpolation - out[0] = out[1] = input[0]; - return out; - } - - out[0] = input[0]; - out[1] = stbi__div4(input[0]*3 + input[1] + 2); - for (i=1; i < w-1; ++i) { - int n = 3*input[i]+2; - out[i*2+0] = stbi__div4(n+input[i-1]); - out[i*2+1] = stbi__div4(n+input[i+1]); - } - out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); - out[i*2+1] = input[w-1]; - - STBI_NOTUSED(in_far); - STBI_NOTUSED(hs); - - return out; -} - -#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) - -static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i,t0,t1; - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - out[0] = stbi__div4(t1+2); - for (i=1; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i=0,t0,t1; - - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - // process groups of 8 pixels for as long as we can. - // note we can't handle the last pixel in a row in this loop - // because we need to handle the filter boundary conditions. - for (; i < ((w-1) & ~7); i += 8) { -#if defined(STBI_SSE2) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - __m128i zero = _mm_setzero_si128(); - __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); - __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); - __m128i farw = _mm_unpacklo_epi8(farb, zero); - __m128i nearw = _mm_unpacklo_epi8(nearb, zero); - __m128i diff = _mm_sub_epi16(farw, nearw); - __m128i nears = _mm_slli_epi16(nearw, 2); - __m128i curr = _mm_add_epi16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - __m128i prv0 = _mm_slli_si128(curr, 2); - __m128i nxt0 = _mm_srli_si128(curr, 2); - __m128i prev = _mm_insert_epi16(prv0, t1, 0); - __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - __m128i bias = _mm_set1_epi16(8); - __m128i curs = _mm_slli_epi16(curr, 2); - __m128i prvd = _mm_sub_epi16(prev, curr); - __m128i nxtd = _mm_sub_epi16(next, curr); - __m128i curb = _mm_add_epi16(curs, bias); - __m128i even = _mm_add_epi16(prvd, curb); - __m128i odd = _mm_add_epi16(nxtd, curb); - - // interleave even and odd pixels, then undo scaling. - __m128i int0 = _mm_unpacklo_epi16(even, odd); - __m128i int1 = _mm_unpackhi_epi16(even, odd); - __m128i de0 = _mm_srli_epi16(int0, 4); - __m128i de1 = _mm_srli_epi16(int1, 4); - - // pack and write output - __m128i outv = _mm_packus_epi16(de0, de1); - _mm_storeu_si128((__m128i *) (out + i*2), outv); -#elif defined(STBI_NEON) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - uint8x8_t farb = vld1_u8(in_far + i); - uint8x8_t nearb = vld1_u8(in_near + i); - int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); - int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); - int16x8_t curr = vaddq_s16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - int16x8_t prv0 = vextq_s16(curr, curr, 7); - int16x8_t nxt0 = vextq_s16(curr, curr, 1); - int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); - int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - int16x8_t curs = vshlq_n_s16(curr, 2); - int16x8_t prvd = vsubq_s16(prev, curr); - int16x8_t nxtd = vsubq_s16(next, curr); - int16x8_t even = vaddq_s16(curs, prvd); - int16x8_t odd = vaddq_s16(curs, nxtd); - - // undo scaling and round, then store with even/odd phases interleaved - uint8x8x2_t o; - o.val[0] = vqrshrun_n_s16(even, 4); - o.val[1] = vqrshrun_n_s16(odd, 4); - vst2_u8(out + i*2, o); -#endif - - // "previous" value for next iter - t1 = 3*in_near[i+7] + in_far[i+7]; - } - - t0 = t1; - t1 = 3*in_near[i] + in_far[i]; - out[i*2] = stbi__div16(3*t1 + t0 + 8); - - for (++i; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} -#endif - -static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // resample with nearest-neighbor - int i,j; - STBI_NOTUSED(in_far); - for (i=0; i < w; ++i) - for (j=0; j < hs; ++j) - out[i*hs+j] = in_near[i]; - return out; -} - -// this is a reduced-precision calculation of YCbCr-to-RGB introduced -// to make sure the code produces the same results in both SIMD and scalar -#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) -static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) -{ - int i = 0; - -#ifdef STBI_SSE2 - // step == 3 is pretty ugly on the final interleave, and i'm not convinced - // it's useful in practice (you wouldn't use it for textures, for example). - // so just accelerate step == 4 case. - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - __m128i signflip = _mm_set1_epi8(-0x80); - __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); - __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); - __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); - __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); - __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); - __m128i xw = _mm_set1_epi16(255); // alpha channel - - for (; i+7 < count; i += 8) { - // load - __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); - __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); - __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); - __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 - __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 - - // unpack to short (and left-shift cr, cb by 8) - __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); - __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); - __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); - - // color transform - __m128i yws = _mm_srli_epi16(yw, 4); - __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); - __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); - __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); - __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); - __m128i rws = _mm_add_epi16(cr0, yws); - __m128i gwt = _mm_add_epi16(cb0, yws); - __m128i bws = _mm_add_epi16(yws, cb1); - __m128i gws = _mm_add_epi16(gwt, cr1); - - // descale - __m128i rw = _mm_srai_epi16(rws, 4); - __m128i bw = _mm_srai_epi16(bws, 4); - __m128i gw = _mm_srai_epi16(gws, 4); - - // back to byte, set up for transpose - __m128i brb = _mm_packus_epi16(rw, bw); - __m128i gxb = _mm_packus_epi16(gw, xw); - - // transpose to interleave channels - __m128i t0 = _mm_unpacklo_epi8(brb, gxb); - __m128i t1 = _mm_unpackhi_epi8(brb, gxb); - __m128i o0 = _mm_unpacklo_epi16(t0, t1); - __m128i o1 = _mm_unpackhi_epi16(t0, t1); - - // store - _mm_storeu_si128((__m128i *) (out + 0), o0); - _mm_storeu_si128((__m128i *) (out + 16), o1); - out += 32; - } - } -#endif - -#ifdef STBI_NEON - // in this version, step=3 support would be easy to add. but is there demand? - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - uint8x8_t signflip = vdup_n_u8(0x80); - int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); - int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); - int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); - int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); - - for (; i+7 < count; i += 8) { - // load - uint8x8_t y_bytes = vld1_u8(y + i); - uint8x8_t cr_bytes = vld1_u8(pcr + i); - uint8x8_t cb_bytes = vld1_u8(pcb + i); - int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); - int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); - - // expand to s16 - int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); - int16x8_t crw = vshll_n_s8(cr_biased, 7); - int16x8_t cbw = vshll_n_s8(cb_biased, 7); - - // color transform - int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); - int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); - int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); - int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); - int16x8_t rws = vaddq_s16(yws, cr0); - int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); - int16x8_t bws = vaddq_s16(yws, cb1); - - // undo scaling, round, convert to byte - uint8x8x4_t o; - o.val[0] = vqrshrun_n_s16(rws, 4); - o.val[1] = vqrshrun_n_s16(gws, 4); - o.val[2] = vqrshrun_n_s16(bws, 4); - o.val[3] = vdup_n_u8(255); - - // store, interleaving r/g/b/a - vst4_u8(out, o); - out += 8*4; - } - } -#endif - - for (; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#endif - -// set up the kernels -static void stbi__setup_jpeg(stbi__jpeg *j) -{ - j->idct_block_kernel = stbi__idct_block; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; - -#ifdef STBI_SSE2 - if (stbi__sse2_available()) { - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; - } -#endif - -#ifdef STBI_NEON - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; -#endif -} - -// clean up the temporary component buffers -static void stbi__cleanup_jpeg(stbi__jpeg *j) -{ - stbi__free_jpeg_components(j, j->s->img_n, 0); -} - -typedef struct -{ - resample_row_func resample; - stbi_uc *line0,*line1; - int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion - int ystep; // how far through vertical expansion we are - int ypos; // which pre-expansion row we're on -} stbi__resample; - -// fast 0..255 * 0..255 => 0..255 rounded multiplication -static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) -{ - unsigned int t = x*y + 128; - return (stbi_uc) ((t + (t >>8)) >> 8); -} - -static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) -{ - int n, decode_n, is_rgb; - z->s->img_n = 0; // make stbi__cleanup_jpeg safe - - // validate req_comp - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - - // load a jpeg image from whichever source, but leave in YCbCr format - if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } - - // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; - - is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); - - if (z->s->img_n == 3 && n < 3 && !is_rgb) - decode_n = 1; - else - decode_n = z->s->img_n; - - // resample and color-convert - { - int k; - unsigned int i,j; - stbi_uc *output; - stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; - - stbi__resample res_comp[4]; - - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - - // allocate line buffer big enough for upsampling off the edges - // with upsample factor of 4 - z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); - if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - r->hs = z->img_h_max / z->img_comp[k].h; - r->vs = z->img_v_max / z->img_comp[k].v; - r->ystep = r->vs >> 1; - r->w_lores = (z->s->img_x + r->hs-1) / r->hs; - r->ypos = 0; - r->line0 = r->line1 = z->img_comp[k].data; - - if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; - else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; - else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; - else r->resample = stbi__resample_row_generic; - } - - // can't error after this so, this is safe - output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); - if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - // now go ahead and resample - for (j=0; j < z->s->img_y; ++j) { - stbi_uc *out = output + n * z->s->img_x * j; - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - int y_bot = r->ystep >= (r->vs >> 1); - coutput[k] = r->resample(z->img_comp[k].linebuf, - y_bot ? r->line1 : r->line0, - y_bot ? r->line0 : r->line1, - r->w_lores, r->hs); - if (++r->ystep >= r->vs) { - r->ystep = 0; - r->line0 = r->line1; - if (++r->ypos < z->img_comp[k].y) - r->line1 += z->img_comp[k].w2; - } - } - if (n >= 3) { - stbi_uc *y = coutput[0]; - if (z->s->img_n == 3) { - if (is_rgb) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = y[i]; - out[1] = coutput[1][i]; - out[2] = coutput[2][i]; - out[3] = 255; - out += n; - } - } else { - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else if (z->s->img_n == 4) { - if (z->app14_color_transform == 0) { // CMYK - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(coutput[0][i], m); - out[1] = stbi__blinn_8x8(coutput[1][i], m); - out[2] = stbi__blinn_8x8(coutput[2][i], m); - out[3] = 255; - out += n; - } - } else if (z->app14_color_transform == 2) { // YCCK - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(255 - out[0], m); - out[1] = stbi__blinn_8x8(255 - out[1], m); - out[2] = stbi__blinn_8x8(255 - out[2], m); - out += n; - } - } else { // YCbCr + alpha? Ignore the fourth channel for now - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else - for (i=0; i < z->s->img_x; ++i) { - out[0] = out[1] = out[2] = y[i]; - out[3] = 255; // not used if n==3 - out += n; - } - } else { - if (is_rgb) { - if (n == 1) - for (i=0; i < z->s->img_x; ++i) - *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - else { - for (i=0; i < z->s->img_x; ++i, out += 2) { - out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - out[1] = 255; - } - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); - stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); - stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); - out[0] = stbi__compute_y(r, g, b); - out[1] = 255; - out += n; - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); - out[1] = 255; - out += n; - } - } else { - stbi_uc *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } - } - } - } - stbi__cleanup_jpeg(z); - *out_x = z->s->img_x; - *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output - return output; - } -} - -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - unsigned char* result; - stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); - STBI_NOTUSED(ri); - j->s = s; - stbi__setup_jpeg(j); - result = load_jpeg_image(j, x,y,comp,req_comp); - STBI_FREE(j); - return result; -} - -static int stbi__jpeg_test(stbi__context *s) -{ - int r; - stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); - j->s = s; - stbi__setup_jpeg(j); - r = stbi__decode_jpeg_header(j, STBI__SCAN_type); - stbi__rewind(s); - STBI_FREE(j); - return r; -} - -static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) -{ - if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { - stbi__rewind( j->s ); - return 0; - } - if (x) *x = j->s->img_x; - if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; - return 1; -} - -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) -{ - int result; - stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); - j->s = s; - result = stbi__jpeg_info_raw(j, x, y, comp); - STBI_FREE(j); - return result; -} -#endif - -// public domain zlib decode v0.2 Sean Barrett 2006-11-18 -// simple implementation -// - all input must be provided in an upfront buffer -// - all output is written to a single output buffer (can malloc/realloc) -// performance -// - fast huffman - -#ifndef STBI_NO_ZLIB - -// fast-way is faster to check than jpeg huffman, but slow way is slower -#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables -#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) - -// zlib-style huffman encoding -// (jpegs packs from left, zlib from right, so can't share code) -typedef struct -{ - stbi__uint16 fast[1 << STBI__ZFAST_BITS]; - stbi__uint16 firstcode[16]; - int maxcode[17]; - stbi__uint16 firstsymbol[16]; - stbi_uc size[288]; - stbi__uint16 value[288]; -} stbi__zhuffman; - -stbi_inline static int stbi__bitreverse16(int n) -{ - n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); - n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); - n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); - n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); - return n; -} - -stbi_inline static int stbi__bit_reverse(int v, int bits) -{ - STBI_ASSERT(bits <= 16); - // to bit reverse n bits, reverse 16 and shift - // e.g. 11 bits, bit reverse and shift away 5 - return stbi__bitreverse16(v) >> (16-bits); -} - -static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) -{ - int i,k=0; - int code, next_code[16], sizes[17]; - - // DEFLATE spec for generating codes - memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 0, sizeof(z->fast)); - for (i=0; i < num; ++i) - ++sizes[sizelist[i]]; - sizes[0] = 0; - for (i=1; i < 16; ++i) - if (sizes[i] > (1 << i)) - return stbi__err("bad sizes", "Corrupt PNG"); - code = 0; - for (i=1; i < 16; ++i) { - next_code[i] = code; - z->firstcode[i] = (stbi__uint16) code; - z->firstsymbol[i] = (stbi__uint16) k; - code = (code + sizes[i]); - if (sizes[i]) - if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); - z->maxcode[i] = code << (16-i); // preshift for inner loop - code <<= 1; - k += sizes[i]; - } - z->maxcode[16] = 0x10000; // sentinel - for (i=0; i < num; ++i) { - int s = sizelist[i]; - if (s) { - int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; - stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); - z->size [c] = (stbi_uc ) s; - z->value[c] = (stbi__uint16) i; - if (s <= STBI__ZFAST_BITS) { - int j = stbi__bit_reverse(next_code[s],s); - while (j < (1 << STBI__ZFAST_BITS)) { - z->fast[j] = fastv; - j += (1 << s); - } - } - ++next_code[s]; - } - } - return 1; -} - -// zlib-from-memory implementation for PNG reading -// because PNG allows splitting the zlib stream arbitrarily, -// and it's annoying structurally to have PNG call ZLIB call PNG, -// we require PNG read all the IDATs and combine them into a single -// memory buffer - -typedef struct -{ - stbi_uc *zbuffer, *zbuffer_end; - int num_bits; - stbi__uint32 code_buffer; - - char *zout; - char *zout_start; - char *zout_end; - int z_expandable; - - stbi__zhuffman z_length, z_distance; -} stbi__zbuf; - -stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) -{ - if (z->zbuffer >= z->zbuffer_end) return 0; - return *z->zbuffer++; -} - -static void stbi__fill_bits(stbi__zbuf *z) -{ - do { - STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); - z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -} - -stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) -{ - unsigned int k; - if (z->num_bits < n) stbi__fill_bits(z); - k = z->code_buffer & ((1 << n) - 1); - z->code_buffer >>= n; - z->num_bits -= n; - return k; -} - -static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s,k; - // not resolved by fast table, so compute it the slow way - // use jpeg approach, which requires MSbits at top - k = stbi__bit_reverse(a->code_buffer, 16); - for (s=STBI__ZFAST_BITS+1; ; ++s) - if (k < z->maxcode[s]) - break; - if (s == 16) return -1; // invalid code! - // code size is s, so: - b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - STBI_ASSERT(z->size[b] == s); - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -} - -stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s; - if (a->num_bits < 16) stbi__fill_bits(a); - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b) { - s = b >> 9; - a->code_buffer >>= s; - a->num_bits -= s; - return b & 511; - } - return stbi__zhuffman_decode_slowpath(a, z); -} - -static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes -{ - char *q; - int cur, limit, old_limit; - z->zout = zout; - if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); - cur = (int) (z->zout - z->zout_start); - limit = old_limit = (int) (z->zout_end - z->zout_start); - while (cur + n > limit) - limit *= 2; - q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); - STBI_NOTUSED(old_limit); - if (q == NULL) return stbi__err("outofmem", "Out of memory"); - z->zout_start = q; - z->zout = q + cur; - z->zout_end = q + limit; - return 1; -} - -static const int stbi__zlength_base[31] = { - 3,4,5,6,7,8,9,10,11,13, - 15,17,19,23,27,31,35,43,51,59, - 67,83,99,115,131,163,195,227,258,0,0 }; - -static const int stbi__zlength_extra[31]= -{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; - -static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, -257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; - -static const int stbi__zdist_extra[32] = -{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -static int stbi__parse_huffman_block(stbi__zbuf *a) -{ - char *zout = a->zout; - for(;;) { - int z = stbi__zhuffman_decode(a, &a->z_length); - if (z < 256) { - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes - if (zout >= a->zout_end) { - if (!stbi__zexpand(a, zout, 1)) return 0; - zout = a->zout; - } - *zout++ = (char) z; - } else { - stbi_uc *p; - int len,dist; - if (z == 256) { - a->zout = zout; - return 1; - } - z -= 257; - len = stbi__zlength_base[z]; - if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); - z = stbi__zhuffman_decode(a, &a->z_distance); - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); - dist = stbi__zdist_base[z]; - if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); - if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); - if (zout + len > a->zout_end) { - if (!stbi__zexpand(a, zout, len)) return 0; - zout = a->zout; - } - p = (stbi_uc *) (zout - dist); - if (dist == 1) { // run of one byte; common in images. - stbi_uc v = *p; - if (len) { do *zout++ = v; while (--len); } - } else { - if (len) { do *zout++ = *p++; while (--len); } - } - } - } -} - -static int stbi__compute_huffman_codes(stbi__zbuf *a) -{ - static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; - stbi__zhuffman z_codelength; - stbi_uc lencodes[286+32+137];//padding for maximum single op - stbi_uc codelength_sizes[19]; - int i,n; - - int hlit = stbi__zreceive(a,5) + 257; - int hdist = stbi__zreceive(a,5) + 1; - int hclen = stbi__zreceive(a,4) + 4; - int ntot = hlit + hdist; - - memset(codelength_sizes, 0, sizeof(codelength_sizes)); - for (i=0; i < hclen; ++i) { - int s = stbi__zreceive(a,3); - codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; - } - if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; - - n = 0; - while (n < ntot) { - int c = stbi__zhuffman_decode(a, &z_codelength); - if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); - if (c < 16) - lencodes[n++] = (stbi_uc) c; - else { - stbi_uc fill = 0; - if (c == 16) { - c = stbi__zreceive(a,2)+3; - if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); - fill = lencodes[n-1]; - } else if (c == 17) - c = stbi__zreceive(a,3)+3; - else { - STBI_ASSERT(c == 18); - c = stbi__zreceive(a,7)+11; - } - if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); - memset(lencodes+n, fill, c); - n += c; - } - } - if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); - if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; - return 1; -} - -static int stbi__parse_uncompressed_block(stbi__zbuf *a) -{ - stbi_uc header[4]; - int len,nlen,k; - if (a->num_bits & 7) - stbi__zreceive(a, a->num_bits & 7); // discard - // drain the bit-packed data into header - k = 0; - while (a->num_bits > 0) { - header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check - a->code_buffer >>= 8; - a->num_bits -= 8; - } - STBI_ASSERT(a->num_bits == 0); - // now fill header the normal way - while (k < 4) - header[k++] = stbi__zget8(a); - len = header[1] * 256 + header[0]; - nlen = header[3] * 256 + header[2]; - if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); - if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); - if (a->zout + len > a->zout_end) - if (!stbi__zexpand(a, a->zout, len)) return 0; - memcpy(a->zout, a->zbuffer, len); - a->zbuffer += len; - a->zout += len; - return 1; -} - -static int stbi__parse_zlib_header(stbi__zbuf *a) -{ - int cmf = stbi__zget8(a); - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = stbi__zget8(a); - if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png - // window = 1 << (8 + cinfo)... but who cares, we fully buffer output - return 1; -} - -static const stbi_uc stbi__zdefault_length[288] = -{ - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 -}; -static const stbi_uc stbi__zdefault_distance[32] = -{ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 -}; -/* -Init algorithm: -{ - int i; // use <= to match clearly with spec - for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; - for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; - for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; - for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; - - for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; -} -*/ - -static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) -{ - int final, type; - if (parse_header) - if (!stbi__parse_zlib_header(a)) return 0; - a->num_bits = 0; - a->code_buffer = 0; - do { - final = stbi__zreceive(a,1); - type = stbi__zreceive(a,2); - if (type == 0) { - if (!stbi__parse_uncompressed_block(a)) return 0; - } else if (type == 3) { - return 0; - } else { - if (type == 1) { - // use fixed code lengths - if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; - } else { - if (!stbi__compute_huffman_codes(a)) return 0; - } - if (!stbi__parse_huffman_block(a)) return 0; - } - } while (!final); - return 1; -} - -static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) -{ - a->zout_start = obuf; - a->zout = obuf; - a->zout_end = obuf + olen; - a->z_expandable = exp; - - return stbi__parse_zlib(a, parse_header); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) -{ - return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(16384); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer+len; - if (stbi__do_zlib(&a, p, 16384, 1, 0)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) - return (int) (a.zout - a.zout_start); - else - return -1; -} -#endif - -// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 -// simple implementation -// - only 8-bit samples -// - no CRC checking -// - allocates lots of intermediate memory -// - avoids problem of streaming data between subsystems -// - avoids explicit window management -// performance -// - uses stb_zlib, a PD zlib implementation with fast huffman decoding - -#ifndef STBI_NO_PNG -typedef struct -{ - stbi__uint32 length; - stbi__uint32 type; -} stbi__pngchunk; - -static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) -{ - stbi__pngchunk c; - c.length = stbi__get32be(s); - c.type = stbi__get32be(s); - return c; -} - -static int stbi__check_png_header(stbi__context *s) -{ - static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; - int i; - for (i=0; i < 8; ++i) - if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); - return 1; -} - -typedef struct -{ - stbi__context *s; - stbi_uc *idata, *expanded, *out; - int depth; -} stbi__png; - - -enum { - STBI__F_none=0, - STBI__F_sub=1, - STBI__F_up=2, - STBI__F_avg=3, - STBI__F_paeth=4, - // synthetic filters used for first scanline to avoid needing a dummy row of 0s - STBI__F_avg_first, - STBI__F_paeth_first -}; - -static stbi_uc first_row_filter[5] = -{ - STBI__F_none, - STBI__F_sub, - STBI__F_none, - STBI__F_avg_first, - STBI__F_paeth_first -}; - -static int stbi__paeth(int a, int b, int c) -{ - int p = a + b - c; - int pa = abs(p-a); - int pb = abs(p-b); - int pc = abs(p-c); - if (pa <= pb && pa <= pc) return a; - if (pb <= pc) return b; - return c; -} - -static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; - -// create the png data from post-deflated data -static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) -{ - int bytes = (depth == 16? 2 : 1); - stbi__context *s = a->s; - stbi__uint32 i,j,stride = x*out_n*bytes; - stbi__uint32 img_len, img_width_bytes; - int k; - int img_n = s->img_n; // copy it into a local for later - - int output_bytes = out_n*bytes; - int filter_bytes = img_n*bytes; - int width = x; - - STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into - if (!a->out) return stbi__err("outofmem", "Out of memory"); - - if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); - img_width_bytes = (((img_n * x * depth) + 7) >> 3); - img_len = (img_width_bytes + 1) * y; - - // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, - // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), - // so just check for raw_len < img_len always. - if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); - - for (j=0; j < y; ++j) { - stbi_uc *cur = a->out + stride*j; - stbi_uc *prior; - int filter = *raw++; - - if (filter > 4) - return stbi__err("invalid filter","Corrupt PNG"); - - if (depth < 8) { - STBI_ASSERT(img_width_bytes <= x); - cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place - filter_bytes = 1; - width = img_width_bytes; - } - prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above - - // if first row, use special filter that doesn't sample previous row - if (j == 0) filter = first_row_filter[filter]; - - // handle first byte explicitly - for (k=0; k < filter_bytes; ++k) { - switch (filter) { - case STBI__F_none : cur[k] = raw[k]; break; - case STBI__F_sub : cur[k] = raw[k]; break; - case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; - case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; - case STBI__F_avg_first : cur[k] = raw[k]; break; - case STBI__F_paeth_first: cur[k] = raw[k]; break; - } - } - - if (depth == 8) { - if (img_n != out_n) - cur[img_n] = 255; // first pixel - raw += img_n; - cur += out_n; - prior += out_n; - } else if (depth == 16) { - if (img_n != out_n) { - cur[filter_bytes] = 255; // first pixel top byte - cur[filter_bytes+1] = 255; // first pixel bottom byte - } - raw += filter_bytes; - cur += output_bytes; - prior += output_bytes; - } else { - raw += 1; - cur += 1; - prior += 1; - } - - // this is a little gross, so that we don't switch per-pixel or per-component - if (depth < 8 || img_n == out_n) { - int nk = (width - 1)*filter_bytes; - #define STBI__CASE(f) \ - case f: \ - for (k=0; k < nk; ++k) - switch (filter) { - // "none" filter turns into a memcpy here; make that explicit. - case STBI__F_none: memcpy(cur, raw, nk); break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; - STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; - } - #undef STBI__CASE - raw += nk; - } else { - STBI_ASSERT(img_n+1 == out_n); - #define STBI__CASE(f) \ - case f: \ - for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ - for (k=0; k < filter_bytes; ++k) - switch (filter) { - STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; - STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; - } - #undef STBI__CASE - - // the loop above sets the high byte of the pixels' alpha, but for - // 16 bit png files we also need the low byte set. we'll do that here. - if (depth == 16) { - cur = a->out + stride*j; // start at the beginning of the row again - for (i=0; i < x; ++i,cur+=output_bytes) { - cur[filter_bytes+1] = 255; - } - } - } - } - - // we make a separate pass to expand bits to pixels; for performance, - // this could run two scanlines behind the above code, so it won't - // intefere with filtering but will still be in the cache. - if (depth < 8) { - for (j=0; j < y; ++j) { - stbi_uc *cur = a->out + stride*j; - stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; - // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit - // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop - stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range - - // note that the final byte might overshoot and write more data than desired. - // we can allocate enough data that this never writes out of memory, but it - // could also overwrite the next scanline. can it overwrite non-empty data - // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. - // so we need to explicitly clamp the final ones - - if (depth == 4) { - for (k=x*img_n; k >= 2; k-=2, ++in) { - *cur++ = scale * ((*in >> 4) ); - *cur++ = scale * ((*in ) & 0x0f); - } - if (k > 0) *cur++ = scale * ((*in >> 4) ); - } else if (depth == 2) { - for (k=x*img_n; k >= 4; k-=4, ++in) { - *cur++ = scale * ((*in >> 6) ); - *cur++ = scale * ((*in >> 4) & 0x03); - *cur++ = scale * ((*in >> 2) & 0x03); - *cur++ = scale * ((*in ) & 0x03); - } - if (k > 0) *cur++ = scale * ((*in >> 6) ); - if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); - if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); - } else if (depth == 1) { - for (k=x*img_n; k >= 8; k-=8, ++in) { - *cur++ = scale * ((*in >> 7) ); - *cur++ = scale * ((*in >> 6) & 0x01); - *cur++ = scale * ((*in >> 5) & 0x01); - *cur++ = scale * ((*in >> 4) & 0x01); - *cur++ = scale * ((*in >> 3) & 0x01); - *cur++ = scale * ((*in >> 2) & 0x01); - *cur++ = scale * ((*in >> 1) & 0x01); - *cur++ = scale * ((*in ) & 0x01); - } - if (k > 0) *cur++ = scale * ((*in >> 7) ); - if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); - if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); - if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); - if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); - if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); - if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); - } - if (img_n != out_n) { - int q; - // insert alpha = 255 - cur = a->out + stride*j; - if (img_n == 1) { - for (q=x-1; q >= 0; --q) { - cur[q*2+1] = 255; - cur[q*2+0] = cur[q]; - } - } else { - STBI_ASSERT(img_n == 3); - for (q=x-1; q >= 0; --q) { - cur[q*4+3] = 255; - cur[q*4+2] = cur[q*3+2]; - cur[q*4+1] = cur[q*3+1]; - cur[q*4+0] = cur[q*3+0]; - } - } - } - } - } else if (depth == 16) { - // force the image data from big-endian to platform-native. - // this is done in a separate pass due to the decoding relying - // on the data being untouched, but could probably be done - // per-line during decode if care is taken. - stbi_uc *cur = a->out; - stbi__uint16 *cur16 = (stbi__uint16*)cur; - - for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { - *cur16 = (cur[0] << 8) | cur[1]; - } - } - - return 1; -} - -static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) -{ - int bytes = (depth == 16 ? 2 : 1); - int out_bytes = out_n * bytes; - stbi_uc *final; - int p; - if (!interlaced) - return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); - - // de-interlacing - final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); - for (p=0; p < 7; ++p) { - int xorig[] = { 0,4,0,2,0,1,0 }; - int yorig[] = { 0,0,4,0,2,0,1 }; - int xspc[] = { 8,8,4,4,2,2,1 }; - int yspc[] = { 8,8,8,4,4,2,2 }; - int i,j,x,y; - // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 - x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; - y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; - if (x && y) { - stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; - if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { - STBI_FREE(final); - return 0; - } - for (j=0; j < y; ++j) { - for (i=0; i < x; ++i) { - int out_y = j*yspc[p]+yorig[p]; - int out_x = i*xspc[p]+xorig[p]; - memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, - a->out + (j*x+i)*out_bytes, out_bytes); - } - } - STBI_FREE(a->out); - image_data += img_len; - image_data_len -= img_len; - } - } - a->out = final; - - return 1; -} - -static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - // compute color-based transparency, assuming we've - // already got 255 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i=0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 255); - p += 2; - } - } else { - for (i=0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi__uint16 *p = (stbi__uint16*) z->out; - - // compute color-based transparency, assuming we've - // already got 65535 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i = 0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 65535); - p += 2; - } - } else { - for (i = 0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) -{ - stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; - stbi_uc *p, *temp_out, *orig = a->out; - - p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); - if (p == NULL) return stbi__err("outofmem", "Out of memory"); - - // between here and free(out) below, exitting would leak - temp_out = p; - - if (pal_img_n == 3) { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p += 3; - } - } else { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p[3] = palette[n+3]; - p += 4; - } - } - STBI_FREE(a->out); - a->out = temp_out; - - STBI_NOTUSED(len); - - return 1; -} - -static int stbi__unpremultiply_on_load = 0; -static int stbi__de_iphone_flag = 0; - -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag = flag_true_if_should_convert; -} - -static void stbi__de_iphone(stbi__png *z) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - if (s->img_out_n == 3) { // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 3; - } - } else { - STBI_ASSERT(s->img_out_n == 4); - if (stbi__unpremultiply_on_load) { - // convert bgr to rgb and unpremultiply - for (i=0; i < pixel_count; ++i) { - stbi_uc a = p[3]; - stbi_uc t = p[0]; - if (a) { - stbi_uc half = a / 2; - p[0] = (p[2] * 255 + half) / a; - p[1] = (p[1] * 255 + half) / a; - p[2] = ( t * 255 + half) / a; - } else { - p[0] = p[2]; - p[2] = t; - } - p += 4; - } - } else { - // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 4; - } - } - } -} - -#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) - -static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) -{ - stbi_uc palette[1024], pal_img_n=0; - stbi_uc has_trans=0, tc[3]={0}; - stbi__uint16 tc16[3]; - stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, color=0, is_iphone=0; - stbi__context *s = z->s; - - z->expanded = NULL; - z->idata = NULL; - z->out = NULL; - - if (!stbi__check_png_header(s)) return 0; - - if (scan == STBI__SCAN_type) return 1; - - for (;;) { - stbi__pngchunk c = stbi__get_chunk_header(s); - switch (c.type) { - case STBI__PNG_TYPE('C','g','B','I'): - is_iphone = 1; - stbi__skip(s, c.length); - break; - case STBI__PNG_TYPE('I','H','D','R'): { - int comp,filter; - if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); - first = 0; - if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); - s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); - color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); - comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); - filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); - interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); - if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); - if (scan == STBI__SCAN_header) return 1; - } else { - // if paletted, then pal_n is our final components, and - // img_n is # components to decompress/filter. - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); - // if SCAN_header, have to scan to see if we have a tRNS - } - break; - } - - case STBI__PNG_TYPE('P','L','T','E'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); - for (i=0; i < pal_len; ++i) { - palette[i*4+0] = stbi__get8(s); - palette[i*4+1] = stbi__get8(s); - palette[i*4+2] = stbi__get8(s); - palette[i*4+3] = 255; - } - break; - } - - case STBI__PNG_TYPE('t','R','N','S'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); - if (pal_img_n) { - if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } - if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); - if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); - pal_img_n = 4; - for (i=0; i < c.length; ++i) - palette[i*4+3] = stbi__get8(s); - } else { - if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); - if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); - has_trans = 1; - if (z->depth == 16) { - for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is - } else { - for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger - } - } - break; - } - - case STBI__PNG_TYPE('I','D','A','T'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); - if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } - if ((int)(ioff + c.length) < (int)ioff) return 0; - if (ioff + c.length > idata_limit) { - stbi__uint32 idata_limit_old = idata_limit; - stbi_uc *p; - if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - STBI_NOTUSED(idata_limit_old); - p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); - z->idata = p; - } - if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); - ioff += c.length; - break; - } - - case STBI__PNG_TYPE('I','E','N','D'): { - stbi__uint32 raw_len, bpl; - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (scan != STBI__SCAN_load) return 1; - if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); - // initial guess for decoded data size to avoid unnecessary reallocs - bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component - raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; - z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); - if (z->expanded == NULL) return 0; // zlib should set error - STBI_FREE(z->idata); z->idata = NULL; - if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n+1; - else - s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; - if (has_trans) { - if (z->depth == 16) { - if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; - } else { - if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; - } - } - if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) - stbi__de_iphone(z); - if (pal_img_n) { - // pal_img_n == 3 or 4 - s->img_n = pal_img_n; // record the actual colors we had - s->img_out_n = pal_img_n; - if (req_comp >= 3) s->img_out_n = req_comp; - if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } else if (has_trans) { - // non-paletted image with tRNS -> source image has (constant) alpha - ++s->img_n; - } - STBI_FREE(z->expanded); z->expanded = NULL; - return 1; - } - - default: - // if critical, fail - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if ((c.type & (1 << 29)) == 0) { - #ifndef STBI_NO_FAILURE_STRINGS - // not threadsafe - static char invalid_chunk[] = "XXXX PNG chunk not known"; - invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); - invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); - invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); - invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); - #endif - return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); - } - stbi__skip(s, c.length); - break; - } - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - } -} - -static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) -{ - void *result=NULL; - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { - if (p->depth < 8) - ri->bits_per_channel = 8; - else - ri->bits_per_channel = p->depth; - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s->img_out_n) { - if (ri->bits_per_channel == 8) - result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - else - result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - p->s->img_out_n = req_comp; - if (result == NULL) return result; - } - *x = p->s->img_x; - *y = p->s->img_y; - if (n) *n = p->s->img_n; - } - STBI_FREE(p->out); p->out = NULL; - STBI_FREE(p->expanded); p->expanded = NULL; - STBI_FREE(p->idata); p->idata = NULL; - - return result; -} - -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi__png p; - p.s = s; - return stbi__do_png(&p, x,y,comp,req_comp, ri); -} - -static int stbi__png_test(stbi__context *s) -{ - int r; - r = stbi__check_png_header(s); - stbi__rewind(s); - return r; -} - -static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) -{ - if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { - stbi__rewind( p->s ); - return 0; - } - if (x) *x = p->s->img_x; - if (y) *y = p->s->img_y; - if (comp) *comp = p->s->img_n; - return 1; -} - -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__png p; - p.s = s; - return stbi__png_info_raw(&p, x, y, comp); -} - -static int stbi__png_is16(stbi__context *s) -{ - stbi__png p; - p.s = s; - if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) - return 0; - if (p.depth != 16) { - stbi__rewind(p.s); - return 0; - } - return 1; -} -#endif - -// Microsoft/Windows BMP image - -#ifndef STBI_NO_BMP -static int stbi__bmp_test_raw(stbi__context *s) -{ - int r; - int sz; - if (stbi__get8(s) != 'B') return 0; - if (stbi__get8(s) != 'M') return 0; - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - stbi__get32le(s); // discard data offset - sz = stbi__get32le(s); - r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); - return r; -} - -static int stbi__bmp_test(stbi__context *s) -{ - int r = stbi__bmp_test_raw(s); - stbi__rewind(s); - return r; -} - - -// returns 0..31 for the highest set bit -static int stbi__high_bit(unsigned int z) -{ - int n=0; - if (z == 0) return -1; - if (z >= 0x10000) { n += 16; z >>= 16; } - if (z >= 0x00100) { n += 8; z >>= 8; } - if (z >= 0x00010) { n += 4; z >>= 4; } - if (z >= 0x00004) { n += 2; z >>= 2; } - if (z >= 0x00002) { n += 1; z >>= 1; } - return n; -} - -static int stbi__bitcount(unsigned int a) -{ - a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 - a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits - a = (a + (a >> 8)); // max 16 per 8 bits - a = (a + (a >> 16)); // max 32 per 8 bits - return a & 0xff; -} - -// extract an arbitrarily-aligned N-bit value (N=bits) -// from v, and then make it 8-bits long and fractionally -// extend it to full full range. -static int stbi__shiftsigned(unsigned int v, int shift, int bits) -{ - static unsigned int mul_table[9] = { - 0, - 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, - 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, - }; - static unsigned int shift_table[9] = { - 0, 0,0,1,0,2,4,6,0, - }; - if (shift < 0) - v <<= -shift; - else - v >>= shift; - //STBI_ASSERT(v >= 0 && v < 256); // nsharp: silence compiler warning - STBI_ASSERT(v < 256); - v >>= (8-bits); - STBI_ASSERT(bits >= 0 && bits <= 8); - return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; -} - -typedef struct -{ - int bpp, offset, hsz; - unsigned int mr,mg,mb,ma, all_a; -} stbi__bmp_data; - -static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) -{ - int hsz; - if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - info->offset = stbi__get32le(s); - info->hsz = hsz = stbi__get32le(s); - info->mr = info->mg = info->mb = info->ma = 0; - - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); - if (hsz == 12) { - s->img_x = stbi__get16le(s); - s->img_y = stbi__get16le(s); - } else { - s->img_x = stbi__get32le(s); - s->img_y = stbi__get32le(s); - } - if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); - info->bpp = stbi__get16le(s); - if (hsz != 12) { - int compress = stbi__get32le(s); - if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); - stbi__get32le(s); // discard sizeof - stbi__get32le(s); // discard hres - stbi__get32le(s); // discard vres - stbi__get32le(s); // discard colorsused - stbi__get32le(s); // discard max important - if (hsz == 40 || hsz == 56) { - if (hsz == 56) { - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - } - if (info->bpp == 16 || info->bpp == 32) { - if (compress == 0) { - if (info->bpp == 32) { - info->mr = 0xffu << 16; - info->mg = 0xffu << 8; - info->mb = 0xffu << 0; - info->ma = 0xffu << 24; - info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 - } else { - info->mr = 31u << 10; - info->mg = 31u << 5; - info->mb = 31u << 0; - } - } else if (compress == 3) { - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - // not documented, but generated by photoshop and handled by mspaint - if (info->mr == info->mg && info->mg == info->mb) { - // ?!?!? - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else { - int i; - if (hsz != 108 && hsz != 124) - return stbi__errpuc("bad BMP", "bad BMP"); - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->ma = stbi__get32le(s); - stbi__get32le(s); // discard color space - for (i=0; i < 12; ++i) - stbi__get32le(s); // discard color space parameters - if (hsz == 124) { - stbi__get32le(s); // discard rendering intent - stbi__get32le(s); // discard offset of profile data - stbi__get32le(s); // discard size of profile data - stbi__get32le(s); // discard reserved - } - } - } - return (void *) 1; -} - - -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - unsigned int mr=0,mg=0,mb=0,ma=0, all_a; - stbi_uc pal[256][4]; - int psize=0,i,j,width; - int flip_vertically, pad, target; - stbi__bmp_data info; - STBI_NOTUSED(ri); - - info.all_a = 255; - if (stbi__bmp_parse_header(s, &info) == NULL) - return NULL; // error code already set - - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - - mr = info.mr; - mg = info.mg; - mb = info.mb; - ma = info.ma; - all_a = info.all_a; - - if (info.hsz == 12) { - if (info.bpp < 24) - psize = (info.offset - 14 - 24) / 3; - } else { - if (info.bpp < 16) - psize = (info.offset - 14 - info.hsz) >> 2; - } - - s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else - target = s->img_n; // if they want monochrome, we'll post-convert - - // sanity-check size - if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "Corrupt BMP"); - - out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (info.bpp < 16) { - int z=0; - if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } - for (i=0; i < psize; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - if (info.hsz != 12) stbi__get8(s); - pal[i][3] = 255; - } - stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); - if (info.bpp == 1) width = (s->img_x + 7) >> 3; - else if (info.bpp == 4) width = (s->img_x + 1) >> 1; - else if (info.bpp == 8) width = s->img_x; - else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } - pad = (-width)&3; - if (info.bpp == 1) { - for (j=0; j < (int) s->img_y; ++j) { - int bit_offset = 7, v = stbi__get8(s); - for (i=0; i < (int) s->img_x; ++i) { - int color = (v>>bit_offset)&0x1; - out[z++] = pal[color][0]; - out[z++] = pal[color][1]; - out[z++] = pal[color][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - if((--bit_offset) < 0) { - bit_offset = 7; - v = stbi__get8(s); - } - } - stbi__skip(s, pad); - } - } else { - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=stbi__get8(s),v2=0; - if (info.bpp == 4) { - v2 = v & 15; - v >>= 4; - } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (info.bpp == 8) ? stbi__get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - } - stbi__skip(s, pad); - } - } - } else { - int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; - int z = 0; - int easy=0; - stbi__skip(s, info.offset - 14 - info.hsz); - if (info.bpp == 24) width = 3 * s->img_x; - else if (info.bpp == 16) width = 2*s->img_x; - else /* bpp = 32 and pad = 0 */ width=0; - pad = (-width) & 3; - if (info.bpp == 24) { - easy = 1; - } else if (info.bpp == 32) { - if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) - easy = 2; - } - if (!easy) { - if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - // right shift amt to put high bit in position #7 - rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); - gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); - bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); - ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); - } - for (j=0; j < (int) s->img_y; ++j) { - if (easy) { - for (i=0; i < (int) s->img_x; ++i) { - unsigned char a; - out[z+2] = stbi__get8(s); - out[z+1] = stbi__get8(s); - out[z+0] = stbi__get8(s); - z += 3; - a = (easy == 2 ? stbi__get8(s) : 255); - all_a |= a; - if (target == 4) out[z++] = a; - } - } else { - int bpp = info.bpp; - for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); - unsigned int a; - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); - a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); - all_a |= a; - if (target == 4) out[z++] = STBI__BYTECAST(a); - } - } - stbi__skip(s, pad); - } - } - - // if alpha channel is all 0s, replace with all 255s - if (target == 4 && all_a == 0) - for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) - out[i] = 255; - - if (flip_vertically) { - stbi_uc t; - for (j=0; j < (int) s->img_y>>1; ++j) { - stbi_uc *p1 = out + j *s->img_x*target; - stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; - for (i=0; i < (int) s->img_x*target; ++i) { - t = p1[i]; p1[i] = p2[i]; p2[i] = t; - } - } - } - - if (req_comp && req_comp != target) { - out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - return out; -} -#endif - -// Targa Truevision - TGA -// by Jonathan Dummer -#ifndef STBI_NO_TGA -// returns STBI_rgb or whatever, 0 on error -static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) -{ - // only RGB or RGBA (incl. 16bit) or grey allowed - if (is_rgb16) *is_rgb16 = 0; - switch(bits_per_pixel) { - case 8: return STBI_grey; - case 16: if(is_grey) return STBI_grey_alpha; - // fallthrough - case 15: if(is_rgb16) *is_rgb16 = 1; - return STBI_rgb; - case 24: // fallthrough - case 32: return bits_per_pixel/8; - default: return 0; - } -} - -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) -{ - int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; - int sz, tga_colormap_type; - stbi__get8(s); // discard Offset - tga_colormap_type = stbi__get8(s); // colormap type - if( tga_colormap_type > 1 ) { - stbi__rewind(s); - return 0; // only RGB or indexed allowed - } - tga_image_type = stbi__get8(s); // image type - if ( tga_colormap_type == 1 ) { // colormapped (paletted) image - if (tga_image_type != 1 && tga_image_type != 9) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip image x and y origin - tga_colormap_bpp = sz; - } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE - if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { - stbi__rewind(s); - return 0; // only RGB or grey allowed, +/- RLE - } - stbi__skip(s,9); // skip colormap specification and image x/y origin - tga_colormap_bpp = 0; - } - tga_w = stbi__get16le(s); - if( tga_w < 1 ) { - stbi__rewind(s); - return 0; // test width - } - tga_h = stbi__get16le(s); - if( tga_h < 1 ) { - stbi__rewind(s); - return 0; // test height - } - tga_bits_per_pixel = stbi__get8(s); // bits per pixel - stbi__get8(s); // ignore alpha bits - if (tga_colormap_bpp != 0) { - if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { - // when using a colormap, tga_bits_per_pixel is the size of the indexes - // I don't think anything but 8 or 16bit indexes makes sense - stbi__rewind(s); - return 0; - } - tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); - } else { - tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); - } - if(!tga_comp) { - stbi__rewind(s); - return 0; - } - if (x) *x = tga_w; - if (y) *y = tga_h; - if (comp) *comp = tga_comp; - return 1; // seems to have passed everything -} - -static int stbi__tga_test(stbi__context *s) -{ - int res = 0; - int sz, tga_color_type; - stbi__get8(s); // discard Offset - tga_color_type = stbi__get8(s); // color type - if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed - sz = stbi__get8(s); // image type - if ( tga_color_type == 1 ) { // colormapped (paletted) image - if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - stbi__skip(s,4); // skip image x and y origin - } else { // "normal" image w/o colormap - if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE - stbi__skip(s,9); // skip colormap specification and image x/y origin - } - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height - sz = stbi__get8(s); // bits per pixel - if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - - res = 1; // if we got this far, everything's good and we can return 1 instead of 0 - -errorEnd: - stbi__rewind(s); - return res; -} - -// read 16bit value and convert to 24bit RGB -static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) -{ - stbi__uint16 px = (stbi__uint16)stbi__get16le(s); - stbi__uint16 fiveBitMask = 31; - // we have 3 channels with 5bits each - int r = (px >> 10) & fiveBitMask; - int g = (px >> 5) & fiveBitMask; - int b = px & fiveBitMask; - // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later - out[0] = (stbi_uc)((r * 255)/31); - out[1] = (stbi_uc)((g * 255)/31); - out[2] = (stbi_uc)((b * 255)/31); - - // some people claim that the most significant bit might be used for alpha - // (possibly if an alpha-bit is set in the "image descriptor byte") - // but that only made 16bit test images completely translucent.. - // so let's treat all 15 and 16bit TGAs as RGB with no alpha. -} - -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - // read in the TGA header stuff - int tga_offset = stbi__get8(s); - int tga_indexed = stbi__get8(s); - int tga_image_type = stbi__get8(s); - int tga_is_RLE = 0; - int tga_palette_start = stbi__get16le(s); - int tga_palette_len = stbi__get16le(s); - int tga_palette_bits = stbi__get8(s); - int tga_x_origin = stbi__get16le(s); - int tga_y_origin = stbi__get16le(s); - int tga_width = stbi__get16le(s); - int tga_height = stbi__get16le(s); - int tga_bits_per_pixel = stbi__get8(s); - int tga_comp, tga_rgb16=0; - int tga_inverted = stbi__get8(s); - // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) - // image data - unsigned char *tga_data; - unsigned char *tga_palette = NULL; - int i, j; - unsigned char raw_data[4] = {0}; - int RLE_count = 0; - int RLE_repeating = 0; - int read_next_pixel = 1; - STBI_NOTUSED(ri); - - // do a tiny bit of precessing - if ( tga_image_type >= 8 ) - { - tga_image_type -= 8; - tga_is_RLE = 1; - } - tga_inverted = 1 - ((tga_inverted >> 5) & 1); - - // If I'm paletted, then I'll use the number of bits from the palette - if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); - else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); - - if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency - return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); - - // tga info - *x = tga_width; - *y = tga_height; - if (comp) *comp = tga_comp; - - if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) - return stbi__errpuc("too large", "Corrupt TGA"); - - tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); - if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); - - // skip to the data's starting position (offset usually = 0) - stbi__skip(s, tga_offset ); - - if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { - for (i=0; i < tga_height; ++i) { - int row = tga_inverted ? tga_height -i - 1 : i; - stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; - stbi__getn(s, tga_row, tga_width * tga_comp); - } - } else { - // do I need to load a palette? - if ( tga_indexed) - { - // any data to skip? (offset usually = 0) - stbi__skip(s, tga_palette_start ); - // load the palette - tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); - if (!tga_palette) { - STBI_FREE(tga_data); - return stbi__errpuc("outofmem", "Out of memory"); - } - if (tga_rgb16) { - stbi_uc *pal_entry = tga_palette; - STBI_ASSERT(tga_comp == STBI_rgb); - for (i=0; i < tga_palette_len; ++i) { - stbi__tga_read_rgb16(s, pal_entry); - pal_entry += tga_comp; - } - } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { - STBI_FREE(tga_data); - STBI_FREE(tga_palette); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - } - // load the data - for (i=0; i < tga_width * tga_height; ++i) - { - // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? - if ( tga_is_RLE ) - { - if ( RLE_count == 0 ) - { - // yep, get the next byte as a RLE command - int RLE_cmd = stbi__get8(s); - RLE_count = 1 + (RLE_cmd & 127); - RLE_repeating = RLE_cmd >> 7; - read_next_pixel = 1; - } else if ( !RLE_repeating ) - { - read_next_pixel = 1; - } - } else - { - read_next_pixel = 1; - } - // OK, if I need to read a pixel, do it now - if ( read_next_pixel ) - { - // load however much data we did have - if ( tga_indexed ) - { - // read in index, then perform the lookup - int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); - if ( pal_idx >= tga_palette_len ) { - // invalid index - pal_idx = 0; - } - pal_idx *= tga_comp; - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = tga_palette[pal_idx+j]; - } - } else if(tga_rgb16) { - STBI_ASSERT(tga_comp == STBI_rgb); - stbi__tga_read_rgb16(s, raw_data); - } else { - // read in the data raw - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = stbi__get8(s); - } - } - // clear the reading flag for the next pixel - read_next_pixel = 0; - } // end of reading a pixel - - // copy data - for (j = 0; j < tga_comp; ++j) - tga_data[i*tga_comp+j] = raw_data[j]; - - // in case we're in RLE mode, keep counting down - --RLE_count; - } - // do I need to invert the image? - if ( tga_inverted ) - { - for (j = 0; j*2 < tga_height; ++j) - { - int index1 = j * tga_width * tga_comp; - int index2 = (tga_height - 1 - j) * tga_width * tga_comp; - for (i = tga_width * tga_comp; i > 0; --i) - { - unsigned char temp = tga_data[index1]; - tga_data[index1] = tga_data[index2]; - tga_data[index2] = temp; - ++index1; - ++index2; - } - } - } - // clear my palette, if I had one - if ( tga_palette != NULL ) - { - STBI_FREE( tga_palette ); - } - } - - // swap RGB - if the source data was RGB16, it already is in the right order - if (tga_comp >= 3 && !tga_rgb16) - { - unsigned char* tga_pixel = tga_data; - for (i=0; i < tga_width * tga_height; ++i) - { - unsigned char temp = tga_pixel[0]; - tga_pixel[0] = tga_pixel[2]; - tga_pixel[2] = temp; - tga_pixel += tga_comp; - } - } - - // convert to target component count - if (req_comp && req_comp != tga_comp) - tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); - - // the things I do to get rid of an error message, and yet keep - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = - tga_x_origin = tga_y_origin = 0; - // OK, done - return tga_data; -} -#endif - -// ************************************************************************************************* -// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s) -{ - int r = (stbi__get32be(s) == 0x38425053); - stbi__rewind(s); - return r; -} - -static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) -{ - int count, nleft, len; - - count = 0; - while ((nleft = pixelCount - count) > 0) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - if (len > nleft) return 0; // corrupt data - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len = 257 - len; - if (len > nleft) return 0; // corrupt data - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } - } - - return 1; -} - -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - int pixelCount; - int channelCount, compression; - int channel, i; - int bitdepth; - int w,h; - stbi_uc *out; - STBI_NOTUSED(ri); - - // Check identifier - if (stbi__get32be(s) != 0x38425053) // "8BPS" - return stbi__errpuc("not PSD", "Corrupt PSD image"); - - // Check file type version. - if (stbi__get16be(s) != 1) - return stbi__errpuc("wrong version", "Unsupported version of PSD image"); - - // Skip 6 reserved bytes. - stbi__skip(s, 6 ); - - // Read the number of channels (R, G, B, A, etc). - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) - return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); - - // Read the rows and columns of the image. - h = stbi__get32be(s); - w = stbi__get32be(s); - - // Make sure the depth is 8 bits. - bitdepth = stbi__get16be(s); - if (bitdepth != 8 && bitdepth != 16) - return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); - - // Make sure the color mode is RGB. - // Valid options are: - // 0: Bitmap - // 1: Grayscale - // 2: Indexed color - // 3: RGB color - // 4: CMYK color - // 7: Multichannel - // 8: Duotone - // 9: Lab color - if (stbi__get16be(s) != 3) - return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); - - // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) - stbi__skip(s,stbi__get32be(s) ); - - // Skip the image resources. (resolution, pen tool paths, etc) - stbi__skip(s, stbi__get32be(s) ); - - // Skip the reserved data. - stbi__skip(s, stbi__get32be(s) ); - - // Find out if the data is compressed. - // Known values: - // 0: no compression - // 1: RLE compressed - compression = stbi__get16be(s); - if (compression > 1) - return stbi__errpuc("bad compression", "PSD has an unknown compression format"); - - // Check size - if (!stbi__mad3sizes_valid(4, w, h, 0)) - return stbi__errpuc("too large", "Corrupt PSD"); - - // Create the destination image. - - if (!compression && bitdepth == 16 && bpc == 16) { - out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); - ri->bits_per_channel = 16; - } else - out = (stbi_uc *) stbi__malloc(4 * w*h); - - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - pixelCount = w*h; - - // Initialize the data to zero. - //memset( out, 0, pixelCount * 4 ); - - // Finally, the image data. - if (compression) { - // RLE as used by .PSD and .TIFF - // Loop until you get the number of unpacked bytes you are expecting: - // Read the next source byte into n. - // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. - // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. - // Else if n is 128, noop. - // Endloop - - // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, - // which we're going to just skip. - stbi__skip(s, h * channelCount * 2 ); - - // Read the RLE data by channel. - for (channel = 0; channel < 4; channel++) { - stbi_uc *p; - - p = out+channel; - if (channel >= channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = (channel == 3 ? 255 : 0); - } else { - // Read the RLE data. - if (!stbi__psd_decode_rle(s, p, pixelCount)) { - STBI_FREE(out); - return stbi__errpuc("corrupt", "bad RLE data"); - } - } - } - - } else { - // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. - - // Read the data by channel. - for (channel = 0; channel < 4; channel++) { - if (channel >= channelCount) { - // Fill this channel with default data. - if (bitdepth == 16 && bpc == 16) { - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - stbi__uint16 val = channel == 3 ? 65535 : 0; - for (i = 0; i < pixelCount; i++, q += 4) - *q = val; - } else { - stbi_uc *p = out+channel; - stbi_uc val = channel == 3 ? 255 : 0; - for (i = 0; i < pixelCount; i++, p += 4) - *p = val; - } - } else { - if (ri->bits_per_channel == 16) { // output bpc - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - for (i = 0; i < pixelCount; i++, q += 4) - *q = (stbi__uint16) stbi__get16be(s); - } else { - stbi_uc *p = out+channel; - if (bitdepth == 16) { // input bpc - for (i = 0; i < pixelCount; i++, p += 4) - *p = (stbi_uc) (stbi__get16be(s) >> 8); - } else { - for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); - } - } - } - } - } - - // remove weird white matte from PSD - if (channelCount >= 4) { - if (ri->bits_per_channel == 16) { - for (i=0; i < w*h; ++i) { - stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; - if (pixel[3] != 0 && pixel[3] != 65535) { - float a = pixel[3] / 65535.0f; - float ra = 1.0f / a; - float inv_a = 65535.0f * (1 - ra); - pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); - pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); - pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); - } - } - } else { - for (i=0; i < w*h; ++i) { - unsigned char *pixel = out + 4*i; - if (pixel[3] != 0 && pixel[3] != 255) { - float a = pixel[3] / 255.0f; - float ra = 1.0f / a; - float inv_a = 255.0f * (1 - ra); - pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); - pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); - pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); - } - } - } - } - - // convert to desired output format - if (req_comp && req_comp != 4) { - if (ri->bits_per_channel == 16) - out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); - else - out = stbi__convert_format(out, 4, req_comp, w, h); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - if (comp) *comp = 4; - *y = h; - *x = w; - - return out; -} -#endif - -// ************************************************************************************************* -// Softimage PIC loader -// by Tom Seddon -// -// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format -// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ - -#ifndef STBI_NO_PIC -static int stbi__pic_is4(stbi__context *s,const char *str) -{ - int i; - for (i=0; i<4; ++i) - if (stbi__get8(s) != (stbi_uc)str[i]) - return 0; - - return 1; -} - -static int stbi__pic_test_core(stbi__context *s) -{ - int i; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) - return 0; - - for(i=0;i<84;++i) - stbi__get8(s); - - if (!stbi__pic_is4(s,"PICT")) - return 0; - - return 1; -} - -typedef struct -{ - stbi_uc size,type,channel; -} stbi__pic_packet; - -static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) -{ - int mask=0x80, i; - - for (i=0; i<4; ++i, mask>>=1) { - if (channel & mask) { - if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); - dest[i]=stbi__get8(s); - } - } - - return dest; -} - -static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) -{ - int mask=0x80,i; - - for (i=0;i<4; ++i, mask>>=1) - if (channel&mask) - dest[i]=src[i]; -} - -static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) -{ - int act_comp=0,num_packets=0,y,chained; - stbi__pic_packet packets[10]; - - // this will (should...) cater for even some bizarre stuff like having data - // for the same channel in multiple packets. - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return stbi__errpuc("bad format","too many packets"); - - packet = &packets[num_packets++]; - - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - - act_comp |= packet->channel; - - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); - if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? - - for(y=0; ytype) { - default: - return stbi__errpuc("bad format","packet has bad compression type"); - - case 0: {//uncompressed - int x; - - for(x=0;xchannel,dest)) - return 0; - break; - } - - case 1://Pure RLE - { - int left=width, i; - - while (left>0) { - stbi_uc count,value[4]; - - count=stbi__get8(s); - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); - - if (count > left) - count = (stbi_uc) left; - - if (!stbi__readval(s,packet->channel,value)) return 0; - - for(i=0; ichannel,dest,value); - left -= count; - } - } - break; - - case 2: {//Mixed RLE - int left=width; - while (left>0) { - int count = stbi__get8(s), i; - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); - - if (count >= 128) { // Repeated - stbi_uc value[4]; - - if (count==128) - count = stbi__get16be(s); - else - count -= 127; - if (count > left) - return stbi__errpuc("bad file","scanline overrun"); - - if (!stbi__readval(s,packet->channel,value)) - return 0; - - for(i=0;ichannel,dest,value); - } else { // Raw - ++count; - if (count>left) return stbi__errpuc("bad file","scanline overrun"); - - for(i=0;ichannel,dest)) - return 0; - } - left-=count; - } - break; - } - } - } - } - - return result; -} - -static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) -{ - stbi_uc *result; - int i, x,y, internal_comp; - STBI_NOTUSED(ri); - - if (!comp) comp = &internal_comp; - - for (i=0; i<92; ++i) - stbi__get8(s); - - x = stbi__get16be(s); - y = stbi__get16be(s); - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); - - stbi__get32be(s); //skip `ratio' - stbi__get16be(s); //skip `fields' - stbi__get16be(s); //skip `pad' - - // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); - memset(result, 0xff, x*y*4); - - if (!stbi__pic_load_core(s,x,y,comp, result)) { - STBI_FREE(result); - result=0; - } - *px = x; - *py = y; - if (req_comp == 0) req_comp = *comp; - result=stbi__convert_format(result,4,req_comp,x,y); - - return result; -} - -static int stbi__pic_test(stbi__context *s) -{ - int r = stbi__pic_test_core(s); - stbi__rewind(s); - return r; -} -#endif - -// ************************************************************************************************* -// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb - -#ifndef STBI_NO_GIF -typedef struct -{ - stbi__int16 prefix; - stbi_uc first; - stbi_uc suffix; -} stbi__gif_lzw; - -typedef struct -{ - int w,h; - stbi_uc *out; // output buffer (always 4 components) - stbi_uc *background; // The current "background" as far as a gif is concerned - stbi_uc *history; - int flags, bgindex, ratio, transparent, eflags; - stbi_uc pal[256][4]; - stbi_uc lpal[256][4]; - stbi__gif_lzw codes[8192]; - stbi_uc *color_table; - int parse, step; - int lflags; - int start_x, start_y; - int max_x, max_y; - int cur_x, cur_y; - int line_size; - int delay; -} stbi__gif; - -static int stbi__gif_test_raw(stbi__context *s) -{ - int sz; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; - sz = stbi__get8(s); - if (sz != '9' && sz != '7') return 0; - if (stbi__get8(s) != 'a') return 0; - return 1; -} - -static int stbi__gif_test(stbi__context *s) -{ - int r = stbi__gif_test_raw(s); - stbi__rewind(s); - return r; -} - -static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) -{ - int i; - for (i=0; i < num_entries; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - pal[i][3] = transp == i ? 0 : 255; - } -} - -static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) -{ - stbi_uc version; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') - return stbi__err("not GIF", "Corrupt GIF"); - - version = stbi__get8(s); - if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); - if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); - - stbi__g_failure_reason = ""; - g->w = stbi__get16le(s); - g->h = stbi__get16le(s); - g->flags = stbi__get8(s); - g->bgindex = stbi__get8(s); - g->ratio = stbi__get8(s); - g->transparent = -1; - - if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments - - if (is_info) return 1; - - if (g->flags & 0x80) - stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); - - return 1; -} - -static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); - if (!stbi__gif_header(s, g, comp, 1)) { - STBI_FREE(g); - stbi__rewind( s ); - return 0; - } - if (x) *x = g->w; - if (y) *y = g->h; - STBI_FREE(g); - return 1; -} - -static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) -{ - stbi_uc *p, *c; - int idx; - - // recurse to decode the prefixes, since the linked-list is backwards, - // and working backwards through an interleaved image would be nasty - if (g->codes[code].prefix >= 0) - stbi__out_gif_code(g, g->codes[code].prefix); - - if (g->cur_y >= g->max_y) return; - - idx = g->cur_x + g->cur_y; - p = &g->out[idx]; - g->history[idx / 4] = 1; - - c = &g->color_table[g->codes[code].suffix * 4]; - if (c[3] > 128) { // don't render transparent pixels; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } - g->cur_x += 4; - - if (g->cur_x >= g->max_x) { - g->cur_x = g->start_x; - g->cur_y += g->step; - - while (g->cur_y >= g->max_y && g->parse > 0) { - g->step = (1 << g->parse) * g->line_size; - g->cur_y = g->start_y + (g->step >> 1); - --g->parse; - } - } -} - -static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) -{ - stbi_uc lzw_cs; - stbi__int32 len, init_code; - stbi__uint32 first; - stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; - stbi__gif_lzw *p; - - lzw_cs = stbi__get8(s); - if (lzw_cs > 12) return NULL; - clear = 1 << lzw_cs; - first = 1; - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - bits = 0; - valid_bits = 0; - for (init_code = 0; init_code < clear; init_code++) { - g->codes[init_code].prefix = -1; - g->codes[init_code].first = (stbi_uc) init_code; - g->codes[init_code].suffix = (stbi_uc) init_code; - } - - // support no starting clear code - avail = clear+2; - oldcode = -1; - - len = 0; - for(;;) { - if (valid_bits < codesize) { - if (len == 0) { - len = stbi__get8(s); // start new block - if (len == 0) - return g->out; - } - --len; - bits |= (stbi__int32) stbi__get8(s) << valid_bits; - valid_bits += 8; - } else { - stbi__int32 code = bits & codemask; - bits >>= codesize; - valid_bits -= codesize; - // @OPTIMIZE: is there some way we can accelerate the non-clear path? - if (code == clear) { // clear code - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - avail = clear + 2; - oldcode = -1; - first = 0; - } else if (code == clear + 1) { // end of stream code - stbi__skip(s, len); - while ((len = stbi__get8(s)) > 0) - stbi__skip(s,len); - return g->out; - } else if (code <= avail) { - if (first) { - return stbi__errpuc("no clear code", "Corrupt GIF"); - } - - if (oldcode >= 0) { - p = &g->codes[avail++]; - if (avail > 8192) { - return stbi__errpuc("too many codes", "Corrupt GIF"); - } - - p->prefix = (stbi__int16) oldcode; - p->first = g->codes[oldcode].first; - p->suffix = (code == avail) ? p->first : g->codes[code].first; - } else if (code == avail) - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - - stbi__out_gif_code(g, (stbi__uint16) code); - - if ((avail & codemask) == 0 && avail <= 0x0FFF) { - codesize++; - codemask = (1 << codesize) - 1; - } - - oldcode = code; - } else { - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - } - } - } -} - -// this function is designed to support animated gifs, although stb_image doesn't support it -// two back is the image from two frames ago, used for a very specific disposal format -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) -{ - int dispose; - int first_frame; - int pi; - int pcount; - STBI_NOTUSED(req_comp); - - // on first frame, any non-written pixels get the background colour (non-transparent) - first_frame = 0; - if (g->out == 0) { - if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header - if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) - return stbi__errpuc("too large", "GIF image is too large"); - pcount = g->w * g->h; - g->out = (stbi_uc *) stbi__malloc(4 * pcount); - g->background = (stbi_uc *) stbi__malloc(4 * pcount); - g->history = (stbi_uc *) stbi__malloc(pcount); - if (!g->out || !g->background || !g->history) - return stbi__errpuc("outofmem", "Out of memory"); - - // image is treated as "transparent" at the start - ie, nothing overwrites the current background; - // background colour is only used for pixels that are not rendered first frame, after that "background" - // color refers to the color that was there the previous frame. - memset(g->out, 0x00, 4 * pcount); - memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) - memset(g->history, 0x00, pcount); // pixels that were affected previous frame - first_frame = 1; - } else { - // second frame - how do we dispoase of the previous one? - dispose = (g->eflags & 0x1C) >> 2; - pcount = g->w * g->h; - - if ((dispose == 3) && (two_back == 0)) { - dispose = 2; // if I don't have an image to revert back to, default to the old background - } - - if (dispose == 3) { // use previous graphic - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); - } - } - } else if (dispose == 2) { - // restore what was changed last frame to background before that frame; - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi]) { - memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); - } - } - } else { - // This is a non-disposal case eithe way, so just - // leave the pixels as is, and they will become the new background - // 1: do not dispose - // 0: not specified. - } - - // background is what out is after the undoing of the previou frame; - memcpy( g->background, g->out, 4 * g->w * g->h ); - } - - // clear my history; - memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame - - for (;;) { - int tag = stbi__get8(s); - switch (tag) { - case 0x2C: /* Image Descriptor */ - { - stbi__int32 x, y, w, h; - stbi_uc *o; - - x = stbi__get16le(s); - y = stbi__get16le(s); - w = stbi__get16le(s); - h = stbi__get16le(s); - if (((x + w) > (g->w)) || ((y + h) > (g->h))) - return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); - - g->line_size = g->w * 4; - g->start_x = x * 4; - g->start_y = y * g->line_size; - g->max_x = g->start_x + w * 4; - g->max_y = g->start_y + h * g->line_size; - g->cur_x = g->start_x; - g->cur_y = g->start_y; - - // if the width of the specified rectangle is 0, that means - // we may not see *any* pixels or the image is malformed; - // to make sure this is caught, move the current y down to - // max_y (which is what out_gif_code checks). - if (w == 0) - g->cur_y = g->max_y; - - g->lflags = stbi__get8(s); - - if (g->lflags & 0x40) { - g->step = 8 * g->line_size; // first interlaced spacing - g->parse = 3; - } else { - g->step = g->line_size; - g->parse = 0; - } - - if (g->lflags & 0x80) { - stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (stbi_uc *) g->lpal; - } else if (g->flags & 0x80) { - g->color_table = (stbi_uc *) g->pal; - } else - return stbi__errpuc("missing color table", "Corrupt GIF"); - - o = stbi__process_gif_raster(s, g); - if (!o) return NULL; - - // if this was the first frame, - pcount = g->w * g->h; - if (first_frame && (g->bgindex > 0)) { - // if first frame, any pixel not drawn to gets the background color - for (pi = 0; pi < pcount; ++pi) { - if (g->history[pi] == 0) { - g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; - memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); - } - } - } - - return o; - } - - case 0x21: // Comment Extension. - { - int len; - int ext = stbi__get8(s); - if (ext == 0xF9) { // Graphic Control Extension. - len = stbi__get8(s); - if (len == 4) { - g->eflags = stbi__get8(s); - g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. - - // unset old transparent - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 255; - } - if (g->eflags & 0x01) { - g->transparent = stbi__get8(s); - if (g->transparent >= 0) { - g->pal[g->transparent][3] = 0; - } - } else { - // don't need transparent - stbi__skip(s, 1); - g->transparent = -1; - } - } else { - stbi__skip(s, len); - break; - } - } - while ((len = stbi__get8(s)) != 0) { - stbi__skip(s, len); - } - break; - } - - case 0x3B: // gif stream termination code - return (stbi_uc *) s; // using '1' causes warning on some compilers - - default: - return stbi__errpuc("unknown code", "Corrupt GIF"); - } - } -} - -static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) -{ - if (stbi__gif_test(s)) { - int layers = 0; - stbi_uc *u = 0; - stbi_uc *out = 0; - stbi_uc *two_back = 0; - stbi__gif g; - int stride; - memset(&g, 0, sizeof(g)); - if (delays) { - *delays = 0; - } - - do { - u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - - if (u) { - *x = g.w; - *y = g.h; - ++layers; - stride = g.w * g.h * 4; - - if (out) { - out = (stbi_uc*) STBI_REALLOC( out, layers * stride ); - if (delays) { - *delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers ); - } - } else { - out = (stbi_uc*)stbi__malloc( layers * stride ); - if (delays) { - *delays = (int*) stbi__malloc( layers * sizeof(int) ); - } - } - memcpy( out + ((layers - 1) * stride), u, stride ); - if (layers >= 2) { - two_back = out - 2 * stride; - } - - if (delays) { - (*delays)[layers - 1U] = g.delay; - } - } - } while (u != 0); - - // free temp buffer; - STBI_FREE(g.out); - STBI_FREE(g.history); - STBI_FREE(g.background); - - // do the final conversion after loading everything; - if (req_comp && req_comp != 4) - out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); - - *z = layers; - return out; - } else { - return stbi__errpuc("not GIF", "Image was not as a gif type."); - } -} - -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *u = 0; - stbi__gif g; - memset(&g, 0, sizeof(g)); - STBI_NOTUSED(ri); - - u = stbi__gif_load_next(s, &g, comp, req_comp, 0); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - if (u) { - *x = g.w; - *y = g.h; - - // moved conversion to after successful load so that the same - // can be done for multiple frames. - if (req_comp && req_comp != 4) - u = stbi__convert_format(u, 4, req_comp, g.w, g.h); - } else if (g.out) { - // if there was an error and we allocated an image buffer, free it! - STBI_FREE(g.out); - } - - // free buffers needed for multiple frame loading; - STBI_FREE(g.history); - STBI_FREE(g.background); - - return u; -} - -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) -{ - return stbi__gif_info_raw(s,x,y,comp); -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR loader -// originally by Nicolas Schulz -#ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context *s, const char *signature) -{ - int i; - for (i=0; signature[i]; ++i) - if (stbi__get8(s) != signature[i]) - return 0; - stbi__rewind(s); - return 1; -} - -static int stbi__hdr_test(stbi__context* s) -{ - int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); - stbi__rewind(s); - if(!r) { - r = stbi__hdr_test_core(s, "#?RGBE\n"); - stbi__rewind(s); - } - return r; -} - -#define STBI__HDR_BUFLEN 1024 -static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) -{ - int len=0; - char c = '\0'; - - c = (char) stbi__get8(z); - - while (!stbi__at_eof(z) && c != '\n') { - buffer[len++] = c; - if (len == STBI__HDR_BUFLEN-1) { - // flush to end of line - while (!stbi__at_eof(z) && stbi__get8(z) != '\n') - ; - break; - } - c = (char) stbi__get8(z); - } - - buffer[len] = 0; - return buffer; -} - -static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) -{ - if ( input[3] != 0 ) { - float f1; - // Exponent - f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); - if (req_comp <= 2) - output[0] = (input[0] + input[1] + input[2]) * f1 / 3; - else { - output[0] = input[0] * f1; - output[1] = input[1] * f1; - output[2] = input[2] * f1; - } - if (req_comp == 2) output[1] = 1; - if (req_comp == 4) output[3] = 1; - } else { - switch (req_comp) { - case 4: output[3] = 1; /* fallthrough */ - case 3: output[0] = output[1] = output[2] = 0; - break; - case 2: output[1] = 1; /* fallthrough */ - case 1: output[0] = 0; - break; - } - } -} - -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int width, height; - stbi_uc *scanline; - float *hdr_data; - int len; - unsigned char count, value; - int i, j, k, c1,c2, z; - const char *headerToken; - STBI_NOTUSED(ri); - - // Check identifier - headerToken = stbi__hdr_gettoken(s,buffer); - if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) - return stbi__errpf("not HDR", "Corrupt HDR image"); - - // Parse header - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = (int) strtol(token, NULL, 10); - - *x = width; - *y = height; - - if (comp) *comp = 3; - if (req_comp == 0) req_comp = 3; - - if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) - return stbi__errpf("too large", "HDR image is too large"); - - // Read data - hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); - if (!hdr_data) - return stbi__errpf("outofmem", "Out of memory"); - - // Load image data - // image data is stored as some number of sca - if ( width < 8 || width >= 32768) { - // Read flat data - for (j=0; j < height; ++j) { - for (i=0; i < width; ++i) { - stbi_uc rgbe[4]; - main_decode_loop: - stbi__getn(s, rgbe, 4); - stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); - } - } - } else { - // Read RLE-encoded data - scanline = NULL; - - for (j = 0; j < height; ++j) { - c1 = stbi__get8(s); - c2 = stbi__get8(s); - len = stbi__get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - stbi_uc rgbe[4]; - rgbe[0] = (stbi_uc) c1; - rgbe[1] = (stbi_uc) c2; - rgbe[2] = (stbi_uc) len; - rgbe[3] = (stbi_uc) stbi__get8(s); - stbi__hdr_convert(hdr_data, rgbe, req_comp); - i = 1; - j = 0; - STBI_FREE(scanline); - goto main_decode_loop; // yes, this makes no sense - } - len <<= 8; - len |= stbi__get8(s); - if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) { - scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); - if (!scanline) { - STBI_FREE(hdr_data); - return stbi__errpf("outofmem", "Out of memory"); - } - } - - for (k = 0; k < 4; ++k) { - int nleft; - i = 0; - while ((nleft = width - i) > 0) { - count = stbi__get8(s); - if (count > 128) { - // Run - value = stbi__get8(s); - count -= 128; - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = stbi__get8(s); - } - } - } - for (i=0; i < width; ++i) - stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); - } - if (scanline) - STBI_FREE(scanline); - } - - return hdr_data; -} - -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int dummy; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (stbi__hdr_test(s) == 0) { - stbi__rewind( s ); - return 0; - } - - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) { - stbi__rewind( s ); - return 0; - } - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *y = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *x = (int) strtol(token, NULL, 10); - *comp = 3; - return 1; -} -#endif // STBI_NO_HDR - -#ifndef STBI_NO_BMP -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) -{ - void *p; - stbi__bmp_data info; - - info.all_a = 255; - p = stbi__bmp_parse_header(s, &info); - stbi__rewind( s ); - if (p == NULL) - return 0; - if (x) *x = s->img_x; - if (y) *y = s->img_y; - if (comp) *comp = info.ma ? 4 : 3; - return 1; -} -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) -{ - int channelCount, dummy, depth; - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - *y = stbi__get32be(s); - *x = stbi__get32be(s); - depth = stbi__get16be(s); - if (depth != 8 && depth != 16) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 3) { - stbi__rewind( s ); - return 0; - } - *comp = 4; - return 1; -} - -static int stbi__psd_is16(stbi__context *s) -{ - int channelCount, depth; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - (void) stbi__get32be(s); - (void) stbi__get32be(s); - depth = stbi__get16be(s); - if (depth != 16) { - stbi__rewind( s ); - return 0; - } - return 1; -} -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) -{ - int act_comp=0,num_packets=0,chained,dummy; - stbi__pic_packet packets[10]; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { - stbi__rewind(s); - return 0; - } - - stbi__skip(s, 88); - - *x = stbi__get16be(s); - *y = stbi__get16be(s); - if (stbi__at_eof(s)) { - stbi__rewind( s); - return 0; - } - if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi__rewind( s ); - return 0; - } - - stbi__skip(s, 8); - - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return 0; - - packet = &packets[num_packets++]; - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - act_comp |= packet->channel; - - if (stbi__at_eof(s)) { - stbi__rewind( s ); - return 0; - } - if (packet->size != 8) { - stbi__rewind( s ); - return 0; - } - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); - - return 1; -} -#endif - -// ************************************************************************************************* -// Portable Gray Map and Portable Pixel Map loader -// by Ken Miller -// -// PGM: http://netpbm.sourceforge.net/doc/pgm.html -// PPM: http://netpbm.sourceforge.net/doc/ppm.html -// -// Known limitations: -// Does not support comments in the header section -// Does not support ASCII image data (formats P2 and P3) -// Does not support 16-bit-per-channel - -#ifndef STBI_NO_PNM - -static int stbi__pnm_test(stbi__context *s) -{ - char p, t; - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind( s ); - return 0; - } - return 1; -} - -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - STBI_NOTUSED(ri); - - if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) - return 0; - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - - if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "PNM too large"); - - out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - stbi__getn(s, out, s->img_n * s->img_x * s->img_y); - - if (req_comp && req_comp != s->img_n) { - out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - return out; -} - -static int stbi__pnm_isspace(char c) -{ - return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; -} - -static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) -{ - for (;;) { - while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) - *c = (char) stbi__get8(s); - - if (stbi__at_eof(s) || *c != '#') - break; - - while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) - *c = (char) stbi__get8(s); - } -} - -static int stbi__pnm_isdigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static int stbi__pnm_getinteger(stbi__context *s, char *c) -{ - int value = 0; - - while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { - value = value*10 + (*c - '0'); - *c = (char) stbi__get8(s); - } - - return value; -} - -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) -{ - int maxv, dummy; - char c, p, t; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - stbi__rewind(s); - - // Get identifier - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind(s); - return 0; - } - - *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm - - c = (char) stbi__get8(s); - stbi__pnm_skip_whitespace(s, &c); - - *x = stbi__pnm_getinteger(s, &c); // read width - stbi__pnm_skip_whitespace(s, &c); - - *y = stbi__pnm_getinteger(s, &c); // read height - stbi__pnm_skip_whitespace(s, &c); - - maxv = stbi__pnm_getinteger(s, &c); // read max value - - if (maxv > 255) - return stbi__err("max value > 255", "PPM image not 8-bit"); - else - return 1; -} -#endif - -static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) -{ - #ifndef STBI_NO_JPEG - if (stbi__jpeg_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNG - if (stbi__png_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_GIF - if (stbi__gif_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_BMP - if (stbi__bmp_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PSD - if (stbi__psd_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PIC - if (stbi__pic_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNM - if (stbi__pnm_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_info(s, x, y, comp)) return 1; - #endif - - // test tga last because it's a crappy test! - #ifndef STBI_NO_TGA - if (stbi__tga_info(s, x, y, comp)) - return 1; - #endif - return stbi__err("unknown image type", "Image not of any known type, or corrupt"); -} - -static int stbi__is_16_main(stbi__context *s) -{ - #ifndef STBI_NO_PNG - if (stbi__png_is16(s)) return 1; - #endif - - #ifndef STBI_NO_PSD - if (stbi__psd_is16(s)) return 1; - #endif - - return 0; -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_info_from_file(f, x, y, comp); - fclose(f); - return result; -} - -STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__info_main(&s,x,y,comp); - fseek(f,pos,SEEK_SET); - return r; -} - -STBIDEF int stbi_is_16_bit(char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_is_16_bit_from_file(f); - fclose(f); - return result; -} - -STBIDEF int stbi_is_16_bit_from_file(FILE *f) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__is_16_main(&s); - fseek(f,pos,SEEK_SET); - return r; -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__is_16_main(&s); -} - -STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__is_16_main(&s); -} - -#endif // STB_IMAGE_IMPLEMENTATION - -/* - revision history: - 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs - 2.19 (2018-02-11) fix warning - 2.18 (2018-01-30) fix warnings - 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug - 1-bit BMP - *_is_16_bit api - avoid warnings - 2.16 (2017-07-23) all functions have 16-bit variants; - STBI_NO_STDIO works again; - compilation fixes; - fix rounding in unpremultiply; - optimize vertical flip; - disable raw_len validation; - documentation fixes - 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; - warning fixes; disable run-time SSE detection on gcc; - uniform handling of optional "return" values; - thread-safe initialization of zlib tables - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) allocate large structures on the stack - remove white matting for transparent PSD - fix reported channel count for PNG & BMP - re-enable SSE2 in non-gcc 64-bit - support RGB-formatted JPEG - read 16-bit PNGs (only as 8-bit) - 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED - 2.09 (2016-01-16) allow comments in PNM files - 16-bit-per-pixel TGA (not bit-per-component) - info() for TGA could break due to .hdr handling - info() for BMP to shares code instead of sloppy parse - can use STBI_REALLOC_SIZED if allocator doesn't support realloc - code cleanup - 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA - 2.07 (2015-09-13) fix compiler warnings - partial animated GIF support - limited 16-bpc PSD support - #ifdef unused functions - bug with < 92 byte PIC,PNM,HDR,TGA - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) extra corruption checking (mmozeiko) - stbi_set_flip_vertically_on_load (nguillemot) - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) - progressive JPEG (stb) - PGM/PPM support (Ken Miller) - STBI_MALLOC,STBI_REALLOC,STBI_FREE - GIF bugfix -- seemingly never worked - STBI_NO_*, STBI_ONLY_* - 1.48 (2014-12-14) fix incorrectly-named assert() - 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) - optimize PNG (ryg) - fix bug in interlaced PNG with user-specified channel count (stb) - 1.46 (2014-08-26) - fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG - 1.45 (2014-08-16) - fix MSVC-ARM internal compiler error by wrapping malloc - 1.44 (2014-08-07) - various warning fixes from Ronny Chevalier - 1.43 (2014-07-15) - fix MSVC-only compiler problem in code changed in 1.42 - 1.42 (2014-07-09) - don't define _CRT_SECURE_NO_WARNINGS (affects user code) - fixes to stbi__cleanup_jpeg path - added STBI_ASSERT to avoid requiring assert.h - 1.41 (2014-06-25) - fix search&replace from 1.36 that messed up comments/error messages - 1.40 (2014-06-22) - fix gcc struct-initialization warning - 1.39 (2014-06-15) - fix to TGA optimization when req_comp != number of components in TGA; - fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) - add support for BMP version 5 (more ignored fields) - 1.38 (2014-06-06) - suppress MSVC warnings on integer casts truncating values - fix accidental rename of 'skip' field of I/O - 1.37 (2014-06-04) - remove duplicate typedef - 1.36 (2014-06-03) - convert to header file single-file library - if de-iphone isn't set, load iphone images color-swapped instead of returning NULL - 1.35 (2014-05-27) - various warnings - fix broken STBI_SIMD path - fix bug where stbi_load_from_file no longer left file pointer in correct place - fix broken non-easy path for 32-bit BMP (possibly never used) - TGA optimization by Arseny Kapoulkine - 1.34 (unknown) - use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway - error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) - fix inefficiency in decoding 32-bit BMP (David Woo) - 1.29 (2010-08-16) - various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-stbi_uc to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) - 1.21 fix use of 'stbi_uc' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 (2008-08-02) - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - stbi__convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 (2006-11-19) - first released version -*/ - - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/deps/stb/stb_image_write.h b/deps/stb/stb_image_write.h deleted file mode 100644 index 0acfdc5bc..000000000 --- a/deps/stb/stb_image_write.h +++ /dev/null @@ -1,1690 +0,0 @@ -/* stb_image_write - v1.15 - public domain - http://nothings.org/stb - writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 - no warranty implied; use at your own risk - - Before #including, - - #define STB_IMAGE_WRITE_IMPLEMENTATION - - in the file that you want to have the implementation. - - Will probably not work correctly with strict-aliasing optimizations. - -ABOUT: - - This header file is a library for writing images to C stdio or a callback. - - The PNG output is not optimal; it is 20-50% larger than the file - written by a decent optimizing implementation; though providing a custom - zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that. - This library is designed for source code compactness and simplicity, - not optimal image file size or run-time performance. - -BUILDING: - - You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. - You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace - malloc,realloc,free. - You can #define STBIW_MEMMOVE() to replace memmove() - You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function - for PNG compression (instead of the builtin one), it must have the following signature: - unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); - The returned data will be freed with STBIW_FREE() (free() by default), - so it must be heap allocated with STBIW_MALLOC() (malloc() by default), - -UNICODE: - - If compiling for Windows and you wish to use Unicode filenames, compile - with - #define STBIW_WINDOWS_UTF8 - and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert - Windows wchar_t filenames to utf8. - -USAGE: - - There are five functions, one for each image file format: - - int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); - int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); - int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); - int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); - int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); - - void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically - - There are also five equivalent functions that use an arbitrary write function. You are - expected to open/close your file-equivalent before and after calling these: - - int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); - int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); - int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); - int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); - int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); - - where the callback is: - void stbi_write_func(void *context, void *data, int size); - - You can configure it with these global variables: - int stbi_write_tga_with_rle; // defaults to true; set to 0 to disable RLE - int stbi_write_png_compression_level; // defaults to 8; set to higher for more compression - int stbi_write_force_png_filter; // defaults to -1; set to 0..5 to force a filter mode - - - You can define STBI_WRITE_NO_STDIO to disable the file variant of these - functions, so the library will not use stdio.h at all. However, this will - also disable HDR writing, because it requires stdio for formatted output. - - Each function returns 0 on failure and non-0 on success. - - The functions create an image file defined by the parameters. The image - is a rectangle of pixels stored from left-to-right, top-to-bottom. - Each pixel contains 'comp' channels of data stored interleaved with 8-bits - per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is - monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall. - The *data pointer points to the first byte of the top-left-most pixel. - For PNG, "stride_in_bytes" is the distance in bytes from the first byte of - a row of pixels to the first byte of the next row of pixels. - - PNG creates output files with the same number of components as the input. - The BMP format expands Y to RGB in the file format and does not - output alpha. - - PNG supports writing rectangles of data even when the bytes storing rows of - data are not consecutive in memory (e.g. sub-rectangles of a larger image), - by supplying the stride between the beginning of adjacent rows. The other - formats do not. (Thus you cannot write a native-format BMP through the BMP - writer, both because it is in BGR order and because it may have padding - at the end of the line.) - - PNG allows you to set the deflate compression level by setting the global - variable 'stbi_write_png_compression_level' (it defaults to 8). - - HDR expects linear float data. Since the format is always 32-bit rgb(e) - data, alpha (if provided) is discarded, and for monochrome data it is - replicated across all three channels. - - TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed - data, set the global variable 'stbi_write_tga_with_rle' to 0. - - JPEG does ignore alpha channels in input data; quality is between 1 and 100. - Higher quality looks better but results in a bigger image. - JPEG baseline (no JPEG progressive). - -CREDITS: - - - Sean Barrett - PNG/BMP/TGA - Baldur Karlsson - HDR - Jean-Sebastien Guay - TGA monochrome - Tim Kelsey - misc enhancements - Alan Hickman - TGA RLE - Emmanuel Julien - initial file IO callback implementation - Jon Olick - original jo_jpeg.cpp code - Daniel Gibson - integrate JPEG, allow external zlib - Aarni Koskela - allow choosing PNG filter - - bugfixes: - github:Chribba - Guillaume Chereau - github:jry2 - github:romigrou - Sergio Gonzalez - Jonas Karlsson - Filip Wasil - Thatcher Ulrich - github:poppolopoppo - Patrick Boettcher - github:xeekworx - Cap Petschulat - Simon Rodriguez - Ivan Tikhonov - github:ignotion - Adam Schackart - -LICENSE - - See end of file for license information. - -*/ - -#ifndef INCLUDE_STB_IMAGE_WRITE_H -#define INCLUDE_STB_IMAGE_WRITE_H - -#include - -// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' -#ifndef STBIWDEF -#ifdef STB_IMAGE_WRITE_STATIC -#define STBIWDEF static -#else -#ifdef __cplusplus -#define STBIWDEF extern "C" -#else -#define STBIWDEF extern -#endif -#endif -#endif - -#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations -extern int stbi_write_tga_with_rle; -extern int stbi_write_png_compression_level; -extern int stbi_write_force_png_filter; -#endif - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); -STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); -STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); - -#ifdef STBI_WINDOWS_UTF8 -STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -#endif -#endif - -typedef void stbi_write_func(void *context, void *data, int size); - -STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); -STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); -STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); - -STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); - -#endif//INCLUDE_STB_IMAGE_WRITE_H - -#ifdef STB_IMAGE_WRITE_IMPLEMENTATION - -#ifdef _WIN32 - #ifndef _CRT_SECURE_NO_WARNINGS - #define _CRT_SECURE_NO_WARNINGS - #endif - #ifndef _CRT_NONSTDC_NO_DEPRECATE - #define _CRT_NONSTDC_NO_DEPRECATE - #endif -#endif - -#ifndef STBI_WRITE_NO_STDIO -#include -#endif // STBI_WRITE_NO_STDIO - -#include -#include -#include -#include - -#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) -// ok -#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." -#endif - -#ifndef STBIW_MALLOC -#define STBIW_MALLOC(sz) malloc(sz) -#define STBIW_REALLOC(p,newsz) realloc(p,newsz) -#define STBIW_FREE(p) free(p) -#endif - -#ifndef STBIW_REALLOC_SIZED -#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) -#endif - - -#ifndef STBIW_MEMMOVE -#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) -#endif - - -#ifndef STBIW_ASSERT -#include -#define STBIW_ASSERT(x) assert(x) -#endif - -#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) - -#ifdef STB_IMAGE_WRITE_STATIC -static int stbi_write_png_compression_level = 8; -static int stbi_write_tga_with_rle = 1; -static int stbi_write_force_png_filter = -1; -#else -int stbi_write_png_compression_level = 8; -int stbi_write_tga_with_rle = 1; -int stbi_write_force_png_filter = -1; -#endif - -static int stbi__flip_vertically_on_write = 0; - -STBIWDEF void stbi_flip_vertically_on_write(int flag) -{ - stbi__flip_vertically_on_write = flag; -} - -typedef struct -{ - stbi_write_func *func; - void *context; - unsigned char buffer[64]; - int buf_used; -} stbi__write_context; - -// initialize a callback-based context -static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) -{ - s->func = c; - s->context = context; -} - -#ifndef STBI_WRITE_NO_STDIO - -static void stbi__stdio_write(void *context, void *data, int size) -{ - fwrite(data,1,size,(FILE*) context); -} - -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) -#ifdef __cplusplus -#define STBIW_EXTERN extern "C" -#else -#define STBIW_EXTERN extern -#endif -STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); - -STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -{ - return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -} -#endif - -static FILE *stbiw__fopen(char const *filename, char const *mode) -{ - FILE *f; -#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode))) - return 0; - -#if _MSC_VER >= 1400 - if (0 != _wfopen_s(&f, wFilename, wMode)) - f = 0; -#else - f = _wfopen(wFilename, wMode); -#endif - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; -#else - f = fopen(filename, mode); -#endif - return f; -} - -static int stbi__start_write_file(stbi__write_context *s, const char *filename) -{ - FILE *f = stbiw__fopen(filename, "wb"); - stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); - return f != NULL; -} - -static void stbi__end_write_file(stbi__write_context *s) -{ - fclose((FILE *)s->context); -} - -#endif // !STBI_WRITE_NO_STDIO - -typedef unsigned int stbiw_uint32; -typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; - -static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) -{ - while (*fmt) { - switch (*fmt++) { - case ' ': break; - case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); - s->func(s->context,&x,1); - break; } - case '2': { int x = va_arg(v,int); - unsigned char b[2]; - b[0] = STBIW_UCHAR(x); - b[1] = STBIW_UCHAR(x>>8); - s->func(s->context,b,2); - break; } - case '4': { stbiw_uint32 x = va_arg(v,int); - unsigned char b[4]; - b[0]=STBIW_UCHAR(x); - b[1]=STBIW_UCHAR(x>>8); - b[2]=STBIW_UCHAR(x>>16); - b[3]=STBIW_UCHAR(x>>24); - s->func(s->context,b,4); - break; } - default: - STBIW_ASSERT(0); - return; - } - } -} - -static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) -{ - va_list v; - va_start(v, fmt); - stbiw__writefv(s, fmt, v); - va_end(v); -} - -static void stbiw__write_flush(stbi__write_context *s) -{ - if (s->buf_used) { - s->func(s->context, &s->buffer, s->buf_used); - s->buf_used = 0; - } -} - -static void stbiw__putc(stbi__write_context *s, unsigned char c) -{ - s->func(s->context, &c, 1); -} - -static void stbiw__write1(stbi__write_context *s, unsigned char a) -{ - if (s->buf_used + 1 > (int)sizeof(s->buffer)) - stbiw__write_flush(s); - s->buffer[s->buf_used++] = a; -} - -static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) -{ - int n; - if (s->buf_used + 3 > (int)sizeof(s->buffer)) - stbiw__write_flush(s); - n = s->buf_used; - s->buf_used = n+3; - s->buffer[n+0] = a; - s->buffer[n+1] = b; - s->buffer[n+2] = c; -} - -static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) -{ - unsigned char bg[3] = { 255, 0, 255}, px[3]; - int k; - - if (write_alpha < 0) - stbiw__write1(s, d[comp - 1]); - - switch (comp) { - case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case - case 1: - if (expand_mono) - stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp - else - stbiw__write1(s, d[0]); // monochrome TGA - break; - case 4: - if (!write_alpha) { - // composite against pink background - for (k = 0; k < 3; ++k) - px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; - stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); - break; - } - /* FALLTHROUGH */ - case 3: - stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); - break; - } - if (write_alpha > 0) - stbiw__write1(s, d[comp - 1]); -} - -static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) -{ - stbiw_uint32 zero = 0; - int i,j, j_end; - - if (y <= 0) - return; - - if (stbi__flip_vertically_on_write) - vdir *= -1; - - if (vdir < 0) { - j_end = -1; j = y-1; - } else { - j_end = y; j = 0; - } - - for (; j != j_end; j += vdir) { - for (i=0; i < x; ++i) { - unsigned char *d = (unsigned char *) data + (j*x+i)*comp; - stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); - } - stbiw__write_flush(s); - s->func(s->context, &zero, scanline_pad); - } -} - -static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) -{ - if (y < 0 || x < 0) { - return 0; - } else { - va_list v; - va_start(v, fmt); - stbiw__writefv(s, fmt, v); - va_end(v); - stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); - return 1; - } -} - -static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) -{ - int pad = (-x*3) & 3; - return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, - "11 4 22 4" "4 44 22 444444", - 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header - 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header -} - -STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) -{ - stbi__write_context s; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_bmp_core(&s, x, y, comp, data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) -{ - stbi__write_context s; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_bmp_core(&s, x, y, comp, data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif //!STBI_WRITE_NO_STDIO - -static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) -{ - int has_alpha = (comp == 2 || comp == 4); - int colorbytes = has_alpha ? comp-1 : comp; - int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 - - if (y < 0 || x < 0) - return 0; - - if (!stbi_write_tga_with_rle) { - return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, - "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); - } else { - int i,j,k; - int jend, jdir; - - stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); - - if (stbi__flip_vertically_on_write) { - j = 0; - jend = y; - jdir = 1; - } else { - j = y-1; - jend = -1; - jdir = -1; - } - for (; j != jend; j += jdir) { - unsigned char *row = (unsigned char *) data + j * x * comp; - int len; - - for (i = 0; i < x; i += len) { - unsigned char *begin = row + i * comp; - int diff = 1; - len = 1; - - if (i < x - 1) { - ++len; - diff = memcmp(begin, row + (i + 1) * comp, comp); - if (diff) { - const unsigned char *prev = begin; - for (k = i + 2; k < x && len < 128; ++k) { - if (memcmp(prev, row + k * comp, comp)) { - prev += comp; - ++len; - } else { - --len; - break; - } - } - } else { - for (k = i + 2; k < x && len < 128; ++k) { - if (!memcmp(begin, row + k * comp, comp)) { - ++len; - } else { - break; - } - } - } - } - - if (diff) { - unsigned char header = STBIW_UCHAR(len - 1); - stbiw__write1(s, header); - for (k = 0; k < len; ++k) { - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); - } - } else { - unsigned char header = STBIW_UCHAR(len - 129); - stbiw__write1(s, header); - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); - } - } - } - stbiw__write_flush(s); - } - return 1; -} - -STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) -{ - stbi__write_context s; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_tga_core(&s, x, y, comp, (void *) data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) -{ - stbi__write_context s; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR writer -// by Baldur Karlsson - -#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) - -static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) -{ - int exponent; - float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); - - if (maxcomp < 1e-32f) { - rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; - } else { - float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; - - rgbe[0] = (unsigned char)(linear[0] * normalize); - rgbe[1] = (unsigned char)(linear[1] * normalize); - rgbe[2] = (unsigned char)(linear[2] * normalize); - rgbe[3] = (unsigned char)(exponent + 128); - } -} - -static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) -{ - unsigned char lengthbyte = STBIW_UCHAR(length+128); - STBIW_ASSERT(length+128 <= 255); - s->func(s->context, &lengthbyte, 1); - s->func(s->context, &databyte, 1); -} - -static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) -{ - unsigned char lengthbyte = STBIW_UCHAR(length); - STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code - s->func(s->context, &lengthbyte, 1); - s->func(s->context, data, length); -} - -static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) -{ - unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; - unsigned char rgbe[4]; - float linear[3]; - int x; - - scanlineheader[2] = (width&0xff00)>>8; - scanlineheader[3] = (width&0x00ff); - - /* skip RLE for images too small or large */ - if (width < 8 || width >= 32768) { - for (x=0; x < width; x++) { - switch (ncomp) { - case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*ncomp + 2]; - linear[1] = scanline[x*ncomp + 1]; - linear[0] = scanline[x*ncomp + 0]; - break; - default: - linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; - break; - } - stbiw__linear_to_rgbe(rgbe, linear); - s->func(s->context, rgbe, 4); - } - } else { - int c,r; - /* encode into scratch buffer */ - for (x=0; x < width; x++) { - switch(ncomp) { - case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*ncomp + 2]; - linear[1] = scanline[x*ncomp + 1]; - linear[0] = scanline[x*ncomp + 0]; - break; - default: - linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; - break; - } - stbiw__linear_to_rgbe(rgbe, linear); - scratch[x + width*0] = rgbe[0]; - scratch[x + width*1] = rgbe[1]; - scratch[x + width*2] = rgbe[2]; - scratch[x + width*3] = rgbe[3]; - } - - s->func(s->context, scanlineheader, 4); - - /* RLE each component separately */ - for (c=0; c < 4; c++) { - unsigned char *comp = &scratch[width*c]; - - x = 0; - while (x < width) { - // find first run - r = x; - while (r+2 < width) { - if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) - break; - ++r; - } - if (r+2 >= width) - r = width; - // dump up to first run - while (x < r) { - int len = r-x; - if (len > 128) len = 128; - stbiw__write_dump_data(s, len, &comp[x]); - x += len; - } - // if there's a run, output it - if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd - // find next byte after run - while (r < width && comp[r] == comp[x]) - ++r; - // output run up to r - while (x < r) { - int len = r-x; - if (len > 127) len = 127; - stbiw__write_run_data(s, len, comp[x]); - x += len; - } - } - } - } - } -} - -static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) -{ - if (y <= 0 || x <= 0 || data == NULL) - return 0; - else { - // Each component is stored separately. Allocate scratch space for full output scanline. - unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); - int i, len; - char buffer[128]; - char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; - s->func(s->context, header, sizeof(header)-1); - -#ifdef __STDC_WANT_SECURE_LIB__ - len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); -#else - len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); -#endif - s->func(s->context, buffer, len); - - for(i=0; i < y; i++) - stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); - STBIW_FREE(scratch); - return 1; - } -} - -STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) -{ - stbi__write_context s; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_hdr_core(&s, x, y, comp, (float *) data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) -{ - stbi__write_context s; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif // STBI_WRITE_NO_STDIO - - -////////////////////////////////////////////////////////////////////////////// -// -// PNG writer -// - -#ifndef STBIW_ZLIB_COMPRESS -// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() -#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) -#define stbiw__sbm(a) stbiw__sbraw(a)[0] -#define stbiw__sbn(a) stbiw__sbraw(a)[1] - -#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) -#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) -#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) - -#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) -#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) -#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) - -static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) -{ - int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; - void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); - STBIW_ASSERT(p); - if (p) { - if (!*arr) ((int *) p)[1] = 0; - *arr = (void *) ((int *) p + 2); - stbiw__sbm(*arr) = m; - } - return *arr; -} - -static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) -{ - while (*bitcount >= 8) { - stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); - *bitbuffer >>= 8; - *bitcount -= 8; - } - return data; -} - -static int stbiw__zlib_bitrev(int code, int codebits) -{ - int res=0; - while (codebits--) { - res = (res << 1) | (code & 1); - code >>= 1; - } - return res; -} - -static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) -{ - int i; - for (i=0; i < limit && i < 258; ++i) - if (a[i] != b[i]) break; - return i; -} - -static unsigned int stbiw__zhash(unsigned char *data) -{ - stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); - hash ^= hash << 3; - hash += hash >> 5; - hash ^= hash << 4; - hash += hash >> 17; - hash ^= hash << 25; - hash += hash >> 6; - return hash; -} - -#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) -#define stbiw__zlib_add(code,codebits) \ - (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) -#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) -// default huffman tables -#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) -#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) -#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) -#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) -#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) -#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) - -#define stbiw__ZHASH 16384 - -#endif // STBIW_ZLIB_COMPRESS - -STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) -{ -#ifdef STBIW_ZLIB_COMPRESS - // user provided a zlib compress implementation, use that - return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); -#else // use builtin - static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; - static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; - static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; - static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; - unsigned int bitbuf=0; - int i,j, bitcount=0; - unsigned char *out = NULL; - unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); - if (hash_table == NULL) - return NULL; - if (quality < 5) quality = 5; - - stbiw__sbpush(out, 0x78); // DEFLATE 32K window - stbiw__sbpush(out, 0x5e); // FLEVEL = 1 - stbiw__zlib_add(1,1); // BFINAL = 1 - stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman - - for (i=0; i < stbiw__ZHASH; ++i) - hash_table[i] = NULL; - - i=0; - while (i < data_len-3) { - // hash next 3 bytes of data to be compressed - int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; - unsigned char *bestloc = 0; - unsigned char **hlist = hash_table[h]; - int n = stbiw__sbcount(hlist); - for (j=0; j < n; ++j) { - if (hlist[j]-data > i-32768) { // if entry lies within window - int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); - if (d >= best) { best=d; bestloc=hlist[j]; } - } - } - // when hash table entry is too long, delete half the entries - if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { - STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); - stbiw__sbn(hash_table[h]) = quality; - } - stbiw__sbpush(hash_table[h],data+i); - - if (bestloc) { - // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal - h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); - hlist = hash_table[h]; - n = stbiw__sbcount(hlist); - for (j=0; j < n; ++j) { - if (hlist[j]-data > i-32767) { - int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); - if (e > best) { // if next match is better, bail on current match - bestloc = NULL; - break; - } - } - } - } - - if (bestloc) { - int d = (int) (data+i - bestloc); // distance back - STBIW_ASSERT(d <= 32767 && best <= 258); - for (j=0; best > lengthc[j+1]-1; ++j); - stbiw__zlib_huff(j+257); - if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); - for (j=0; d > distc[j+1]-1; ++j); - stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); - if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); - i += best; - } else { - stbiw__zlib_huffb(data[i]); - ++i; - } - } - // write out final bytes - for (;i < data_len; ++i) - stbiw__zlib_huffb(data[i]); - stbiw__zlib_huff(256); // end of block - // pad with 0 bits to byte boundary - while (bitcount) - stbiw__zlib_add(0,1); - - for (i=0; i < stbiw__ZHASH; ++i) - (void) stbiw__sbfree(hash_table[i]); - STBIW_FREE(hash_table); - - { - // compute adler32 on input - unsigned int s1=1, s2=0; - int blocklen = (int) (data_len % 5552); - j=0; - while (j < data_len) { - for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } - s1 %= 65521; s2 %= 65521; - j += blocklen; - blocklen = 5552; - } - stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); - stbiw__sbpush(out, STBIW_UCHAR(s2)); - stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); - stbiw__sbpush(out, STBIW_UCHAR(s1)); - } - *out_len = stbiw__sbn(out); - // make returned pointer freeable - STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); - return (unsigned char *) stbiw__sbraw(out); -#endif // STBIW_ZLIB_COMPRESS -} - -static unsigned int stbiw__crc32(unsigned char *buffer, int len) -{ -#ifdef STBIW_CRC32 - return STBIW_CRC32(buffer, len); -#else - static unsigned int crc_table[256] = - { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D - }; - - unsigned int crc = ~0u; - int i; - for (i=0; i < len; ++i) - crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; - return ~crc; -#endif -} - -#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) -#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); -#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) - -static void stbiw__wpcrc(unsigned char **data, int len) -{ - unsigned int crc = stbiw__crc32(*data - len - 4, len+4); - stbiw__wp32(*data, crc); -} - -static unsigned char stbiw__paeth(int a, int b, int c) -{ - int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); - if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); - if (pb <= pc) return STBIW_UCHAR(b); - return STBIW_UCHAR(c); -} - -// @OPTIMIZE: provide an option that always forces left-predict or paeth predict -static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) -{ - static int mapping[] = { 0,1,2,3,4 }; - static int firstmap[] = { 0,1,0,5,6 }; - int *mymap = (y != 0) ? mapping : firstmap; - int i; - int type = mymap[filter_type]; - unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); - int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; - - if (type==0) { - memcpy(line_buffer, z, width*n); - return; - } - - // first loop isn't optimized since it's just one pixel - for (i = 0; i < n; ++i) { - switch (type) { - case 1: line_buffer[i] = z[i]; break; - case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; - case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; - case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; - case 5: line_buffer[i] = z[i]; break; - case 6: line_buffer[i] = z[i]; break; - } - } - switch (type) { - case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; - case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; - case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; - case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; - case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; - case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; - } -} - -STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) -{ - int force_filter = stbi_write_force_png_filter; - int ctype[5] = { -1, 0, 4, 2, 6 }; - unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; - unsigned char *out,*o, *filt, *zlib; - signed char *line_buffer; - int j,zlen; - - if (stride_bytes == 0) - stride_bytes = x * n; - - if (force_filter >= 5) { - force_filter = -1; - } - - filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; - line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } - for (j=0; j < y; ++j) { - int filter_type; - if (force_filter > -1) { - filter_type = force_filter; - stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); - } else { // Estimate the best filter by running through all of them: - int best_filter = 0, best_filter_val = 0x7fffffff, est, i; - for (filter_type = 0; filter_type < 5; filter_type++) { - stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); - - // Estimate the entropy of the line using this filter; the less, the better. - est = 0; - for (i = 0; i < x*n; ++i) { - est += abs((signed char) line_buffer[i]); - } - if (est < best_filter_val) { - best_filter_val = est; - best_filter = filter_type; - } - } - if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it - stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); - filter_type = best_filter; - } - } - // when we get here, filter_type contains the filter type, and line_buffer contains the data - filt[j*(x*n+1)] = (unsigned char) filter_type; - STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); - } - STBIW_FREE(line_buffer); - zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); - STBIW_FREE(filt); - if (!zlib) return 0; - - // each tag requires 12 bytes of overhead - out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); - if (!out) return 0; - *out_len = 8 + 12+13 + 12+zlen + 12; - - o=out; - STBIW_MEMMOVE(o,sig,8); o+= 8; - stbiw__wp32(o, 13); // header length - stbiw__wptag(o, "IHDR"); - stbiw__wp32(o, x); - stbiw__wp32(o, y); - *o++ = 8; - *o++ = STBIW_UCHAR(ctype[n]); - *o++ = 0; - *o++ = 0; - *o++ = 0; - stbiw__wpcrc(&o,13); - - stbiw__wp32(o, zlen); - stbiw__wptag(o, "IDAT"); - STBIW_MEMMOVE(o, zlib, zlen); - o += zlen; - STBIW_FREE(zlib); - stbiw__wpcrc(&o, zlen); - - stbiw__wp32(o,0); - stbiw__wptag(o, "IEND"); - stbiw__wpcrc(&o,0); - - STBIW_ASSERT(o == out + *out_len); - - return out; -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) -{ - FILE *f; - int len; - unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; - - f = stbiw__fopen(filename, "wb"); - if (!f) { STBIW_FREE(png); return 0; } - fwrite(png, 1, len, f); - fclose(f); - STBIW_FREE(png); - return 1; -} -#endif - -STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) -{ - int len; - unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; - func(context, png, len); - STBIW_FREE(png); - return 1; -} - - -/* *************************************************************************** - * - * JPEG writer - * - * This is based on Jon Olick's jo_jpeg.cpp: - * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html - */ - -static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, - 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; - -static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { - int bitBuf = *bitBufP, bitCnt = *bitCntP; - bitCnt += bs[1]; - bitBuf |= bs[0] << (24 - bitCnt); - while(bitCnt >= 8) { - unsigned char c = (bitBuf >> 16) & 255; - stbiw__putc(s, c); - if(c == 255) { - stbiw__putc(s, 0); - } - bitBuf <<= 8; - bitCnt -= 8; - } - *bitBufP = bitBuf; - *bitCntP = bitCnt; -} - -static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { - float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; - float z1, z2, z3, z4, z5, z11, z13; - - float tmp0 = d0 + d7; - float tmp7 = d0 - d7; - float tmp1 = d1 + d6; - float tmp6 = d1 - d6; - float tmp2 = d2 + d5; - float tmp5 = d2 - d5; - float tmp3 = d3 + d4; - float tmp4 = d3 - d4; - - // Even part - float tmp10 = tmp0 + tmp3; // phase 2 - float tmp13 = tmp0 - tmp3; - float tmp11 = tmp1 + tmp2; - float tmp12 = tmp1 - tmp2; - - d0 = tmp10 + tmp11; // phase 3 - d4 = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * 0.707106781f; // c4 - d2 = tmp13 + z1; // phase 5 - d6 = tmp13 - z1; - - // Odd part - tmp10 = tmp4 + tmp5; // phase 2 - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - // The rotator is modified from fig 4-8 to avoid extra negations. - z5 = (tmp10 - tmp12) * 0.382683433f; // c6 - z2 = tmp10 * 0.541196100f + z5; // c2-c6 - z4 = tmp12 * 1.306562965f + z5; // c2+c6 - z3 = tmp11 * 0.707106781f; // c4 - - z11 = tmp7 + z3; // phase 5 - z13 = tmp7 - z3; - - *d5p = z13 + z2; // phase 6 - *d3p = z13 - z2; - *d1p = z11 + z4; - *d7p = z11 - z4; - - *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; -} - -static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { - int tmp1 = val < 0 ? -val : val; - val = val < 0 ? val-1 : val; - bits[1] = 1; - while(tmp1 >>= 1) { - ++bits[1]; - } - bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { - } - // end0pos = first element in reverse order !=0 - if(end0pos == 0) { - stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); - return DU[0]; - } - for(i = 1; i <= end0pos; ++i) { - int startpos = i; - int nrzeroes; - unsigned short bits[2]; - for (; DU[i]==0 && i<=end0pos; ++i) { - } - nrzeroes = i-startpos; - if ( nrzeroes >= 16 ) { - int lng = nrzeroes>>4; - int nrmarker; - for (nrmarker=1; nrmarker <= lng; ++nrmarker) - stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); - nrzeroes &= 15; - } - stbiw__jpg_calcBits(DU[i], bits); - stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); - stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); - } - if(end0pos != 63) { - stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); - } - return DU[0]; -} - -static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { - // Constants that don't pollute global namespace - static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; - static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; - static const unsigned char std_ac_luminance_values[] = { - 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, - 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, - 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, - 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, - 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, - 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, - 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa - }; - static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; - static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; - static const unsigned char std_ac_chrominance_values[] = { - 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, - 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, - 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, - 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, - 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, - 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, - 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa - }; - // Huffman tables - static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; - static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; - static const unsigned short YAC_HT[256][2] = { - {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} - }; - static const unsigned short UVAC_HT[256][2] = { - {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} - }; - static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, - 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; - static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, - 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; - static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, - 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; - - int row, col, i, k, subsample; - float fdtbl_Y[64], fdtbl_UV[64]; - unsigned char YTable[64], UVTable[64]; - - if(!data || !width || !height || comp > 4 || comp < 1) { - return 0; - } - - quality = quality ? quality : 90; - subsample = quality <= 90 ? 1 : 0; - quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; - quality = quality < 50 ? 5000 / quality : 200 - quality * 2; - - for(i = 0; i < 64; ++i) { - int uvti, yti = (YQT[i]*quality+50)/100; - YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); - uvti = (UVQT[i]*quality+50)/100; - UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); - } - - for(row = 0, k = 0; row < 8; ++row) { - for(col = 0; col < 8; ++col, ++k) { - fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); - fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); - } - } - - // Write Headers - { - static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; - static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; - const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), - 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; - s->func(s->context, (void*)head0, sizeof(head0)); - s->func(s->context, (void*)YTable, sizeof(YTable)); - stbiw__putc(s, 1); - s->func(s->context, UVTable, sizeof(UVTable)); - s->func(s->context, (void*)head1, sizeof(head1)); - s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); - s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); - stbiw__putc(s, 0x10); // HTYACinfo - s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); - s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); - stbiw__putc(s, 1); // HTUDCinfo - s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); - s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); - stbiw__putc(s, 0x11); // HTUACinfo - s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); - s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); - s->func(s->context, (void*)head2, sizeof(head2)); - } - - // Encode 8x8 macroblocks - { - static const unsigned short fillBits[] = {0x7F, 7}; - int DCY=0, DCU=0, DCV=0; - int bitBuf=0, bitCnt=0; - // comp == 2 is grey+alpha (alpha is ignored) - int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; - const unsigned char *dataR = (const unsigned char *)data; - const unsigned char *dataG = dataR + ofsG; - const unsigned char *dataB = dataR + ofsB; - int x, y, pos; - if(subsample) { - for(y = 0; y < height; y += 16) { - for(x = 0; x < width; x += 16) { - float Y[256], U[256], V[256]; - for(row = y, pos = 0; row < y+16; ++row) { - // row >= height => use last input row - int clamped_row = (row < height) ? row : height - 1; - int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; - for(col = x; col < x+16; ++col, ++pos) { - // if col >= width => use pixel from last input column - int p = base_p + ((col < width) ? col : (width-1))*comp; - float r = dataR[p], g = dataG[p], b = dataB[p]; - Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; - U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; - V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; - } - } - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - - // subsample U,V - { - float subU[64], subV[64]; - int yy, xx; - for(yy = 0, pos = 0; yy < 8; ++yy) { - for(xx = 0; xx < 8; ++xx, ++pos) { - int j = yy*32+xx*2; - subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; - subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; - } - } - DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); - } - } - } - } else { - for(y = 0; y < height; y += 8) { - for(x = 0; x < width; x += 8) { - float Y[64], U[64], V[64]; - for(row = y, pos = 0; row < y+8; ++row) { - // row >= height => use last input row - int clamped_row = (row < height) ? row : height - 1; - int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; - for(col = x; col < x+8; ++col, ++pos) { - // if col >= width => use pixel from last input column - int p = base_p + ((col < width) ? col : (width-1))*comp; - float r = dataR[p], g = dataG[p], b = dataB[p]; - Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; - U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; - V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; - } - } - - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); - } - } - } - - // Do the bit alignment of the EOI marker - stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); - } - - // EOI - stbiw__putc(s, 0xFF); - stbiw__putc(s, 0xD9); - - return 1; -} - -STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) -{ - stbi__write_context s; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); -} - - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) -{ - stbi__write_context s; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif - -#endif // STB_IMAGE_WRITE_IMPLEMENTATION - -/* Revision history - 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels - 1.13 - 1.12 - 1.11 (2019-08-11) - - 1.10 (2019-02-07) - support utf8 filenames in Windows; fix warnings and platform ifdefs - 1.09 (2018-02-11) - fix typo in zlib quality API, improve STB_I_W_STATIC in C++ - 1.08 (2018-01-29) - add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter - 1.07 (2017-07-24) - doc fix - 1.06 (2017-07-23) - writing JPEG (using Jon Olick's code) - 1.05 ??? - 1.04 (2017-03-03) - monochrome BMP expansion - 1.03 ??? - 1.02 (2016-04-02) - avoid allocating large structures on the stack - 1.01 (2016-01-16) - STBIW_REALLOC_SIZED: support allocators with no realloc support - avoid race-condition in crc initialization - minor compile issues - 1.00 (2015-09-14) - installable file IO function - 0.99 (2015-09-13) - warning fixes; TGA rle support - 0.98 (2015-04-08) - added STBIW_MALLOC, STBIW_ASSERT etc - 0.97 (2015-01-18) - fixed HDR asserts, rewrote HDR rle logic - 0.96 (2015-01-17) - add HDR output - fix monochrome BMP - 0.95 (2014-08-17) - add monochrome TGA output - 0.94 (2014-05-31) - rename private functions to avoid conflicts with stb_image.h - 0.93 (2014-05-27) - warning fixes - 0.92 (2010-08-01) - casts to unsigned char to fix warnings - 0.91 (2010-07-17) - first public release - 0.90 first internal release -*/ - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/deps/stb/stb_impl.cpp b/deps/stb/stb_impl.cpp deleted file mode 100644 index 82928fa0f..000000000 --- a/deps/stb/stb_impl.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#define STB_IMAGE_IMPLEMENTATION -#include "stb_image.h" - -#define STB_IMAGE_WRITE_IMPLEMENTATION -#include "stb_image_write.h" diff --git a/examples/demo-app/CMakeLists.txt b/examples/demo-app/CMakeLists.txt index 6f3050088..ecedaa905 100644 --- a/examples/demo-app/CMakeLists.txt +++ b/examples/demo-app/CMakeLists.txt @@ -1,89 +1,76 @@ -cmake_minimum_required(VERSION 2.8.9...3.22) - -project(polyscope-demo-app) - # Maybe stop from CMAKEing in the wrong place -if (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) - message(FATAL_ERROR "Source and build directories cannot be the same. Go use the /build directory.") +if(CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) + message(FATAL_ERROR "Source and build directories cannot be the same. Go use the /build directory.") endif() -### Configure output locations -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - -### Compiler options -set( CMAKE_EXPORT_COMPILE_COMMANDS 1 ) # Emit a compile flags file to support completion engines +# ## Compiler options +set(CMAKE_EXPORT_COMPILE_COMMANDS 1) # Emit a compile flags file to support completion engines -if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") +if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") # using Clang (linux or apple) or GCC message("Using clang/gcc compiler flags") SET(BASE_CXX_FLAGS "-std=c++11 -Wall -Wextra -g3") SET(DISABLED_WARNINGS " -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-deprecated-declarations -Wno-missing-braces") SET(TRACE_INCLUDES " -H -Wno-error=unused-command-line-argument") - if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") message("Setting clang-specific options") SET(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -ferror-limit=5 -fcolor-diagnostics") - SET(CMAKE_CXX_FLAGS_DEBUG "-fsanitize=address -fno-limit-debug-info") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + SET(CMAKE_CXX_FLAGS_DEBUG "-fsanitize=address -fno-limit-debug-info") + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") SET(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -fmax-errors=5") - SET(CMAKE_CXX_FLAGS_DEBUG "-fsanitize=address") + SET(CMAKE_CXX_FLAGS_DEBUG "-fsanitize=address") message("Setting gcc-specific options") SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} -Wno-maybe-uninitialized -Wno-format-zero-length -Wno-unused-but-set-parameter -Wno-unused-but-set-variable") endif() - SET(CMAKE_CXX_FLAGS "${BASE_CXX_FLAGS} ${DISABLED_WARNINGS}") - #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TRACE_INCLUDES}") # uncomment if you need to track down where something is getting included from - SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g3") - SET(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG") + + # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TRACE_INCLUDES}") # uncomment if you need to track down where something is getting included from + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g3") + SET(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG") include(CheckCXXCompilerFlag) - CHECK_CXX_COMPILER_FLAG(-march=native COMPILER_SUPPORTS_MARCH_NATIVE) + CHECK_CXX_COMPILER_FLAG(-march=native COMPILER_SUPPORTS_MARCH_NATIVE) + if(COMPILER_SUPPORTS_MARCH_NATIVE) set(MARCH_NATIVE "-march=native") else() set(MARCH_NATIVE "") endif() - SET(CMAKE_CXX_FLAGS_RELEASE "${MARCH_NATIVE} -O3 -DNDEBUG") + + SET(CMAKE_CXX_FLAGS_RELEASE "${MARCH_NATIVE} -O3 -DNDEBUG") SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") -elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # using Visual Studio C++ message("Using Visual Studio compiler flags") set(BASE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") set(BASE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") # parallel build - SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4267\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) - SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4244\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) - SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4305\"") # ignore truncation on initialization + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4267\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4244\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4305\"") # ignore truncation on initialization SET(CMAKE_CXX_FLAGS "${BASE_CXX_FLAGS} ${DISABLED_WARNINGS}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") add_definitions(/D "_CRT_SECURE_NO_WARNINGS") - add_definitions (-DNOMINMAX) + add_definitions(-DNOMINMAX) else() # unrecognized - message( FATAL_ERROR "Unrecognized compiler [${CMAKE_CXX_COMPILER_ID}]" ) + message(FATAL_ERROR "Unrecognized compiler [${CMAKE_CXX_COMPILER_ID}]") endif() -# Add polyscope -add_subdirectory(../../ "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") - -# Catch the usage of obsolete functions in imgui -target_compile_definitions(imgui PUBLIC IMGUI_DISABLE_OBSOLETE_FUNCTIONS) - # Create an executable add_executable( - polyscopedemo - demo_app.cpp - simple_dot_mesh_parser.cpp - surface_mesh_io.cpp - ) + polyscopedemo + demo_app.cpp + simple_dot_mesh_parser.cpp + surface_mesh_io.cpp +) -target_include_directories(polyscopedemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../deps/args") -target_include_directories(polyscopedemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../deps/json/include") +find_package(args REQUIRED) target_include_directories(polyscopedemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../deps/happly") -target_include_directories(polyscopedemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../deps/stb") +target_include_directories(polyscopedemo PRIVATE "${Stb_INCLUDE_DIR}") target_include_directories(polyscopedemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") -target_link_libraries(polyscopedemo polyscope stb) +find_package(imgui CONFIG REQUIRED) +target_link_libraries(polyscopedemo polyscope imgui::imgui taywee::args) diff --git a/examples/demo-app/demo_app.cpp b/examples/demo-app/demo_app.cpp index afa339b85..877a209a4 100644 --- a/examples/demo-app/demo_app.cpp +++ b/examples/demo-app/demo_app.cpp @@ -22,15 +22,14 @@ #include #include -#include "args/args.hxx" +#include "args.hxx" #include "happly.h" -#include "nlohmann/json.hpp" +#include "nlohmann/json.hpp/json.hpp" #include "simple_dot_mesh_parser.h" #include "surface_mesh_io.h" #include "glm/gtx/string_cast.hpp" - #include "stb_image.h" diff --git a/examples/navigating-intrinsic-triangulations-demo/CMakeLists.txt b/examples/navigating-intrinsic-triangulations-demo/CMakeLists.txt new file mode 100644 index 000000000..441b24d67 --- /dev/null +++ b/examples/navigating-intrinsic-triangulations-demo/CMakeLists.txt @@ -0,0 +1,65 @@ +# ## Configure the compiler +# This is a basic, decent setup that should do something sane on most compilers + +if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + # using Clang (linux or apple) or GCC + message("Using clang/gcc compiler flags") + SET(BASE_CXX_FLAGS "-std=c++11 -Wall -Wextra -g3") + SET(DISABLED_WARNINGS " -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-deprecated-declarations -Wno-missing-braces -Wno-unused-private-field") + SET(TRACE_INCLUDES " -H -Wno-error=unused-command-line-argument") + + if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + message("Setting clang-specific options") + SET(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -ferror-limit=3 -fcolor-diagnostics") + SET(CMAKE_CXX_FLAGS_DEBUG "-fsanitize=address -fno-limit-debug-info") + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + message("Setting gcc-specific options") + SET(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -fmax-errors=5") + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} -Wno-maybe-uninitialized -Wno-format-zero-length -Wno-unused-but-set-parameter -Wno-unused-but-set-variable") + endif() + + SET(CMAKE_CXX_FLAGS "${BASE_CXX_FLAGS} ${DISABLED_WARNINGS}") + SET(CMAKE_CXX_FLAGS_DEBUG "-g3") + + include(CheckCXXCompilerFlag) + CHECK_CXX_COMPILER_FLAG(-march=native COMPILER_SUPPORTS_MARCH_NATIVE) + + if(COMPILER_SUPPORTS_MARCH_NATIVE) + set(MARCH_NATIVE "-march=native") + else() + set(MARCH_NATIVE "") + endif() + + SET(CMAKE_CXX_FLAGS_RELEASE "${MARCH_NATIVE} -O3 -DNDEBUG") + +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # using Visual Studio C++ + message("Using Visual Studio compiler flags") + set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} /W4") + set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} /MP") # parallel build + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4267\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4244\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4305\"") # ignore truncation on initialization + SET(CMAKE_CXX_FLAGS "${BASE_CXX_FLAGS} ${DISABLED_WARNINGS}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") + + add_definitions(/D "_CRT_SECURE_NO_WARNINGS") + add_definitions(-DNOMINMAX) + add_definitions(-D_USE_MATH_DEFINES) +else() + # unrecognized + message(FATAL_ERROR "Unrecognized compiler [${CMAKE_CXX_COMPILER_ID}]") +endif() + +set(SRCS + main.cpp + + # add any other source files here +) + +add_executable(int_tri "${SRCS}") +find_package(args REQUIRED) +find_package(imgui CONFIG REQUIRED) +target_include_directories(int_tri PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include/") +target_link_libraries(int_tri geometry-central polyscope imgui::imgui taywee::args) diff --git a/examples/navigating-intrinsic-triangulations-demo/main.cpp b/examples/navigating-intrinsic-triangulations-demo/main.cpp new file mode 100644 index 000000000..646b31b1f --- /dev/null +++ b/examples/navigating-intrinsic-triangulations-demo/main.cpp @@ -0,0 +1,582 @@ +#include "geometrycentral/surface/boundary_first_flattening.h" +#include "geometrycentral/surface/common_subdivision.h" +#include "geometrycentral/surface/heat_method_distance.h" +#include "geometrycentral/surface/manifold_surface_mesh.h" +#include "geometrycentral/surface/meshio.h" +#include "geometrycentral/surface/signpost_intrinsic_triangulation.h" +#include "geometrycentral/surface/surface_centers.h" + + +#include "polyscope/curve_network.h" +#include "polyscope/pick.h" +#include "polyscope/point_cloud.h" +#include "polyscope/polyscope.h" +#include "polyscope/surface_mesh.h" + + +#include "args.hxx" +#include "imgui.h" + +#include + +using namespace geometrycentral; +using namespace geometrycentral::surface; + +// == Geometry-central data +std::unique_ptr mesh; +std::unique_ptr geometry; + +std::unique_ptr signpostTri; + +// Polyscope visualization handle, to quickly add data to the surface +bool withGUI = true; +bool generateColoredTriangleViz = false; +polyscope::SurfaceMesh* psMesh = nullptr; +polyscope::SurfaceMesh* psMeshColoredTri = nullptr; + +// Parameters +float refineToSize = -1; +float refineDegreeThresh = 25; +bool useRefineSizeThresh = false; +bool useInsertionsMax; +int insertionsMax = -2; +bool showParameterization = false; + +VertexData uvCoords; + +// Mesh stats +bool signpostIsDelaunay = true; +float signpostMinAngleDeg = 0.; + +// Output options +std::string outputPrefix; + +std::unique_ptr heatSolver; +VertexData distances; +bool showDistances = false; +SurfacePoint sourcePoint; +bool hasSource = false; +bool waitingForPick = false; + +void updateTriagulationViz() { + if (!withGUI) { + return; + } + + // Update stats + signpostIsDelaunay = signpostTri->isDelaunay(); + signpostMinAngleDeg = signpostTri->minAngleDegrees(); + + + // Get the edge traces + EdgeData> traces = signpostTri->traceAllIntrinsicEdgesAlongInput(); + + // Convert to 3D positions + std::vector> traces3D(traces.size()); + size_t i = 0; + for (Edge e : signpostTri->mesh.edges()) { + for (SurfacePoint& p : traces[e]) { + traces3D[i].push_back(p.interpolate(geometry->inputVertexPositions)); + } + i++; + } + std::vector tracesPts; + std::vector> tracesEdgeInds; + for (std::vector& line : traces3D) { + if (line.size() < 2) continue; + tracesPts.push_back(line[0]); + for (size_t i = 0; i < line.size() - 1; i++) { + tracesPts.push_back(line[i + 1]); + tracesEdgeInds.push_back({tracesPts.size() - 2, tracesPts.size() - 1}); + } + } + + + // Register with polyscope + auto psCurves = polyscope::registerCurveNetwork("intrinsic edges", tracesPts, tracesEdgeInds); + psCurves->setEnabled(true); + + // == Manage the colored overlay triangle viz + if (psMeshColoredTri) { + polyscope::removeStructure(psMeshColoredTri); + psMeshColoredTri = nullptr; + psMesh->setEnabled(true); + } + if (generateColoredTriangleViz) { + + bool success = false; + VertexData csPositions; + FaceData niceColorValCs; + ManifoldSurfaceMesh* csMesh; + try { + + CommonSubdivision& cs = signpostTri->getCommonSubdivision(); + cs.constructMesh(); + csMesh = cs.mesh.get(); + csPositions = cs.interpolateAcrossA(geometry->vertexPositions); + FaceData niceColorValInt = niceColors(cs.meshB); + niceColorValCs = FaceData(*cs.mesh); + for (Face f : cs.mesh->faces()) { + niceColorValCs[f] = niceColorValInt[cs.sourceFaceB[f]]; + } + success = true; + } catch (std::runtime_error& e) { + polyscope::warning("Extracing common subdivision numerically did not yield perfect connectvity. Try using " + "Integer Coordinates instead!"); + generateColoredTriangleViz = false; + } + + if (success) { + psMeshColoredTri = polyscope::registerSurfaceMesh("intrinsic triangle viz", csPositions, + csMesh->getFaceVertexList(), polyscopePermutations(*csMesh)); + auto* q = psMeshColoredTri->addFaceScalarQuantity("color val", niceColorValCs); + q->setColorMap("turbo"); + q->setEnabled(true); + + // disable the other viz's so it's easy to see + psMesh->setEnabled(false); + psCurves->setEnabled(false); + } + } +} + +void resetTriangulation() { + signpostTri.reset(new SignpostIntrinsicTriangulation(*mesh, *geometry)); + updateTriagulationViz(); +} + + +void flipDelaunayTriangulation() { + std::cout << "Flipping triangulation to Delaunay" << std::endl; + signpostTri->flipToDelaunay(); + + if (!signpostTri->isDelaunay()) { + polyscope::warning("woah, failed to make mesh Delaunay with flips"); + } + + updateTriagulationViz(); +} + +void refineDelaunayTriangulation() { + + if (mesh->hasBoundary()) { + polyscope::error("Support for refining meshes with boundary is experimental; proceed with caution!"); + } + + // Manage optional parameters + double sizeParam = useRefineSizeThresh ? refineToSize : std::numeric_limits::infinity(); + size_t maxInsertions = useInsertionsMax ? insertionsMax : INVALID_IND; + + std::cout << "Refining triangulation to Delaunay with: degreeThresh=" << refineDegreeThresh + << " circumradiusThresh=" << refineToSize << " maxInsertions=" << maxInsertions << std::endl; + + signpostTri->delaunayRefine(refineDegreeThresh, sizeParam, maxInsertions); + + if (!signpostTri->isDelaunay()) { + polyscope::warning( + "Failed to make mesh Delaunay with flips & refinement. Bug Nick to finish porting implementation."); + } + + updateTriagulationViz(); +} + +template +void saveMatrix(std::string filename, SparseMatrix& matrix) { + + // WARNING: this follows matlab convention and thus is 1-indexed + + std::cout << "Writing sparse matrix to: " << filename << std::endl; + + std::ofstream outFile(filename); + if (!outFile) { + throw std::runtime_error("failed to open output file " + filename); + } + + // Write a comment on the first line giving the dimensions + outFile << "# sparse " << matrix.rows() << " " << matrix.cols() << std::endl; + + outFile << std::setprecision(16); + + for (int k = 0; k < matrix.outerSize(); ++k) { + for (typename SparseMatrix::InnerIterator it(matrix, k); it; ++it) { + T val = it.value(); + size_t iRow = it.row(); + size_t iCol = it.col(); + + outFile << (iRow + 1) << " " << (iCol + 1) << " " << val << std::endl; + } + } + + outFile.close(); +} + +template +void saveMatrix(std::string filename, DenseMatrix& matrix) { + + std::cout << "Writing dense matrix to: " << filename << std::endl; + + std::ofstream outFile(filename); + if (!outFile) { + throw std::runtime_error("failed to open output file " + filename); + } + + // Write a comment on the first line giving the dimensions + outFile << "# dense " << matrix.rows() << " " << matrix.cols() << std::endl; + + outFile << std::setprecision(16); + + for (size_t iRow = 0; iRow < (size_t)matrix.rows(); iRow++) { + for (size_t iCol = 0; iCol < (size_t)matrix.cols(); iCol++) { + T val = matrix(iRow, iCol); + outFile << val; + if (iCol + 1 != (size_t)matrix.cols()) { + outFile << " "; + } + } + outFile << std::endl; + } + + outFile.close(); +} + +void outputIntrinsicFaces() { + + signpostTri->requireVertexIndices(); + signpostTri->requireEdgeLengths(); + + // Assemble Fx3 adjacency matrices vertex indices and edge lengths + size_t nV = signpostTri->mesh.nVertices(); + size_t nF = signpostTri->mesh.nFaces(); + + DenseMatrix faceLengths(nF, 3); + DenseMatrix faceInds(nF, 3); + + size_t iF = 0; + for (Face f : signpostTri->mesh.faces()) { + + Halfedge he = f.halfedge(); + for (int v = 0; v < 3; v++) { + + Vertex vA = he.vertex(); + Vertex vB = he.twin().vertex(); + size_t indA = signpostTri->vertexIndices[vA]; + size_t indB = signpostTri->vertexIndices[vB]; + Edge e = he.edge(); + double l = signpostTri->edgeLengths[e]; + + faceLengths(iF, v) = l; + faceInds(iF, v) = indA; + + he = he.next(); + } + + iF++; + } + + saveMatrix("faceInds.dmat", faceInds); + saveMatrix("faceLengths.dmat", faceLengths); +} + +void outputVertexPositions() { + + signpostTri->requireVertexIndices(); + + size_t nV = signpostTri->mesh.nVertices(); + DenseMatrix vertexPositions(nV, 3); + + VertexData intrinsicPositions(*signpostTri->intrinsicMesh); + for (Vertex v : signpostTri->intrinsicMesh->vertices()) { + intrinsicPositions[v] = signpostTri->equivalentPointOnInput(v).interpolate(geometry->vertexPositions); + } + + size_t iV = 0; + for (Vertex v : signpostTri->mesh.vertices()) { + Vector3 p = intrinsicPositions[v]; + vertexPositions(iV, 0) = p.x; + vertexPositions(iV, 1) = p.y; + vertexPositions(iV, 2) = p.z; + iV++; + } + + saveMatrix("vertexPositions.dmat", vertexPositions); +} + +void outputLaplaceMat() { + signpostTri->requireCotanLaplacian(); + saveMatrix("laplace.spmat", signpostTri->cotanLaplacian); +} + +void outputInterpolatMat() { + signpostTri->requireVertexIndices(); + + // Assemble Fx3 adjacency matrices vertex indices and edge lengths + size_t nV = signpostTri->mesh.nVertices(); + + SparseMatrix interpMat(nV, nV); + std::vector> triplets; + + size_t iV = 0; + for (Vertex v : signpostTri->mesh.vertices()) { + SurfacePoint p = signpostTri->vertexLocations[v]; + p = p.inSomeFace(); + + Face f = p.face; + + int j = 0; + for (Vertex n : f.adjacentVertices()) { + size_t jV = signpostTri->vertexIndices[n]; + double w = p.faceCoords[j]; + if (w > 0) { + triplets.emplace_back(iV, jV, w); + } + j++; + } + iV++; + } + + interpMat.setFromTriplets(triplets.begin(), triplets.end()); + interpMat.makeCompressed(); + + saveMatrix("interpolate.spmat", interpMat); +} + +void myCallback() { + + ImGui::PushItemWidth(100); + + ImGui::TextUnformatted("Intrinsic triangulation:"); + ImGui::Text(" nVertices = %lu nFaces = %lu", signpostTri->mesh.nVertices(), signpostTri->mesh.nFaces()); + if (signpostIsDelaunay) { + ImGui::Text(" is Delaunay: yes min angle = %.2f degrees", signpostMinAngleDeg); + } else { + ImGui::Text(" is Delaunay: no min angle = %.2f degrees", signpostMinAngleDeg); + } + + if (ImGui::Checkbox("Generate colored triangle viz", &generateColoredTriangleViz)) { + updateTriagulationViz(); + } + + if (ImGui::Button("reset triangulation")) { + resetTriangulation(); + } + + if (ImGui::TreeNode("Delaunay flipping")) { + if (ImGui::Button("flip to Delaunay")) { + flipDelaunayTriangulation(); + } + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Delaunay refinement")) { + ImGui::InputFloat("degree threshold", &refineDegreeThresh); + + ImGui::Checkbox("refine large triangles", &useRefineSizeThresh); + if (useRefineSizeThresh) { + ImGui::InputFloat("size threshold (circumradius)", &refineToSize); + } + + ImGui::Checkbox("limit number of insertions", &useInsertionsMax); + if (useInsertionsMax) { + ImGui::InputInt("num insertions", &insertionsMax); + } + + if (ImGui::Button("Delaunay refine")) { + refineDelaunayTriangulation(); + } + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Parameterization")) { + if (ImGui::Button("Run BFF Parameterization")) { + try { + if (mesh->hasBoundary()) { + BFF bff(*mesh, *geometry); + uvCoords = bff.flatten(); + + // Visualize the parameterization + psMesh->addVertexParameterizationQuantity("UV Coords", uvCoords); + showParameterization = true; + } else { + polyscope::warning("Mesh must have boundary for BFF parameterization"); + } + } catch (const std::exception& e) { + polyscope::warning("Error during BFF parameterization: %s", e.what()); + } + } + + if (showParameterization) { + ImGui::Checkbox("show parameterization", &showParameterization); + if (showParameterization) { + psMesh->getQuantity("UV Coords")->setEnabled(true); + } else { + psMesh->getQuantity("UV Coords")->setEnabled(false); + } + } + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Output")) { + + if (ImGui::Button("intrinsic faces")) outputIntrinsicFaces(); + if (ImGui::Button("vertex positions")) outputVertexPositions(); + if (ImGui::Button("Laplace matrix")) outputLaplaceMat(); + if (ImGui::Button("interpolate matrix")) outputInterpolatMat(); + + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Heat Method Distance")) { + + if (!heatSolver) { + // Initialize solver first time + heatSolver.reset(new HeatMethodDistanceSolver(*geometry)); + } + + // Show current source point status + if (hasSource) { + ImGui::Text("Source point selected"); + } else { + ImGui::Text("No source point selected"); + } + + if (ImGui::Button("Select Random Source Vertex")) { + // Get random vertex index + size_t randomIndex = rand() % mesh->nVertices(); + Vertex sourceVertex = mesh->vertex(randomIndex); + sourcePoint = SurfacePoint(sourceVertex); + + // Compute distances + distances = heatSolver->computeDistance(sourcePoint); + + // Visualize + psMesh->addVertexScalarQuantity("distances", distances); + showDistances = true; + hasSource = true; + } + + if (showDistances) { + ImGui::Checkbox("Show distances", &showDistances); + if (showDistances) { + psMesh->getQuantity("distances")->setEnabled(true); + } else { + psMesh->getQuantity("distances")->setEnabled(false); + } + + // Show distance statistics + if (hasSource) { + double maxDist = 0; + for (Vertex v : mesh->vertices()) { + maxDist = std::max(maxDist, distances[v]); + } + ImGui::Text("Maximum distance: %.3f", maxDist); + } + } + + ImGui::TreePop(); + } + + ImGui::PopItemWidth(); +} + +int main(int argc, char** argv) { + + // Configure the argument parser + // clang-format off + args::ArgumentParser parser("A demo of Navigating Intrinsic Triangulations"); + args::HelpFlag help(parser, "help", "Display this help message", {'h', "help"}); + args::ValueFlag inputFilename(parser, "mesh", "A .obj or .ply mesh file.", {"input"}, "./face.obj"); + + args::Group triangulation(parser, "triangulation"); + args::Flag flipDelaunay(triangulation, "flipDelaunay", "Flip edges to make the mesh intrinsic Delaunay", {"flipDelaunay"}); + args::Flag refineDelaunay(triangulation, "refineDelaunay", "Refine and flip edges to make the mesh intrinsic Delaunay and satisfy angle/size bounds", {"refineDelaunay"}); + args::ValueFlag refineAngle(triangulation, "refineAngle", "Minimum angle threshold (in degrees). Default: 25.", {"refineAngle"}, 25.); + args::ValueFlag refineSizeCircum(triangulation, "refineSizeCircum", "Maximum triangle size, set by specifying the circumradius. Default: inf", {"refineSizeCircum"}, std::numeric_limits::infinity()); + args::ValueFlag refineMaxInsertions(triangulation, "refineMaxInsertions", + "Maximum number of insertions during refinement. Use 0 for no max, or negative values to scale by number of vertices. Default: 10 * nVerts", + {"refineMaxInsertions"}, -10); + + args::Group output(parser, "ouput"); + args::Flag noGUI(output, "noGUI", "exit after processing and do not open the GUI", {"noGUI"}); + args::ValueFlag outputPrefixArg(output, "outputPrefix", "Prefix to prepend to all output file paths. Default: intrinsic_", {"outputPrefix"}, "intrinsic_"); + args::Flag intrinsicFaces(output, "edgeLengths", "write the face information for the intrinsic triangulation. name: 'faceInds.dmat, faceLengths.dmat'", {"intrinsicFaces"}); + args::Flag vertexPositions(output, "vertexPositions", "write the vertex positions for the intrinsic triangulation. name: 'vertexPositions.dmat'", {"vertexPositions"}); + args::Flag laplaceMat(output, "laplaceMat", "write the Laplace-Beltrami matrix for the triangulation. name: 'laplace.spmat'", {"laplaceMat"}); + args::Flag interpolateMat(output, "interpolateMat", "write the matrix which expresses data on the intrinsic vertices as a linear combination of the input vertices. name: 'interpolate.mat'", {"interpolateMat"}); + // clang-format on + + + // Parse args + try { + parser.ParseCLI(argc, argv); + } catch (args::Help) { + std::cout << parser; + return 0; + } catch (args::ParseError e) { + std::cerr << e.what() << std::endl; + std::cerr << parser; + return 1; + } + + // Make sure a mesh name was given + if (inputFilename.Get() == "") { + std::cout << parser; + return EXIT_FAILURE; + } + + // Set options + withGUI = !noGUI; + + refineDegreeThresh = args::get(refineAngle); + refineToSize = args::get(refineSizeCircum); + useRefineSizeThresh = refineToSize < std::numeric_limits::infinity(); + insertionsMax = args::get(refineMaxInsertions); + useInsertionsMax = insertionsMax != 0; + outputPrefix = args::get(outputPrefixArg); + + // Load mesh + std::tie(mesh, geometry) = readManifoldSurfaceMesh(args::get(inputFilename)); + + // Sale max insertions by number of vertices if needed + if (insertionsMax < 0) { + insertionsMax *= -mesh->nVertices(); + } + + if (withGUI) { + + // Initialize polyscope + polyscope::init(); + + // Set the callback function + polyscope::state::userCallback = myCallback; + + // Register the mesh with polyscope + psMesh = polyscope::registerSurfaceMesh(polyscope::guessNiceNameFromPath(args::get(inputFilename)), + geometry->inputVertexPositions, mesh->getFaceVertexList(), + polyscopePermutations(*mesh)); + + + // Nice defaults + psMesh->setEdgeWidth(1.0); + } + + + // Initialize triangulation + resetTriangulation(); + + // Perform any operations requested + if (flipDelaunay) flipDelaunayTriangulation(); + if (refineDelaunay) refineDelaunayTriangulation(); + + // Generate any outputs + if (intrinsicFaces) outputIntrinsicFaces(); + if (vertexPositions) outputVertexPositions(); + if (laplaceMat) outputLaplaceMat(); + if (interpolateMat) outputInterpolatMat(); + + // Give control to the polyscope gui + if (withGUI) { + polyscope::show(); + } + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/examples/signed-heat-demo/CMakeLists.txt b/examples/signed-heat-demo/CMakeLists.txt new file mode 100644 index 000000000..6870758fe --- /dev/null +++ b/examples/signed-heat-demo/CMakeLists.txt @@ -0,0 +1,78 @@ +# ## Configure the compiler +# This is a basic, decent setup that should do something sane on most compilers + +if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + # using Clang (linux or apple) or GCC + message("Using clang/gcc compiler flags") + SET(CMAKE_CXX_STANDARD 11) + SET(BASE_CXX_FLAGS "-std=c++11 -Wall -Wextra") + SET(DISABLED_WARNINGS " -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-deprecated-declarations -Wno-missing-braces -Wno-unused-label -Wno-register -Wno-sign-compare -Wno-unknown-pragmas -Wno-unused-result -Wno-narrowing -Wno-unused-but-set-variable -Wno-unused-lambda-capture -Wno-unused-local-typedefs") + SET(TRACE_INCLUDES " -H -Wno-error=unused-command-line-argument") + + if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + message("Setting clang-specific options") + SET(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -ferror-limit=3 -Wfatal-errors -fcolor-diagnostics") + SET(CMAKE_CXX_FLAGS_DEBUG "-g3 -fsanitize=address -fno-limit-debug-info") + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + message("Setting gcc-specific options") + SET(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -fmax-errors=5") + SET(CMAKE_CXX_FLAGS_DEBUG "-g3") + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} -Wno-maybe-uninitialized -Wno-format-zero-length -Wno-unused-but-set-parameter -Wno-unused-but-set-variable") + endif() + + SET(CMAKE_CXX_FLAGS "${BASE_CXX_FLAGS} ${DISABLED_WARNINGS} -std=c++11") + + include(CheckCXXCompilerFlag) + unset(COMPILER_SUPPORTS_MARCH_NATIVE CACHE) + CHECK_CXX_COMPILER_FLAG(-march=native COMPILER_SUPPORTS_MARCH_NATIVE) + + if(COMPILER_SUPPORTS_MARCH_NATIVE) + SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native -DNDEBUG -std=c++11") + else() + SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -mcpu=apple-m1 -DNDEBUG -std=c++11") # Apple M1 + endif() + +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # using Visual Studio C++ + message("Using Visual Studio compiler flags") + set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} /W4") + set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} /MP") # parallel build + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4267\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4244\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4305\"") # ignore truncation on initialization + SET(CMAKE_CXX_FLAGS "${BASE_CXX_FLAGS} ${DISABLED_WARNINGS}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") + + add_definitions(/D "_CRT_SECURE_NO_WARNINGS") + add_definitions(-DNOMINMAX) + add_definitions(-D_USE_MATH_DEFINES) +else() + # unrecognized + message(FATAL_ERROR "Unrecognized compiler [${CMAKE_CXX_COMPILER_ID}]") +endif() + +# == Build our project stuff +set(SRCS + src/utils.cpp + src/main.cpp +) + +add_executable(signed-heat-demo "${SRCS}") +target_include_directories(signed-heat-demo PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include/") + +find_package(args REQUIRED) +find_package(imgui CONFIG REQUIRED) +target_link_libraries(signed-heat-demo geometry-central polyscope imgui::imgui taywee::args) + +# Copy data directory to bin directory after build +add_custom_command(TARGET signed-heat-demo POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/data" + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${CMAKE_CURRENT_SOURCE_DIR}/data" + "${CMAKE_CURRENT_BINARY_DIR}/data" + VERBATIM +) + +message(STATUS "Source data dir: ${CMAKE_CURRENT_SOURCE_DIR}/data") +message(STATUS "Target data dir: ${CMAKE_CURRENT_BINARY_DIR}/data") diff --git a/examples/signed-heat-demo/data/armchair-mixed.txt b/examples/signed-heat-demo/data/armchair-mixed.txt new file mode 100644 index 000000000..697014012 --- /dev/null +++ b/examples/signed-heat-demo/data/armchair-mixed.txt @@ -0,0 +1,10 @@ +signed_curve 1 +l 44193 44195 44196 50448 50129 44205 50187 50266 50131 50065 50439 50228 50045 50278 50303 50004 50140 50103 50076 50401 50262 50033 50250 50288 50316 50345 50061 50013 50369 50196 50227 50238 50418 50058 50019 50200 50237 50385 50264 50393 50455 50139 +signed_curve 1 +l 50078 50121 50157 50360 50413 50386 50059 50356 50301 50399 50382 50373 50111 44884 50396 50221 50252 50416 50277 50387 50353 50359 50222 50224 50290 50253 50409 50276 50375 50205 50261 50053 50432 50310 50091 50231 50036 50068 50042 50370 50062 50088 50094 50054 50430 50298 50080 50077 50215 50167 50056 50377 50350 50272 50209 50417 50245 50217 50374 50321 50348 50391 50280 50422 50314 50100 50112 50071 50172 50145 50246 50010 50270 50258 50057 50424 50048 50096 50017 50093 50285 50008 50322 +signed_curve 1 +l 50141 50271 50452 50234 50389 50378 50368 21722 50279 50420 50213 50365 50195 50149 50073 50006 50392 50406 50218 50098 50169 50324 50116 50251 50220 50114 50454 50183 50325 50260 50189 50171 50411 19789 50122 19763 50170 50419 50239 50335 50307 50197 50241 50281 19769 50362 50164 50338 50309 50376 50007 19817 19818 50254 50341 50404 50079 50046 19813 50339 50060 50161 50125 50296 50133 50085 50055 50407 50108 50333 20320 20325 50039 50072 50142 50034 50219 50249 50159 50355 50440 50051 50084 50184 50265 50153 50165 50134 50444 20439 50297 50342 50026 50178 50207 50185 50009 50315 50313 50405 50107 50256 20564 20567 50319 +unsigned_curve +l 50232 50201 50180 50269 50081 50380 50191 50421 50086 50092 50203 50154 50083 50155 50041 50105 50074 50126 50358 50020 50101 50029 50429 50063 50328 50287 28576 50415 50257 50293 50223 50198 50175 50284 50397 50018 50150 50225 50337 50043 50069 50031 50434 28560 50283 50242 50268 50414 50181 50230 50346 28637 50450 50214 50292 50323 50173 50104 50311 50095 50199 50425 50030 50003 50334 50305 27225 50402 50372 50210 50027 50451 50263 50363 50306 50295 50259 50248 50186 50446 50151 50102 50070 50127 50447 50050 50135 50089 50317 50443 50177 50255 50364 50052 50110 50367 50340 50312 50162 50038 50408 26846 50449 50168 50204 50240 50208 50320 50403 50192 50014 50206 50361 50182 50302 50437 50332 50148 50274 50398 50236 7343 50318 50032 50124 50160 50441 50371 50226 7405 50412 50066 50366 50300 50352 50423 50128 50163 50090 50394 50267 50188 50431 50216 50247 50427 50286 50136 50273 50235 50120 50119 50156 50115 50308 50436 50299 50082 50047 50383 50428 50294 50174 50357 50330 50130 50035 50211 50012 50347 50426 50229 50176 6062 50435 50390 50067 50037 50005 50147 50064 50025 50351 50327 50075 50158 50438 50021 50395 50354 50349 50289 50275 50023 50212 50453 50381 50011 50336 50379 50410 5795 5793 5109 +unsigned_point +v 36356 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/block-points.txt b/examples/signed-heat-demo/data/block-points.txt new file mode 100644 index 000000000..1edba42dd --- /dev/null +++ b/examples/signed-heat-demo/data/block-points.txt @@ -0,0 +1,18 @@ +unsigned_point +v 1641 +unsigned_point +v 546 +unsigned_point +v 533 +unsigned_point +v 1795 +unsigned_point +v 1584 +unsigned_point +v 1656 +unsigned_point +v 392 +unsigned_point +v 362 +unsigned_point +v 1584 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/brain-point.txt b/examples/signed-heat-demo/data/brain-point.txt new file mode 100644 index 000000000..a2b0cf3c3 --- /dev/null +++ b/examples/signed-heat-demo/data/brain-point.txt @@ -0,0 +1,4 @@ +unsigned_point +#v 13942 +#v 30656 +v 9770 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/bumpy-sphere.txt b/examples/signed-heat-demo/data/bumpy-sphere.txt new file mode 100644 index 000000000..43470fedb --- /dev/null +++ b/examples/signed-heat-demo/data/bumpy-sphere.txt @@ -0,0 +1,405 @@ +signed_curve +v 4880 +v 5837 +v 4879 +v 5772 +v 6174 +v 5802 +v 5213 +signed_curve +v 6207 +v 6030 +v 6188 +v 6189 +v 6015 +v 6175 +v 6176 +v 5930 +v 5994 +v 6241 +v 6242 +v 5945 +v 5915 +v 6221 +v 5162 +signed_curve +v 6065 +v 6124 +v 5825 +v 5792 +v 5971 +v 5819 +v 5577 +v 5970 +v 5750 +v 6267 +v 5845 +v 5910 +signed_curve +v 6181 +v 6182 +v 5800 +v 6071 +v 6192 +v 5730 +v 6100 +v 5858 +v 6231 +v 5892 +v 5789 +v 5851 +v 5320 +v 6245 +v 5898 +v 6026 +v 6202 +signed_curve +v 5997 +v 6064 +v 5755 +v 6273 +v 6274 +v 5935 +v 5765 +v 6108 +v 5842 +v 6111 +v 5900 +v 6277 +v 5863 +v 6164 +v 6165 +v 5758 +v 6149 +v 5782 +v 6177 +v 6091 +v 6002 +v 5967 +v 6229 +signed_curve +v 5991 +v 6006 +v 6027 +v 5957 +v 6215 +v 6009 +v 5859 +v 5973 +v 6089 +v 6102 +v 6095 +v 6077 +v 6050 +signed_curve +v 5292 +v 6170 +v 6080 +v 6230 +v 5729 +v 5866 +v 5852 +v 5996 +v 6037 +v 5955 +v 6129 +v 5742 +v 6146 +v 5940 +v 5839 +v 6109 +v 5745 +signed_curve +v 6068 +v 6138 +v 5857 +v 5806 +v 6048 +v 6158 +v 6076 +v 5909 +v 5943 +v 5896 +v 5849 +v 6127 +signed_curve +v 5008 +v 6010 +v 5983 +v 6039 +v 5890 +v 5977 +v 5874 +v 6142 +signed_curve +v 5771 +v 5741 +v 5829 +v 5797 +v 5882 +v 5751 +v 5913 +v 5966 +v 6238 +v 5835 +v 5987 +v 6020 +v 6210 +signed_curve +v 6198 +v 5949 +v 5923 +v 5888 +v 6159 +v 5840 +v 6187 +v 5877 +v 6063 +v 6169 +v 6034 +signed_curve +v 5901 +v 5239 +v 6232 +v 6233 +v 6234 +v 5864 +v 6204 +v 6045 +v 6032 +v 6166 +v 5965 +v 5934 +v 6200 +v 5947 +signed_curve +v 6118 +v 6119 +v 6120 +v 6121 +v 6122 +v 6123 +v 5733 +v 5804 +v 5941 +v 6275 +v 5938 +v 4666 +v 6247 +v 6018 +signed_curve +v 5920 +v 6035 +v 5982 +v 5931 +v 6070 +v 5836 +v 6262 +v 6263 +v 5869 +v 6276 +v 5904 +v 6269 +v 5229 +v 6220 +signed_curve +v 4919 +v 5964 +v 5760 +v 6040 +v 5736 +v 6036 +v 6218 +v 6088 +v 5998 +v 5784 +v 4896 +signed_curve +v 6183 +v 5794 +v 4909 +v 6150 +v 6151 +v 6017 +v 6178 +v 5951 +v 6256 +v 6257 +v 5924 +v 5754 +signed_curve +v 5944 +v 6195 +v 6196 +v 6052 +v 5876 +v 6203 +v 6055 +signed_curve +v 5426 +v 5775 +v 5748 +v 5757 +v 5781 +v 5743 +signed_curve +v 5999 +v 6209 +v 5855 +v 5823 +v 6073 +v 5744 +v 5990 +v 6047 +v 5963 +v 5988 +v 5796 +v 6239 +v 5975 +v 5959 +v 5747 +signed_curve +v 6213 +v 5854 +v 6265 +v 6033 +v 5907 +v 4989 +v 5856 +v 6225 +v 6226 +v 6227 +v 5761 +signed_curve +v 6173 +v 5968 +v 5005 +v 5016 +v 5801 +v 5817 +v 5826 +v 5952 +v 5827 +v 4747 +v 5895 +v 4748 +v 6023 +v 5770 +signed_curve +v 6042 +v 5035 +v 5899 +v 6216 +v 5045 +v 5814 +v 6240 +v 5885 +v 6051 +v 6252 +v 6253 +v 6078 +signed_curve +v 5799 +v 5788 +v 4775 +v 5777 +v 5865 +v 6228 +signed_curve +v 6249 +v 6250 +v 6251 +v 5881 +v 5960 +v 5992 +v 6266 +v 6022 +v 6054 +v 5798 +signed_curve +v 6098 +v 6154 +v 5918 +v 6168 +v 5884 +v 6116 +v 6117 +v 5953 +v 6004 +v 5974 +v 6258 +v 6259 +v 5810 +signed_curve +v 5880 +v 5889 +v 6199 +v 5816 +v 5732 +v 6235 +signed_curve +v 6113 +v 5830 +v 5932 +v 5803 +v 6110 +v 5776 +v 5969 +v 6261 +v 6003 +signed_curve +v 6222 +v 5815 +v 6061 +v 6090 +v 6190 +v 5353 +v 5773 +v 6167 +v 5795 +v 6152 +signed_curve +v 6254 +v 6255 +v 6092 +v 6219 +v 5192 +v 5989 +v 5897 +v 5728 +v 6155 +v 6079 +v 5872 +v 5946 +signed_curve +v 4865 +v 5860 +v 6043 +v 6074 +v 6147 +v 6097 +v 6072 +v 6201 +signed_curve +v 5807 +v 5841 +v 5873 +v 5822 +v 6243 +v 5958 +v 5354 +v 6115 +v 5981 +signed_curve +v 5993 +v 5962 +v 6128 +v 5834 +v 5867 +v 5902 +v 5979 +v 5783 +v 5927 +v 6099 +v 5868 +v 4880 diff --git a/examples/signed-heat-demo/data/cactus.txt b/examples/signed-heat-demo/data/cactus.txt new file mode 100644 index 000000000..b9f1a6727 --- /dev/null +++ b/examples/signed-heat-demo/data/cactus.txt @@ -0,0 +1,6 @@ +signed_curve 1 +l 5193 5044 5069 5247 5179 5157 5264 5185 5270 5028 5108 5142 5256 5037 5083 5201 5222 5144 5197 5246 5123 5156 5117 5259 5019 5092 5055 5245 5124 5203 5073 5064 5244 5012 5140 5237 5147 5251 5172 5260 3023 5062 5013 5257 5035 5027 5212 5163 5174 5227 5072 5184 5151 5253 5031 5045 5193 +signed_curve 0 +l 5218 3807 5091 5133 5273 5042 5104 5183 5168 5102 5274 5080 5105 5267 5078 5148 116 5190 5236 5054 5248 5249 5024 5217 5036 5029 5242 5007 5155 5009 5094 5146 5145 5001 5254 5186 5096 5006 5082 5051 5040 5276 5182 5220 5106 5204 5208 5026 5139 5218 +signed_curve 0 +l 5068 3385 4615 5250 5061 5176 5224 5150 5118 5266 5110 5238 5032 5053 5241 5127 5198 5120 5223 5149 5122 5225 5226 5071 5059 5210 5211 5097 5065 5243 5152 5233 5234 5136 5101 5093 5041 5255 5115 5153 5121 5205 5017 5239 5195 5070 4386 4860 5183 87 88 5132 5107 5220 5137 5170 5113 5200 5090 5034 5194 5046 5159 5058 5116 5202 5235 5030 5112 5161 5099 5103 5131 5075 5114 5109 5135 5199 5081 5038 5020 5021 5005 5165 5095 5060 5129 5076 5268 5207 5231 5232 5206 5192 5008 5229 5230 5039 5079 5214 5043 5111 5128 5215 5164 5154 5143 5086 5180 5272 5160 5221 5077 5052 5261 5262 5263 5187 5213 5084 5209 5015 5271 5138 5089 5134 5010 5085 5050 5067 5002 5088 5048 5219 5066 5189 5016 5125 5100 5191 5275 5188 5264 5158 5167 5049 5126 5057 5181 5240 5018 5259 5022 5025 5056 5171 5074 5011 5269 5087 5178 5162 5004 5098 5023 5169 5228 1611 5141 5175 5130 5252 1272 5173 5196 5003 5166 5047 5177 5033 5014 5216 5063 5265 5119 5258 5068 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/dilo-unsigned.txt b/examples/signed-heat-demo/data/dilo-unsigned.txt new file mode 100644 index 000000000..deeb464ab --- /dev/null +++ b/examples/signed-heat-demo/data/dilo-unsigned.txt @@ -0,0 +1,4 @@ +unsigned_curve +l 27194 27215 27214 27182 27199 27221 27176 27206 27186 27227 27207 27175 27188 27212 27202 27178 27192 27226 27185 27234 27179 27209 27205 27233 27213 27229 27200 27184 27181 27183 27195 27198 27225 27204 27228 27196 27210 27177 27230 27191 27216 27211 27219 27197 27190 +unsigned_curve +l 27329 27273 27281 27328 27262 27334 27295 27266 27325 27259 27302 27288 27340 27308 27336 27285 27287 27305 27306 27321 27296 27335 27245 27304 27331 27297 27243 27317 27322 27274 27309 27275 27319 27253 27300 27272 27286 27242 27320 27333 27292 27303 27293 27240 27246 27311 27332 27294 27298 27247 27337 27239 27249 27267 27324 27256 27258 27236 27244 27312 27248 27282 27291 27279 27283 27276 27315 27284 27268 27250 27254 27238 27271 27307 27290 27289 27252 27314 27330 27318 27313 27299 27263 27326 27255 27310 27241 27327 27316 27237 27261 27251 27339 27264 27270 27257 27269 27265 27301 27323 27278 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/dragon-mixed.txt b/examples/signed-heat-demo/data/dragon-mixed.txt new file mode 100644 index 000000000..93e9b0cd4 --- /dev/null +++ b/examples/signed-heat-demo/data/dragon-mixed.txt @@ -0,0 +1,345 @@ +unsigned_point +v 49166 +signed_curve +v 3952 +v 52578 +v 52655 +v 52975 +v 52621 +v 3961 +v 52832 +v 52647 +v 52684 +v 52934 +v 52716 +v 52597 +v 52567 +v 52831 +v 52699 +v 52951 +v 52864 +v 52816 +v 52688 +v 52599 +v 52572 +v 52515 +v 52628 +v 6522 +signed_curve +v 52627 +v 52810 +v 52700 +v 52701 +v 52917 +v 52970 +v 52546 +v 52778 +v 52615 +v 52651 +v 52931 +v 12227 +v 52885 +v 52635 +v 52513 +v 52637 +v 52867 +v 52586 +v 52793 +v 52552 +v 52532 +v 52523 +v 52598 +v 52543 +v 52882 +signed_curve +v 52697 +v 52703 +v 52977 +v 52880 +v 52926 +v 52732 +v 52536 +v 52969 +v 52860 +v 52551 +v 52556 +v 52752 +v 52800 +v 7941 +v 52857 +v 52650 +v 52748 +v 52973 +v 52741 +v 52619 +v 52756 +v 52683 +v 52878 +v 52608 +v 52714 +v 52805 +v 52604 +v 52568 +v 52607 +v 52840 +v 52785 +v 52579 +v 52893 +v 52985 +v 52570 +v 52534 +v 52618 +v 52591 +v 52672 +v 52698 +v 52939 +v 52767 +v 52573 +v 52789 +signed_curve +v 52535 +v 52919 +v 52632 +v 52859 +v 52967 +v 52843 +v 52518 +v 52863 +v 52686 +v 52948 +v 52596 +v 52566 +v 52892 +v 52966 +v 7753 +v 52833 +v 52702 +v 52877 +v 52804 +v 52611 +v 52576 +v 52516 +v 52721 +v 52983 +v 52583 +v 52592 +v 52537 +v 52915 +v 52870 +v 52881 +v 52964 +v 52791 +v 52547 +v 52874 +v 52844 +v 52642 +v 52776 +v 52768 +v 52968 +signed_curve +v 7598 +v 52634 +v 52656 +v 52834 +v 52670 +v 52725 +v 2857 +v 2869 +v 52781 +v 52901 +v 52742 +v 16114 +v 52682 +v 52724 +v 52548 +v 52526 +v 52758 +v 52629 +v 52540 +v 52639 +v 52956 +v 52780 +v 52830 +v 52751 +v 52760 +v 52723 +v 52766 +v 52761 +v 52574 +v 52988 +signed_curve +v 52524 +v 52896 +v 52636 +v 52661 +v 52565 +v 17258 +v 52590 +v 52557 +v 52691 +v 52722 +v 52872 +v 52890 +v 52841 +v 52875 +v 52577 +v 52775 +v 52974 +v 10987 +v 52665 +v 52529 +v 12851 +v 52839 +v 52657 +v 52763 +v 52585 +v 52971 +v 21262 +v 52815 +v 52821 +v 52652 +v 52680 +v 52942 +v 52520 +v 52744 +v 52807 +v 52899 +v 52894 +v 52561 +v 52541 +v 52620 +v 21301 +v 52762 +v 52631 +v 52790 +v 52692 +v 52730 +v 52734 +v 21865 +signed_curve +v 52837 +v 52707 +v 52622 +v 52947 +v 52713 +v 52575 +v 52690 +v 52770 +v 52601 +v 52606 +v 52558 +v 52750 +v 52749 +v 52743 +v 52788 +v 52819 +v 52799 +v 52817 +v 52952 +v 52842 +v 52755 +v 52803 +v 52898 +v 52986 +v 52654 +v 52689 +v 52826 +v 52853 +v 52869 +v 52797 +v 52976 +v 52856 +v 52544 +v 52633 +v 52571 +v 52936 +v 52645 +v 52681 +v 52715 +v 52949 +v 52660 +v 52754 +v 52813 +v 52739 +v 52704 +v 52943 +v 52706 +signed_curve +v 52582 +v 52824 +v 52736 +v 52786 +v 52829 +v 52823 +v 52887 +v 21911 +v 52910 +v 52855 +v 52519 +v 52711 +v 52782 +v 52640 +v 52727 +v 52667 +v 52972 +v 21443 +v 21597 +v 52521 +v 52769 +v 52668 +v 52564 +v 52945 +v 52696 +v 52581 +v 52738 +v 52978 +v 52783 +v 52818 +v 52587 +v 52555 +v 52958 +v 18797 +v 52884 +v 52671 +v 52922 +v 52861 +v 52808 +v 52920 +v 52979 +v 52908 +v 52609 +signed_curve +v 52603 +v 52626 +v 52957 +v 52613 +v 52644 +v 6412 +v 52944 +v 52822 +v 52617 +v 52528 +v 52902 +v 3878 +v 52873 +v 52913 +v 52954 +v 52588 +v 52846 +v 52838 +v 52963 +v 52905 +v 52737 +v 52980 +v 52794 +v 52709 +v 52795 +v 52827 +v 52563 +v 52787 +v 52600 +v 52674 +v 52694 +v 52624 +v 52930 +v 52554 diff --git a/examples/signed-heat-demo/data/duck.txt b/examples/signed-heat-demo/data/duck.txt new file mode 100644 index 000000000..f6e0cd954 --- /dev/null +++ b/examples/signed-heat-demo/data/duck.txt @@ -0,0 +1,251 @@ +signed_curve +v 9869 +v 6069 +v 10084 +v 10038 +v 10076 +v 9838 +v 10062 +v 9908 +signed_curve +v 9905 +v 9955 +v 9891 +v 9939 +v 9809 +signed_curve +v 9796 +v 9909 +v 9864 +v 9889 +v 9816 +v 9793 +v 228 +v 10069 +signed_curve +v 9968 +v 9877 +v 9935 +v 10061 +v 9884 +v 9789 +v 9868 +v 10035 +v 9971 +v 2594 +signed_curve +v 10034 +v 9913 +v 9848 +v 9960 +v 10005 +v 9920 +v 9828 +v 10016 +v 10063 +v 9804 +v 10088 +v 10089 +v 9915 +signed_curve +v 10056 +v 9821 +v 10032 +v 9963 +v 6974 +v 10048 +v 9896 +signed_curve +v 9895 +v 9991 +v 1512 +v 9987 +v 9893 +v 9947 +v 9961 +v 9914 +v 9852 +v 9847 +v 9870 +signed_curve +v 9900 +v 9854 +v 9916 +v 9875 +v 9820 +v 9823 +v 9995 +signed_curve +v 10023 +v 6928 +v 9927 +v 9983 +v 9888 +v 9792 +signed_curve +v 10033 +v 10080 +v 9885 +v 9957 +v 9811 +v 9791 +v 9906 +v 10065 +signed_curve +v 9907 +v 9810 +v 9876 +v 9880 +v 9932 +v 6881 +signed_curve +v 9918 +v 9832 +v 10075 +v 9825 +v 1838 +v 10003 +v 10077 +v 9993 +v 10029 +signed_curve +v 10044 +v 9950 +v 9887 +v 9948 +v 9996 +v 9965 +v 9834 +v 9890 +v 9843 +signed_curve +v 9846 +v 9966 +v 10011 +v 9799 +v 9978 +v 9936 +v 9818 +v 10009 +v 569 +signed_curve +v 10082 +v 502 +v 9874 +v 9882 +v 9824 +v 9999 +signed_curve +v 9998 +v 1765 +v 10072 +v 10031 +signed_curve +v 10055 +v 9802 +v 10060 +v 9946 +v 9790 +signed_curve +v 9865 +v 9924 +v 10064 +v 10040 +v 9962 +v 9858 +signed_curve +v 9837 +v 10014 +v 9959 +v 9911 +v 9881 +v 9940 +v 10071 +v 9923 +v 857 +v 6758 +signed_curve +v 9919 +v 9814 +v 10045 +v 873 +v 9954 +signed_curve +v 10067 +v 10030 +v 9931 +v 9975 +v 9902 +v 9845 +v 9879 +v 1589 +v 9964 +signed_curve +v 9984 +v 10017 +v 10012 +v 10057 +v 9917 +v 10079 +v 10053 +v 9795 +v 9982 +signed_curve +v 10028 +v 7022 +v 9706 +v 10026 +signed_curve +v 1125 +v 10015 +v 9857 +v 9925 +v 9844 +signed_curve +v 805 +v 10001 +v 6718 +signed_curve +v 10010 +v 9817 +v 9808 +v 9813 +v 9861 +v 6536 +signed_curve +v 9863 +v 10046 +v 9859 +v 9941 +signed_curve +v 9974 +v 10027 +v 6705 +v 10086 +v 9928 +signed_curve +v 10013 +v 9943 +v 9867 +v 9997 +v 9812 +v 10090 +v 10091 +v 9930 +v 747 +signed_curve +v 442 +v 10083 +v 9986 +v 10008 +v 412 +v 10019 +signed_curve +v 9958 +v 10000 +v 9934 +v 9926 +v 9977 +signed_curve +v 6068 +v 9869 diff --git a/examples/signed-heat-demo/data/ducky-star.pc b/examples/signed-heat-demo/data/ducky-star.pc new file mode 100644 index 000000000..6f2fc993e --- /dev/null +++ b/examples/signed-heat-demo/data/ducky-star.pc @@ -0,0 +1,36180 @@ +v 1.10469 2.29441 -1.40199 +vn 0.677106 0.524339 -0.516329 +v 1.14712 2.2885 -1.34533 +vn 0.729875 0.525551 -0.437126 +v 1.1359 2.2569 -1.39604 +vn 0.716604 0.474995 -0.510742 +v 1.12447 2.2206 -1.44086 +vn 0.690406 0.433132 -0.579427 +v 1.16698 2.21931 -1.38411 +vn 0.752384 0.433 -0.496416 +v 1.15526 2.18413 -1.42835 +vn 0.734226 0.394066 -0.552833 +v 1.19273 2.28035 -1.26952 +vn 0.771639 0.514495 -0.373989 +v 1.1844 2.24657 -1.32848 +vn 0.770535 0.476946 -0.422845 +v 1.19344 2.21672 -1.34337 +vn 0.786531 0.429063 -0.444156 +v 1.20329 2.1822 -1.357 +vn 0.794069 0.395119 -0.461883 +v 1.094 2.26422 -1.44188 +vn 0.639264 0.48017 -0.600648 +v 1.06627 2.30434 -1.43677 +vn 0.618696 0.518818 -0.589952 +v 1.08689 2.22402 -1.47785 +vn 0.617611 0.433895 -0.655967 +v 1.05454 2.23869 -1.49722 +vn 0.636304 0.437553 -0.635346 +v 1.14518 2.14969 -1.46337 +vn 0.706035 0.358757 -0.61058 +v 1.11419 2.18608 -1.47554 +vn 0.651804 0.393277 -0.648448 +v 1.10979 2.13972 -1.50532 +vn 0.642533 0.348256 -0.682546 +v 1.07481 2.15395 -1.52893 +vn 0.63626 0.363024 -0.680725 +v 1.07696 2.33926 -1.38968 +vn 0.649466 0.573328 -0.499489 +v 1.05199 2.43696 -1.26839 +vn 0.593467 0.742722 -0.310099 +v 1.07535 2.40304 -1.29984 +vn 0.618474 0.694259 -0.368096 +v 1.05861 2.40495 -1.32266 +vn 0.606142 0.687025 -0.400736 +v 1.03322 2.31961 -1.45717 +vn 0.648078 0.506935 -0.568341 +v 1.04176 2.35503 -1.41331 +vn 0.608341 0.585839 -0.535457 +v 1.02018 2.4556 -1.28399 +vn 0.622732 0.719604 -0.307204 +v 1.03627 2.42004 -1.32951 +vn 0.597302 0.700137 -0.391201 +v 1.02053 2.42943 -1.33679 +vn 0.613778 0.689131 -0.385196 +v 1.09309 2.36111 -1.33897 +vn 0.670169 0.604325 -0.430889 +v 1.1345 2.35044 -1.28208 +vn 0.715173 0.595551 -0.36585 +v 1.09649 2.38553 -1.29494 +vn 0.670919 0.649088 -0.358541 +v 1.13197 2.39156 -1.20894 +vn 0.681566 0.666233 -0.302657 +v 1.17934 2.33299 -1.21708 +vn 0.742291 0.584046 -0.328472 +v 0.788744 1.0796 -1.08547 +vn 0.347133 -0.889953 -0.295774 +v 0.7682 1.09765 -1.16212 +vn 0.369722 -0.874862 -0.312925 +v 0.811953 1.11314 -1.15121 +vn 0.398208 -0.855444 -0.33113 +v 0.866554 1.1042 -1.062 +vn 0.388903 -0.862524 -0.323738 +v 0.854631 1.12917 -1.13968 +vn 0.421711 -0.836505 -0.349884 +v 0.889028 1.14098 -1.12617 +vn 0.427135 -0.830308 -0.357973 +v 0.761118 1.12243 -1.23582 +vn 0.403753 -0.849199 -0.340359 +v 0.742857 1.14099 -1.302 +vn 0.420064 -0.83185 -0.362728 +v 0.792096 1.16367 -1.29388 +vn 0.450887 -0.807735 -0.379822 +v 0.83407 1.15108 -1.21557 +vn 0.443618 -0.818568 -0.364897 +v 0.832309 1.18032 -1.28029 +vn 0.47096 -0.791389 -0.389744 +v 0.867543 1.19572 -1.26796 +vn 0.484031 -0.778246 -0.400059 +v 0.809257 1.03516 -0.916514 +vn 0.289817 -0.921562 -0.258321 +v 0.795678 1.05495 -0.999604 +vn 0.311719 -0.909803 -0.274027 +v 0.842578 1.06664 -0.982403 +vn 0.341595 -0.89476 -0.287606 +v 0.858481 1.04792 -0.903381 +vn 0.322799 -0.906915 -0.270749 +v 0.875058 1.0286 -0.815887 +vn 0.306304 -0.920985 -0.240757 +v 0.824826 1.01612 -0.828734 +vn 0.268623 -0.935455 -0.229706 +v 0.909395 1.06458 -0.895511 +vn 0.343344 -0.895401 -0.2835 +v 0.888303 1.08251 -0.975272 +vn 0.362419 -0.880885 -0.304458 +v 0.922289 1.09326 -0.965478 +vn 0.368076 -0.875251 -0.313778 +v 0.944047 1.02859 -0.719226 +vn 0.31169 -0.928651 -0.201139 +v 0.923263 1.04203 -0.802863 +vn 0.325641 -0.912323 -0.248242 +v 0.9582 1.05197 -0.7929 +vn 0.332518 -0.909041 -0.251149 +v 0.755765 1.02326 -0.930622 +vn 0.252518 -0.937131 -0.240873 +v 0.741657 1.04228 -1.01685 +vn 0.283428 -0.923953 -0.256864 +v 0.684814 1.02972 -1.03067 +vn 0.246129 -0.940825 -0.232957 +v 0.637358 1.00302 -0.957553 +vn 0.175948 -0.965554 -0.191697 +v 0.625108 1.01853 -1.04418 +vn 0.210193 -0.955252 -0.208118 +v 0.785104 0.989816 -0.751432 +vn 0.194803 -0.967128 -0.16345 +v 0.770475 1.00502 -0.842049 +vn 0.223309 -0.951026 -0.213735 +v 0.712069 0.995658 -0.855332 +vn 0.176514 -0.965428 -0.19181 +v 0.662759 0.975928 -0.776487 +vn 0.105265 -0.986326 -0.126811 +v 0.650089 0.988242 -0.868205 +vn 0.13941 -0.976147 -0.166441 +v 0.728169 1.06174 -1.09986 +vn 0.314001 -0.909326 -0.273001 +v 0.716009 1.08227 -1.17907 +vn 0.343536 -0.891093 -0.29654 +v 0.705789 1.10438 -1.25405 +vn 0.370742 -0.87077 -0.32297 +v 0.698726 1.12902 -1.32429 +vn 0.396378 -0.846039 -0.356513 +v 0.613814 1.03493 -1.12768 +vn 0.242104 -0.94271 -0.229527 +v 0.603892 1.05289 -1.2077 +vn 0.270888 -0.927389 -0.258012 +v 0.661434 1.06704 -1.19362 +vn 0.308989 -0.909851 -0.276942 +v 0.595817 1.0731 -1.28385 +vn 0.297245 -0.90878 -0.292857 +v 0.590051 1.09605 -1.35577 +vn 0.321374 -0.886851 -0.331986 +v 0.645981 1.11211 -1.34049 +vn 0.362218 -0.866542 -0.34337 +v 0.283023 1.00895 -1.26446 +vn 0.0922639 -0.975979 -0.197362 +v 0.344726 1.03096 -1.33177 +vn 0.131211 -0.960596 -0.245028 +v 0.349125 1.0138 -1.25391 +vn 0.117151 -0.972456 -0.201506 +v 0.415817 1.02078 -1.24428 +vn 0.149597 -0.965793 -0.211814 +v 0.474474 1.04796 -1.31035 +vn 0.20809 -0.941442 -0.265303 +v 0.480714 1.02954 -1.23328 +vn 0.187081 -0.956326 -0.224593 +v 0.275117 1.04521 -1.41497 +vn 0.111253 -0.950507 -0.290102 +v 0.340391 1.0756 -1.4767 +vn 0.160596 -0.921623 -0.353299 +v 0.341724 1.05141 -1.40608 +vn 0.145732 -0.94405 -0.295858 +v 0.406824 1.05944 -1.39558 +vn 0.184794 -0.934794 -0.303333 +v 0.468018 1.09447 -1.45277 +vn 0.247236 -0.898235 -0.363385 +v 0.470117 1.06948 -1.38359 +vn 0.22826 -0.922281 -0.311923 +v 0.356698 0.999927 -1.17507 +vn 0.106691 -0.979805 -0.169115 +v 0.362523 0.987563 -1.08986 +vn 0.0904036 -0.986443 -0.13696 +v 0.323187 0.99044 -1.13515 +vn 0.0814471 -0.986329 -0.143256 +v 0.368441 0.977314 -1.00063 +vn 0.0684751 -0.992079 -0.105312 +v 0.376004 0.969347 -0.909864 +vn 0.0484529 -0.995757 -0.0782275 +v 0.336021 0.97145 -0.959427 +vn 0.0500658 -0.995055 -0.0857871 +v 0.488475 1.01374 -1.1526 +vn 0.165773 -0.967466 -0.191125 +v 0.49739 1.00003 -1.06856 +vn 0.143319 -0.975972 -0.164127 +v 0.432121 0.993491 -1.08147 +vn 0.11784 -0.98139 -0.151613 +v 0.509048 0.988358 -0.983921 +vn 0.122108 -0.981569 -0.147008 +v 0.518803 0.977115 -0.893153 +vn 0.090118 -0.988384 -0.122377 +v 0.478169 0.979369 -0.942132 +vn 0.0894706 -0.98859 -0.121178 +v 0.290711 0.982936 -1.09603 +vn 0.0628832 -0.990543 -0.121943 +v 0.257402 0.976567 -1.05563 +vn 0.0469903 -0.993592 -0.102795 +v 0.218887 0.97987 -1.10216 +vn 0.0433418 -0.9925 -0.114304 +v 0.146144 0.977846 -1.10678 +vn 0.0269813 -0.993619 -0.10951 +v 0.110582 0.97284 -1.06514 +vn 0.0175856 -0.995513 -0.0929788 +v 0.072931 0.976762 -1.10986 +vn 0.0101609 -0.994205 -0.107023 +v 0.302608 0.96681 -0.916974 +vn 0.0352967 -0.99723 -0.0654724 +v 0.268184 0.963381 -0.873255 +vn 0.0231974 -0.998672 -0.0460059 +v 0.227918 0.964954 -0.922639 +vn 0.0242179 -0.998115 -0.0563916 +v 0.152193 0.963717 -0.926911 +vn 0.0153192 -0.99861 -0.0504416 +v 0.115295 0.961386 -0.882052 +vn 0.00931367 -0.999355 -0.0346846 +v 0.075892 0.963159 -0.933712 +vn 0.00800792 -0.998786 -0.048613 +v 0.215014 0.990818 -1.18718 +vn 0.0521595 -0.987766 -0.146962 +v 0.213005 1.00468 -1.27037 +vn 0.0657357 -0.979666 -0.18956 +v 0.248373 0.998879 -1.22547 +vn 0.0689369 -0.983177 -0.169148 +v 0.211125 1.02146 -1.3494 +vn 0.0757655 -0.968596 -0.236815 +v 0.207304 1.04067 -1.42212 +vn 0.0813006 -0.954893 -0.285604 +v 0.071687 0.987279 -1.19513 +vn 0.0123998 -0.990127 -0.139626 +v 0.070641 1.00031 -1.27717 +vn 0.0146097 -0.984002 -0.177556 +v 0.106801 0.994021 -1.23557 +vn 0.0251327 -0.987045 -0.158462 +v 0.069858 1.01628 -1.35594 +vn 0.0173328 -0.974509 -0.223677 +v 0.069376 1.03569 -1.4314 +vn 0.0200213 -0.960113 -0.278896 +v 0.104371 1.02621 -1.39298 +vn 0.0361855 -0.967213 -0.251375 +v 0.880494 0.979033 -0.462368 +vn 0.179827 -0.981669 -0.0631534 +v 0.920459 0.994532 -0.544808 +vn 0.241167 -0.965163 -0.101486 +v 0.933199 0.989247 -0.453195 +vn 0.217327 -0.972906 -0.0788864 +v 0.999957 0.996932 -0.355178 +vn 0.2141 -0.974451 -0.0678786 +v 0.983747 1.00044 -0.443854 +vn 0.232357 -0.968318 -0.0914939 +v 1.02142 1.00845 -0.432712 +vn 0.230767 -0.968019 -0.0984118 +v 0.854817 0.989863 -0.647404 +vn 0.224966 -0.96657 -0.123012 +v 0.891286 1.01269 -0.726365 +vn 0.289381 -0.938483 -0.188438 +v 0.906469 1.00182 -0.635901 +vn 0.267521 -0.953581 -0.138258 +v 0.974706 1.00846 -0.539785 +vn 0.257719 -0.958734 -0.120039 +v 0.956036 1.01488 -0.624215 +vn 0.286553 -0.945927 -0.152019 +v 0.991958 1.02445 -0.615251 +vn 0.285426 -0.944817 -0.160789 +v 0.944672 0.985337 -0.361221 +vn 0.19915 -0.978213 -0.0586428 +v 0.954809 0.982697 -0.268975 +vn 0.187291 -0.981395 -0.0422532 +v 0.901219 0.973677 -0.279804 +vn 0.152982 -0.987627 -0.0344989 +v 0.965146 0.981459 -0.179174 +vn 0.184367 -0.982401 -0.0299648 +v 0.970561 0.980483 -0.088286 +vn 0.183062 -0.982976 -0.0157199 +v 0.941438 0.97603 -0.132222 +vn 0.164636 -0.986168 -0.0191584 +v 1.01984 0.992302 -0.171072 +vn 0.203356 -0.978653 -0.0297538 +v 1.00385 0.992326 -0.260086 +vn 0.204815 -0.977753 -0.045274 +v 1.04327 1.00073 -0.257465 +vn 0.213071 -0.975836 -0.0484241 +v 1.03116 0.991805 0.012504 +vn 0.207104 -0.978307 -0.00473749 +v 1.01616 0.989395 -0.073901 +vn 0.202222 -0.97924 -0.0139766 +v 1.06158 0.999146 -0.075884 +vn 0.21159 -0.977265 -0.0135514 +v 0.877827 0.969107 -0.231038 +vn 0.119698 -0.992557 -0.0224135 +v 0.843903 0.966585 -0.281748 +vn 0.0977107 -0.99497 -0.0220687 +v 0.781402 0.962186 -0.288205 +vn 0.0489662 -0.998729 -0.011906 +v 0.752553 0.96081 -0.242161 +vn 0.0244261 -0.999682 -0.00624837 +v 0.714768 0.960454 -0.294438 +vn 0.0141521 -0.999888 -0.00477678 +v 0.917553 0.971696 -0.086974 +vn 0.137726 -0.990401 -0.0117486 +v 0.891961 0.96808 -0.040819 +vn 0.112328 -0.993652 -0.00615795 +v 0.859111 0.965176 -0.0898 +vn 0.0865463 -0.996216 -0.00798503 +v 0.762796 0.96028 -0.044626 +vn 0.019264 -0.999813 -0.00154698 +v 0.733912 0.959961 0.006462 +vn 0.00802387 -0.999968 2.63706e-05 +v 0.731443 0.95993 -0.045446 +vn 0.00570422 -0.999983 -0.000811847 +v 0.835336 0.968345 -0.378943 +vn 0.115523 -0.99265 -0.0360557 +v 0.825056 0.970858 -0.474695 +vn 0.134696 -0.989571 -0.0510513 +v 0.811681 0.974092 -0.566132 +vn 0.149665 -0.986341 -0.0687859 +v 0.798903 0.979821 -0.659356 +vn 0.170098 -0.979476 -0.108137 +v 0.706283 0.960902 -0.393174 +vn 0.020201 -0.999766 -0.00773313 +v 0.696839 0.961676 -0.491025 +vn 0.0296574 -0.999431 -0.0160875 +v 0.735045 0.962139 -0.437996 +vn 0.0412467 -0.999022 -0.0159493 +v 0.687502 0.963766 -0.589402 +vn 0.0497771 -0.997905 -0.0413372 +v 0.676661 0.968191 -0.685507 +vn 0.076307 -0.994099 -0.0771025 +v 0.738757 0.972503 -0.671273 +vn 0.113716 -0.989295 -0.0914529 +v 0.362595 0.960271 -0.573766 +vn 0.00162622 -0.999997 -0.00163907 +v 0.397947 0.960494 -0.623105 +vn 0.00436796 -0.999979 -0.00486239 +v 0.401439 0.960327 -0.571004 +vn 0.00183758 -0.999995 -0.00268984 +v 0.48133 0.960271 -0.514427 +vn 0.00131549 -0.999995 -0.00292021 +v 0.511848 0.96055 -0.561354 +vn 0.00487972 -0.999961 -0.00737347 +v 0.555738 0.960389 -0.509519 +vn 0.00390715 -0.999977 -0.00562577 +v 0.314937 0.960458 -0.726062 +vn 0.00926128 -0.999909 -0.00978275 +v 0.34987 0.96156 -0.771741 +vn 0.0170378 -0.999572 -0.0237733 +v 0.391087 0.961194 -0.719824 +vn 0.0129263 -0.999776 -0.0167746 +v 0.465543 0.962147 -0.712353 +vn 0.0177474 -0.999505 -0.0259733 +v 0.497423 0.964387 -0.756198 +vn 0.031497 -0.998392 -0.0471217 +v 0.537958 0.963355 -0.703694 +vn 0.0258245 -0.998964 -0.0374776 +v 0.410465 0.960178 -0.417878 +vn 1.81911e-05 -1 -5.61857e-05 +v 0.41328 0.960178 -0.366144 +vn 0 -1 0 +v 0.373363 0.960178 -0.368083 +vn 0 -1 0 +v 0.420618 0.960178 -0.209297 +vn 0 -1 0 +v 0.422823 0.960178 -0.156658 +vn 0 -1 0 +v 0.382058 0.960178 -0.157643 +vn 0 -1 0 +v 0.563788 0.960214 -0.40711 +vn 0.00141851 -0.999999 -0.000568977 +v 0.567526 0.960199 -0.356465 +vn 0.000763074 -1 -0.000299962 +v 0.529818 0.960182 -0.359148 +vn 0.000296587 -1 -0.000144818 +v 0.622839 0.960117 -0.047921 +vn -0.00166672 -0.999999 -6.91867e-05 +v 0.587008 0.960157 0.002926 +vn -0.00091232 -1 6.99121e-06 +v 0.585017 0.960162 -0.048652 +vn -0.000776567 -1 -2.48263e-05 +v 0.296019 0.960178 -0.265814 +vn 0 -1 0 +v 0.255897 0.960178 -0.213531 +vn 0 -1 0 +v 0.254483 0.960178 -0.266871 +vn 0 -1 0 +v 0.127863 0.960178 -0.269742 +vn 0 -1 0 +v 0.085741 0.960178 -0.22079 +vn 0 -1 0 +v 0.085227 0.960178 -0.273743 +vn 0 -1 0 +v 0.302004 0.960178 -0.05235 +vn 0 -1 0 +v 0.260658 0.960178 0.001058 +vn 0 -1 0 +v 0.259679 0.960178 -0.052695 +vn 0 -1 0 +v 0.130588 0.960178 -0.054092 +vn 0 -1 0 +v 0.087457 0.960178 -0.004431 +vn 0 -1 0 +v 0.087089 0.960178 -0.057834 +vn 0 -1 0 +v 0.249532 0.960178 -0.425297 +vn 5.23394e-06 -1 -4.5899e-07 +v 0.247767 0.960178 -0.477473 +vn 2.23714e-05 -1 5.73562e-05 +v 0.288261 0.960179 -0.475773 +vn 8.34478e-05 -1 -7.06426e-05 +v 0.241806 0.96005 -0.631241 +vn 0.00202114 -0.999995 0.00223943 +v 0.239683 0.959894 -0.681503 +vn 0.00357433 -0.999993 0.00130124 +v 0.275631 0.960045 -0.67944 +vn 0.00534778 -0.999986 -0.000457891 +v 0.083505 0.960178 -0.434102 +vn -1.38975e-06 -1 3.18144e-05 +v 0.082874 0.960175 -0.485842 +vn -3.69442e-05 -1 0.000344958 +v 0.124389 0.960175 -0.481661 +vn 2.05727e-05 -1 0.00028602 +v 0.080784 0.959822 -0.641273 +vn 0.000567266 -0.999986 0.00530815 +v 0.080002 0.959498 -0.691038 +vn 0.00135609 -0.999984 0.00546122 +v 0.120171 0.959582 -0.686771 +vn 0.00177767 -0.999988 0.00466834 +v 0.933091 0.976422 0.287688 +vn 0.162047 -0.986466 0.0250212 +v 0.98679 0.986344 0.282186 +vn 0.199546 -0.979423 0.0301955 +v 0.959912 0.982429 0.32872 +vn 0.190173 -0.981173 0.0336857 +v 1.03313 0.995852 0.268664 +vn 0.212803 -0.976565 0.032179 +v 1.05065 0.997494 0.18668 +vn 0.21297 -0.97684 0.0206955 +v 1.07787 1.00582 0.269188 +vn 0.217964 -0.975367 0.0339173 +v 0.930284 0.97289 0.100765 +vn 0.14554 -0.989335 0.00585461 +v 0.953482 0.976446 0.054068 +vn 0.167244 -0.985915 0.000501457 +v 0.981979 0.981782 0.097909 +vn 0.187476 -0.982242 0.00735685 +v 1.02784 0.991297 0.103939 +vn 0.208248 -0.978028 0.00971821 +v 1.07371 1.0013 0.100877 +vn 0.214443 -0.976691 0.00946952 +v 0.986775 0.989789 0.372883 +vn 0.210036 -0.976591 0.0464167 +v 1.0288 1.00349 0.445913 +vn 0.22963 -0.971224 0.0632015 +v 0.983707 0.99372 0.460232 +vn 0.22282 -0.973107 0.05843 +v 0.981341 0.999172 0.5496 +vn 0.243394 -0.967105 0.0739363 +v 1.02615 1.01822 0.624018 +vn 0.267198 -0.958036 0.103785 +v 0.977241 1.00564 0.637829 +vn 0.269247 -0.958637 0.0923081 +v 1.10546 1.02902 0.53044 +vn 0.23935 -0.966169 0.0960711 +v 1.07467 1.01427 0.443348 +vn 0.230676 -0.97064 0.0681708 +v 1.11556 1.02441 0.450434 +vn 0.225559 -0.971139 0.0775404 +v 1.09439 1.0467 0.69368 +vn 0.274316 -0.950222 0.147745 +v 1.06565 1.02836 0.617003 +vn 0.260225 -0.958794 0.114005 +v 1.1018 1.03721 0.611097 +vn 0.251684 -0.959933 0.123224 +v 0.930341 0.982675 0.473676 +vn 0.198939 -0.978873 0.0472288 +v 0.872051 0.972674 0.477898 +vn 0.143762 -0.989115 0.0313775 +v 0.902749 0.975736 0.427446 +vn 0.161229 -0.986343 0.033644 +v 0.808668 0.96554 0.486508 +vn 0.0847801 -0.996249 0.0173557 +v 0.740825 0.961927 0.494874 +vn 0.0349012 -0.999362 0.00752074 +v 0.775967 0.962855 0.44283 +vn 0.0492293 -0.998731 0.0106257 +v 0.923672 0.992009 0.649241 +vn 0.245264 -0.966665 0.0735184 +v 0.867338 0.979745 0.663658 +vn 0.203559 -0.977368 0.0575828 +v 0.870626 0.975926 0.571825 +vn 0.173728 -0.983746 0.0454172 +v 0.80393 0.969334 0.674787 +vn 0.133645 -0.990412 0.0349721 +v 0.735337 0.963451 0.684752 +vn 0.0584377 -0.998212 0.0125708 +v 0.771447 0.965043 0.632533 +vn 0.0788775 -0.996717 0.0182842 +v 0.87335 0.970304 0.384483 +vn 0.124485 -0.991935 0.0238583 +v 0.842719 0.966122 0.340388 +vn 0.0915918 -0.995655 0.0168189 +v 0.876087 0.968611 0.290225 +vn 0.111968 -0.993524 0.0193206 +v 0.887692 0.968296 0.195637 +vn 0.112576 -0.993561 0.0128081 +v 0.871832 0.965848 0.101817 +vn 0.0939814 -0.995564 0.00437009 +v 0.909263 0.970348 0.147908 +vn 0.129315 -0.991554 0.00996321 +v 0.741947 0.961334 0.397938 +vn 0.0263959 -0.999633 0.00603857 +v 0.70696 0.960609 0.351846 +vn 0.00956922 -0.999948 0.00361309 +v 0.745001 0.960842 0.300003 +vn 0.0201678 -0.999777 0.00619563 +v 0.758529 0.960476 0.201606 +vn 0.0197109 -0.999796 0.00439327 +v 0.750463 0.960177 0.152835 +vn 0.0119949 -0.999926 0.00225972 +v 0.783716 0.960837 0.151948 +vn 0.0305466 -0.999525 0.00397905 +v 0.433815 0.960178 0.419572 +vn 6.96395e-06 -1 -1.91403e-07 +v 0.392561 0.960178 0.369629 +vn 0 -1 0 +v 0.434234 0.960178 0.367916 +vn 0 -1 0 +v 0.594216 0.96023 0.409997 +vn 0.00201341 -0.999998 0.000304701 +v 0.555551 0.960184 0.36185 +vn 0.000470886 -1 0.000136863 +v 0.594656 0.960213 0.35956 +vn 0.00136271 -0.999999 0.000275519 +v 0.388572 0.960178 0.054687 +vn 0 -1 0 +v 0.428124 0.960178 0.001811 +vn 0 -1 0 +v 0.429908 0.960178 0.054643 +vn 0 -1 0 +v 0.550353 0.960175 0.054498 +vn -0.000245623 -1 1.54718e-05 +v 0.589214 0.96016 0.054455 +vn -0.000831862 -1 5.1497e-05 +v 0.474686 0.960178 0.468526 +vn 1.33527e-05 -1 5.49017e-06 +v 0.433655 0.960178 0.470947 +vn 0 -1 0 +v 0.431758 0.960178 0.624638 +vn 1.39741e-05 -1 -1.01109e-06 +v 0.471656 0.960178 0.668914 +vn 4.98636e-05 -1 1.1058e-06 +v 0.429684 0.960178 0.721446 +vn 1.37953e-05 -1 2.02646e-05 +v 0.628995 0.960351 0.457269 +vn 0.00472718 -0.999988 0.00107067 +v 0.594013 0.960233 0.460177 +vn 0.00230053 -0.999997 0.000282204 +v 0.591537 0.960289 0.608497 +vn 0.00460332 -0.999989 0.000567097 +v 0.628314 0.960567 0.652685 +vn 0.010038 -0.999948 0.00188261 +v 0.58877 0.960327 0.705329 +vn 0.00628449 -0.99998 0.000815499 +v 0.2644 0.960178 0.426348 +vn 0 -1 0 +v 0.307266 0.960178 0.47694 +vn 0 -1 0 +v 0.26429 0.960178 0.478537 +vn 0 -1 0 +v 0.08893 0.960178 0.434913 +vn 0 -1 0 +v 0.133121 0.960178 0.482548 +vn 0 -1 0 +v 0.088868 0.960178 0.486705 +vn 0 -1 0 +v 0.263088 0.960178 0.632526 +vn 0 -1 0 +v 0.301652 0.960178 0.680892 +vn 0 -1 0 +v 0.26252 0.960178 0.682934 +vn 0 -1 0 +v 0.088385 0.960178 0.642492 +vn 0 -1 0 +v 0.132133 0.960178 0.688174 +vn 0 -1 0 +v 0.088164 0.960178 0.69245 +vn 0 -1 0 +v 0.221399 0.960178 0.374925 +vn 0 -1 0 +v 0.264811 0.960178 0.373861 +vn 0 -1 0 +v 0.28669 0.960178 0.21479 +vn 0 -1 0 +v 0.274874 0.960178 0.161754 +vn 0 -1 0 +v 0.317612 0.960178 0.161301 +vn 0 -1 0 +v 0.044612 0.960178 0.392392 +vn 0 -1 0 +v 0.089154 0.960178 0.381043 +vn 0 -1 0 +v 0.118716 0.960178 0.216591 +vn 0 -1 0 +v 0.094634 0.960178 0.167012 +vn 0 -1 0 +v 0.144175 0.960178 0.162595 +vn 0 -1 0 +v 0.898852 1.02381 0.991581 +vn 0.386571 -0.904513 0.180052 +v 0.951706 1.04471 0.975194 +vn 0.412698 -0.889866 0.194471 +v 0.945126 1.06099 1.05358 +vn 0.435489 -0.864573 0.250726 +v 1.00229 1.06468 0.958543 +vn 0.405762 -0.888998 0.212225 +v 1.01403 1.05313 0.882726 +vn 0.365657 -0.912325 0.184277 +v 1.03882 1.07798 0.945914 +vn 0.387044 -0.893858 0.226307 +v 0.912353 1.00474 0.824265 +vn 0.31467 -0.943167 0.106857 +v 0.965569 1.0219 0.810144 +vn 0.337464 -0.9321 0.13156 +v 0.958612 1.03215 0.893822 +vn 0.375452 -0.913424 0.157139 +v 1.01646 1.03837 0.795802 +vn 0.331918 -0.930948 0.152208 +v 1.02863 1.03008 0.714135 +vn 0.293967 -0.946538 0.132853 +v 1.05321 1.04934 0.78489 +vn 0.314645 -0.934589 0.165957 +v 0.982022 1.09758 1.10458 +vn 0.44808 -0.840441 0.304767 +v 0.940097 1.08376 1.12855 +vn 0.442511 -0.839166 0.316204 +v 0.937071 1.11192 1.20023 +vn 0.439074 -0.823729 0.358727 +v 0.978179 1.15302 1.24158 +vn 0.450307 -0.809417 0.376918 +v 0.936684 1.14234 1.26765 +vn 0.437523 -0.811899 0.386515 +v 1.0596 1.16041 1.15939 +vn 0.439256 -0.823676 0.358626 +v 1.02189 1.11963 1.10718 +vn 0.436528 -0.84132 0.318785 +v 1.06073 1.1303 1.0831 +vn 0.423171 -0.849243 0.315773 +v 1.06142 1.21758 1.27421 +vn 0.476903 -0.770887 0.422253 +v 1.02425 1.1734 1.23002 +vn 0.453029 -0.804377 0.384374 +v 1.05912 1.18615 1.21589 +vn 0.453595 -0.801632 0.389407 +v 0.887857 1.06419 1.14774 +vn 0.410723 -0.850964 0.327364 +v 0.830727 1.04562 1.16677 +vn 0.355379 -0.871928 0.33682 +v 0.835525 1.02059 1.08918 +vn 0.342114 -0.903466 0.258275 +v 0.769083 1.03032 1.18565 +vn 0.281845 -0.897278 0.339787 +v 0.703366 1.0195 1.20383 +vn 0.210958 -0.919154 0.332645 +v 0.707835 0.994781 1.12411 +vn 0.178327 -0.951852 0.249355 +v 0.884424 1.12541 1.28927 +vn 0.409613 -0.822226 0.395172 +v 0.827252 1.10868 1.31083 +vn 0.36817 -0.838015 0.402718 +v 0.827747 1.0762 1.24077 +vn 0.362309 -0.850918 0.380355 +v 0.765626 1.09387 1.33222 +vn 0.316826 -0.858453 0.403336 +v 0.700012 1.08132 1.35278 +vn 0.268901 -0.879909 0.391729 +v 0.700557 1.0497 1.28014 +vn 0.240514 -0.89487 0.375981 +v 0.779505 0.988593 1.02515 +vn 0.230432 -0.959244 0.163559 +v 0.841479 1.0041 1.00841 +vn 0.322289 -0.930943 0.17168 +v 0.848005 0.994375 0.924834 +vn 0.295741 -0.948744 0.111453 +v 0.792024 0.974638 0.853364 +vn 0.180938 -0.981858 0.0567045 +v 0.854535 0.988182 0.83884 +vn 0.262506 -0.961541 0.0807984 +v 0.645546 0.97376 1.0587 +vn 0.0953881 -0.984478 0.147323 +v 0.713332 0.97888 1.04129 +vn 0.146406 -0.977507 0.151807 +v 0.719295 0.97037 0.955619 +vn 0.118618 -0.989709 0.0800421 +v 0.656046 0.962455 0.882374 +vn 0.0465938 -0.998504 0.028609 +v 0.727294 0.966573 0.869895 +vn 0.103068 -0.993735 0.0432136 +v 0.335097 0.966839 1.10076 +vn 0.0165412 -0.99635 0.0837398 +v 0.415679 0.967648 1.09233 +vn 0.0226216 -0.99545 0.0925587 +v 0.373897 0.971655 1.14015 +vn 0.0289297 -0.991803 0.124459 +v 0.494235 0.968696 1.08215 +vn 0.0314093 -0.99409 0.103917 +v 0.571704 0.970533 1.07165 +vn 0.0588178 -0.98991 0.128911 +v 0.530304 0.974781 1.11925 +vn 0.0565181 -0.986252 0.155284 +v 0.341468 0.96046 0.919666 +vn 0.00130215 -0.99995 0.00990426 +v 0.423424 0.960501 0.912194 +vn 0.00185095 -0.999934 0.0113557 +v 0.380969 0.961115 0.962323 +vn 0.00386457 -0.999788 0.0202102 +v 0.503254 0.960559 0.903209 +vn 0.00341844 -0.999906 0.0132445 +v 0.580522 0.960831 0.89276 +vn 0.0134906 -0.999782 0.0159462 +v 0.539893 0.961466 0.943728 +vn 0.0097187 -0.999577 0.0273966 +v 0.412036 0.978758 1.17812 +vn 0.0464946 -0.983121 0.176949 +v 0.449557 0.988661 1.21463 +vn 0.0695455 -0.970281 0.231773 +v 0.409036 0.997475 1.26092 +vn 0.0739004 -0.963821 0.256102 +v 0.407132 1.02102 1.3406 +vn 0.0964587 -0.948446 0.301904 +v 0.445547 1.03628 1.37335 +vn 0.119799 -0.9384 0.324119 +v 0.406719 1.04672 1.41706 +vn 0.113728 -0.935547 0.334391 +v 0.565323 0.984898 1.15874 +vn 0.101391 -0.970098 0.22052 +v 0.634046 1.01197 1.22074 +vn 0.162754 -0.934756 0.31582 +v 0.561512 1.00716 1.24009 +vn 0.138405 -0.943986 0.299558 +v 0.559148 1.03396 1.31818 +vn 0.169457 -0.925942 0.337513 +v 0.630886 1.07028 1.37188 +vn 0.228595 -0.899164 0.373159 +v 0.55874 1.06206 1.39285 +vn 0.194776 -0.91302 0.358408 +v 0.329595 0.994643 1.27026 +vn 0.0549947 -0.968815 0.241605 +v 0.248582 0.992561 1.2776 +vn 0.0386997 -0.972136 0.2312 +v 0.290297 0.984149 1.23283 +vn 0.0380339 -0.978568 0.20238 +v 0.166311 0.991184 1.28301 +vn 0.025043 -0.974179 0.224382 +v 0.083221 0.991155 1.28999 +vn 0.0132403 -0.974437 0.224271 +v 0.125285 0.981974 1.24381 +vn 0.0164278 -0.981715 0.189647 +v 0.327682 1.04207 1.42752 +vn 0.0851269 -0.941457 0.326209 +v 0.247119 1.03872 1.43571 +vn 0.0600906 -0.945432 0.320231 +v 0.287558 1.02762 1.39364 +vn 0.0664704 -0.950369 0.303943 +v 0.165394 1.03653 1.44172 +vn 0.0382954 -0.947876 0.31633 +v 0.082902 1.0364 1.4488 +vn 0.0192936 -0.948517 0.316138 +v 0.12416 1.02363 1.40571 +vn 0.0263411 -0.955159 0.29492 +v 0.250525 0.97582 1.19398 +vn 0.0241641 -0.98774 0.154225 +v 0.210194 0.969852 1.15376 +vn 0.0140994 -0.994044 0.108061 +v 0.252865 0.966231 1.1074 +vn 0.0116127 -0.996942 0.0772754 +v 0.255369 0.961964 1.01791 +vn 0.00422155 -0.999516 0.0308215 +v 0.214377 0.960923 0.974528 +vn 0.0018595 -0.999869 0.0160537 +v 0.257781 0.960428 0.925579 +vn 0.000915676 -0.999961 0.00878591 +v 0.083878 0.974919 1.20611 +vn 0.0097034 -0.988901 0.148258 +v 0.042111 0.970226 1.17266 +vn 0.00492764 -0.993515 0.113598 +v 0.084688 0.965743 1.11929 +vn 0.00537739 -0.997347 0.0725971 +v 0.085582 0.96179 1.02955 +vn 0.00207686 -0.9996 0.0281983 +v 0.04299 0.960965 0.99371 +vn 0.000922135 -0.999853 0.0171282 +v 0.086442 0.960398 0.936922 +vn 0.000718972 -0.999969 0.00783264 +v 0.897828 3.0434 0.787487 +vn 0.639265 0.764736 0.0807416 +v 0.893948 3.03417 0.87466 +vn 0.627802 0.767827 0.127696 +v 0.927829 3.00964 0.865372 +vn 0.589394 0.798801 0.120547 +v 0.909121 3.04215 0.612475 +vn 0.629503 0.776898 -0.0124598 +v 0.90347 3.04478 0.701427 +vn 0.632048 0.774099 0.0358539 +v 0.936033 3.02011 0.696049 +vn 0.592792 0.804666 0.0333146 +v 0.959907 2.99781 0.77698 +vn 0.570067 0.818133 0.0753862 +v 0.96395 2.98371 0.869469 +vn 0.555457 0.822365 0.123218 +v 0.989703 2.97041 0.84422 +vn 0.537849 0.835746 0.110663 +v 0.965535 3.00085 0.6258 +vn 0.570567 0.821251 -0.000396627 +v 0.964723 2.99975 0.696289 +vn 0.565326 0.824029 0.0371796 +v 0.992014 2.98183 0.692116 +vn 0.545867 0.83728 0.031504 +v 0.885363 3.02562 0.957479 +vn 0.624352 0.762286 0.170602 +v 0.860959 3.06178 0.880952 +vn 0.669954 0.730052 0.134852 +v 0.818756 3.08175 0.97397 +vn 0.699571 0.68784 0.193586 +v 0.828181 3.09238 0.886796 +vn 0.721805 0.677276 0.142459 +v 0.795403 3.12945 0.89279 +vn 0.776471 0.610285 0.156989 +v 0.872368 3.07151 0.707468 +vn 0.675489 0.736375 0.0382853 +v 0.835826 3.10033 0.798782 +vn 0.734511 0.672974 0.0871827 +v 0.840528 3.10241 0.705786 +vn 0.728971 0.683708 0.0338315 +v 0.809977 3.13798 0.712894 +vn 0.787809 0.615006 0.0335464 +v 0.879151 2.98849 1.10935 +vn 0.588299 0.76801 0.253112 +v 0.878322 3.01098 1.03648 +vn 0.609838 0.762862 0.214798 +v 0.844836 3.03443 1.05151 +vn 0.636548 0.73624 0.22969 +v 0.832818 3.01846 1.12974 +vn 0.619987 0.737289 0.268368 +v 0.82357 2.99614 1.20636 +vn 0.598977 0.736734 0.313766 +v 0.867756 2.96775 1.19097 +vn 0.579305 0.757939 0.299891 +v 0.791147 3.05091 1.14103 +vn 0.654691 0.699886 0.28555 +v 0.806602 3.06472 1.06472 +vn 0.676794 0.694891 0.243056 +v 0.769379 3.10159 1.07038 +vn 0.718283 0.643677 0.264101 +v 0.748654 3.08825 1.15207 +vn 0.6858 0.65606 0.315061 +v 0.723871 3.07024 1.23465 +vn 0.641015 0.666197 0.381159 +v 0.77503 3.02908 1.22383 +vn 0.617417 0.707387 0.344092 +v 0.914885 2.98527 1.02924 +vn 0.577655 0.788871 0.209757 +v 0.947956 2.98115 0.946953 +vn 0.564345 0.808826 0.16527 +v 0.947953 2.96439 1.01953 +vn 0.553478 0.807189 0.205202 +v 0.977625 2.94691 1.01057 +vn 0.53556 0.819731 0.203017 +v 0.907998 2.91628 1.24276 +vn 0.555187 0.759035 0.340049 +v 0.91178 2.94145 1.17463 +vn 0.560498 0.774744 0.292598 +v 0.944515 2.94632 1.0932 +vn 0.551187 0.797135 0.246513 +v 0.944613 2.92289 1.16211 +vn 0.545434 0.786656 0.289264 +v 0.975368 2.90666 1.14937 +vn 0.533245 0.795041 0.289067 +v 0.221007 3.37507 1.37524 +vn 0.249506 0.51072 0.822747 +v 0.221425 3.3208 1.411 +vn 0.246611 0.554935 0.7945 +v 0.293969 3.31532 1.38831 +vn 0.326508 0.541902 0.774425 +v 0.228748 3.26497 1.44912 +vn 0.248734 0.581082 0.774904 +v 0.23314 3.20979 1.49048 +vn 0.246458 0.601056 0.760257 +v 0.269628 3.23417 1.45833 +vn 0.287375 0.589654 0.7548 +v 0.074734 3.37742 1.40307 +vn 0.0831889 0.53407 0.841338 +v 0.073058 3.32418 1.43898 +vn 0.0836418 0.572153 0.815871 +v 0.147733 3.32595 1.42638 +vn 0.16371 0.563878 0.80947 +v 0.052629 3.27475 1.47692 +vn 0.0667424 0.595263 0.800754 +v 0 3.24032 1.5049 +vn 3.31517e-18 0.602709 0.797961 +v 0.07448 3.22214 1.51471 +vn 0.083843 0.609881 0.788046 +v 0.33667 3.28333 1.39172 +vn 0.367742 0.549871 0.749938 +v 0.364195 3.30896 1.35898 +vn 0.406587 0.526869 0.746388 +v 0.430774 3.30282 1.32248 +vn 0.489505 0.510651 0.706838 +v 0.472416 3.26912 1.31693 +vn 0.529252 0.523577 0.667652 +v 0.493865 3.29649 1.2777 +vn 0.582437 0.487761 0.650274 +v 0.309971 3.20164 1.46767 +vn 0.323058 0.596509 0.734718 +v 0.350859 3.168 1.47649 +vn 0.350969 0.605884 0.713951 +v 0.386186 3.19216 1.4373 +vn 0.396796 0.592195 0.701326 +v 0.510888 3.23363 1.31328 +vn 0.569148 0.540889 0.619281 +v 0.531554 3.17085 1.35205 +vn 0.548821 0.583426 0.598673 +v 0.55193 3.20145 1.30242 +vn 0.60322 0.553804 0.573957 +v 0.359451 3.36635 1.32369 +vn 0.413296 0.4752 0.77677 +v 0.353317 3.42308 1.29506 +vn 0.412226 0.41136 0.812929 +v 0.286873 3.42609 1.32317 +vn 0.327991 0.435158 0.838487 +v 0.349505 3.47838 1.27195 +vn 0.408599 0.329499 0.851162 +v 0.348577 3.53213 1.25494 +vn 0.405832 0.220496 0.886951 +v 0.283033 3.53233 1.28105 +vn 0.316762 0.244727 0.91639 +v 0.482605 3.3585 1.24541 +vn 0.58909 0.4217 0.689306 +v 0.474258 3.41768 1.22005 +vn 0.589753 0.346955 0.729256 +v 0.416058 3.42019 1.26069 +vn 0.499491 0.382453 0.777328 +v 0.469599 3.47552 1.20012 +vn 0.585871 0.255383 0.769113 +v 0.468462 3.53192 1.18633 +vn 0.576226 0.142234 0.804818 +v 0.410579 3.53171 1.22338 +vn 0.489752 0.185685 0.851859 +v 0.215319 3.48143 1.32028 +vn 0.24207 0.380459 0.892554 +v 0.217636 3.42885 1.34511 +vn 0.246117 0.454636 0.855998 +v 0.146389 3.43093 1.36095 +vn 0.164235 0.46976 0.867383 +v 0.072881 3.48053 1.34603 +vn 0.0788505 0.413274 0.907186 +v 0.073744 3.42955 1.37199 +vn 0.0811932 0.482835 0.871939 +v 0.224165 3.57638 1.28859 +vn 0.246609 0.152876 0.956981 +v 0.214783 3.53256 1.30148 +vn 0.240475 0.277936 0.930012 +v 0.144545 3.5327 1.31629 +vn 0.155085 0.290312 0.944281 +v 0.082111 3.57368 1.3132 +vn 0.0890227 0.192078 0.977334 +v 0.072737 3.53037 1.32597 +vn 0.0796956 0.316082 0.945379 +v 0.80927 2.77082 -1.12357 +vn 0.755214 0.654766 -0.0305422 +v 0.84631 2.72007 -1.18635 +vn 0.79278 0.604998 -0.0740097 +v 0.802817 2.77355 -1.21122 +vn 0.780714 0.623125 -0.0469223 +v 0.797255 2.77263 -1.2956 +vn 0.805857 0.587546 -0.0733797 +v 0.835077 2.70794 -1.34651 +vn 0.832487 0.538024 -0.132266 +v 0.791973 2.76697 -1.37839 +vn 0.830043 0.547275 -0.107323 +v 0.893221 2.67315 -1.07907 +vn 0.780617 0.619505 -0.082772 +v 0.919493 2.62763 -1.14336 +vn 0.805358 0.581026 -0.117505 +v 0.88483 2.6717 -1.16388 +vn 0.801754 0.589708 -0.0971313 +v 0.877389 2.66731 -1.24457 +vn 0.819607 0.560785 -0.117322 +v 0.900129 2.62064 -1.29187 +vn 0.835377 0.526965 -0.156373 +v 0.871851 2.65733 -1.31993 +vn 0.834958 0.529641 -0.149421 +v 0.754603 2.83123 -1.23766 +vn 0.764476 0.644512 -0.0134459 +v 0.702156 2.89183 -1.26482 +vn 0.741757 0.670128 0.0269306 +v 0.706887 2.88209 -1.17364 +vn 0.709688 0.703411 0.0394486 +v 0.646091 2.95328 -1.29146 +vn 0.708427 0.702069 0.0723179 +v 0.585566 3.01492 -1.31874 +vn 0.666397 0.735013 0.125182 +v 0.590628 2.99397 -1.22178 +vn 0.629928 0.766564 0.124782 +v 0.744583 2.832 -1.41135 +vn 0.82383 0.560683 -0.0832993 +v 0.695451 2.89845 -1.44172 +vn 0.808989 0.585172 -0.0557735 +v 0.722728 2.86629 -1.38213 +vn 0.802256 0.595407 -0.043311 +v 0.641692 2.96866 -1.47388 +vn 0.794799 0.60673 -0.013176 +v 0.611365 3.0074 -1.49173 +vn 0.781487 0.623905 0.0044673 +v 0.611717 3.00489 -1.44572 +vn 0.755415 0.653468 0.0482527 +v 0.654198 2.92511 -1.10509 +vn 0.646268 0.759255 0.0766197 +v 0.711751 2.87181 -1.08133 +vn 0.681523 0.730702 0.0400159 +v 0.716516 2.86285 -0.988801 +vn 0.658447 0.752161 0.0264643 +v 0.661541 2.90505 -0.919719 +vn 0.608719 0.792995 0.0248967 +v 0.720913 2.85709 -0.896987 +vn 0.641012 0.767527 -0.00238269 +v 0.531712 3.02521 -1.15249 +vn 0.552561 0.819823 0.150223 +v 0.593963 2.97644 -1.12756 +vn 0.602582 0.789899 0.11382 +v 0.596997 2.96177 -1.03398 +vn 0.582639 0.807722 0.0900898 +v 0.534524 2.99587 -0.965245 +vn 0.521972 0.84921 0.0799218 +v 0.599687 2.95135 -0.941797 +vn 0.569266 0.82052 0.0517933 +v 0.765948 2.81845 -1.0573 +vn 0.708953 0.705233 0.00567076 +v 0.81612 2.76662 -1.0338 +vn 0.730379 0.682561 -0.0256418 +v 0.861642 2.71783 -1.01158 +vn 0.74662 0.663081 -0.0536825 +v 0.902137 2.67319 -0.991481 +vn 0.758352 0.647039 -0.079014 +v 0.777074 2.80894 -0.874277 +vn 0.666959 0.744506 -0.0295928 +v 0.829274 2.762 -0.852232 +vn 0.687482 0.724035 -0.0560477 +v 0.822944 2.763 -0.942978 +vn 0.707502 0.705911 -0.0336313 +v 0.876784 2.71771 -0.831524 +vn 0.703185 0.706377 -0.0810038 +v 0.919153 2.67712 -0.812912 +vn 0.714258 0.692093 -0.104134 +v 0.910995 2.67386 -0.90237 +vn 0.735824 0.671849 -0.0847513 +v 0.848243 2.83229 -0.421787 +vn 0.620003 0.748077 -0.236597 +v 0.893774 2.77396 -0.485293 +vn 0.639602 0.73596 -0.221971 +v 0.844713 2.80931 -0.508411 +vn 0.630895 0.747192 -0.208985 +v 0.843715 2.78881 -0.590954 +vn 0.643343 0.745157 -0.175645 +v 0.887683 2.73528 -0.655084 +vn 0.668402 0.727616 -0.154316 +v 0.838888 2.77536 -0.674923 +vn 0.656021 0.742423 -0.135808 +v 0.939346 2.76729 -0.384946 +vn 0.630571 0.732824 -0.255635 +v 0.972485 2.7166 -0.447359 +vn 0.644326 0.723628 -0.2474 +v 0.937307 2.74118 -0.46766 +vn 0.644607 0.727829 -0.233982 +v 0.934672 2.71805 -0.551425 +vn 0.65925 0.723273 -0.205584 +v 0.966318 2.67083 -0.615511 +vn 0.67699 0.710939 -0.190397 +v 0.931067 2.69891 -0.636804 +vn 0.675981 0.716557 -0.172034 +v 0.790938 2.84933 -0.524984 +vn 0.616693 0.761731 -0.198636 +v 0.732866 2.88967 -0.547002 +vn 0.598887 0.778451 -0.188012 +v 0.763548 2.87963 -0.493519 +vn 0.604804 0.767977 -0.210768 +v 0.671547 2.9301 -0.570082 +vn 0.576428 0.797465 -0.178269 +v 0.607786 2.96941 -0.59388 +vn 0.547747 0.819327 -0.169339 +v 0.640982 2.95899 -0.539556 +vn 0.561898 0.803603 -0.196196 +v 0.7871 2.81618 -0.698273 +vn 0.640073 0.759457 -0.116324 +v 0.729177 2.86055 -0.719824 +vn 0.618152 0.780095 -0.096649 +v 0.758736 2.84514 -0.6639 +vn 0.62366 0.770752 -0.130343 +v 0.667366 2.90538 -0.741311 +vn 0.589745 0.803909 -0.077016 +v 0.605821 2.94699 -0.761371 +vn 0.556421 0.828694 -0.0605198 +v 0.637026 2.93053 -0.70957 +vn 0.570789 0.81538 -0.096723 +v 0.735312 2.91037 -0.462189 +vn 0.592792 0.774074 -0.222277 +v 0.706377 2.94151 -0.43089 +vn 0.582743 0.777913 -0.235078 +v 0.738444 2.93403 -0.377059 +vn 0.589781 0.768967 -0.246677 +v 0.74327 2.95892 -0.291048 +vn 0.590257 0.764139 -0.260167 +v 0.716364 2.99144 -0.25692 +vn 0.588252 0.763559 -0.266341 +v 0.750894 2.98314 -0.203738 +vn 0.59322 0.76066 -0.263603 +v 0.60989 2.98802 -0.509448 +vn 0.546319 0.80975 -0.214104 +v 0.578337 3.01709 -0.479985 +vn 0.531553 0.814229 -0.233414 +v 0.612589 3.01102 -0.423984 +vn 0.547702 0.798219 -0.250735 +v 0.616495 3.0382 -0.335086 +vn 0.554308 0.78494 -0.276789 +v 0.585279 3.07153 -0.303604 +vn 0.546834 0.784817 -0.291607 +v 0.62314 3.06697 -0.243419 +vn 0.569033 0.769965 -0.288714 +v 0.796395 2.89543 -0.35647 +vn 0.602007 0.758626 -0.249147 +v 0.848662 2.859 -0.339644 +vn 0.610836 0.750022 -0.253667 +v 0.822254 2.86424 -0.388511 +vn 0.610705 0.753474 -0.243547 +v 0.897264 2.82516 -0.321812 +vn 0.616877 0.742611 -0.260752 +v 0.941247 2.79514 -0.302951 +vn 0.618445 0.737988 -0.269998 +v 0.807018 2.94516 -0.186592 +vn 0.59596 0.759022 -0.262141 +v 0.858356 2.90905 -0.174046 +vn 0.599197 0.755685 -0.264392 +v 0.830336 2.91498 -0.220552 +vn 0.59924 0.755796 -0.263975 +v 0.905685 2.87862 -0.153962 +vn 0.598365 0.754668 -0.269137 +v 0.948839 2.84885 -0.141694 +vn 0.596273 0.753326 -0.277413 +v 0.943584 2.82349 -0.2213 +vn 0.606718 0.745126 -0.276913 +v 0.931671 2.94286 0.103423 +vn 0.575921 0.786101 -0.22441 +v 0.899555 2.98518 0.172915 +vn 0.586409 0.784669 -0.201044 +v 0.935383 2.96123 0.182215 +vn 0.574738 0.793796 -0.198907 +v 0.886078 2.97241 0.088169 +vn 0.588592 0.777345 -0.222023 +v 0.915963 2.92941 0.019382 +vn 0.583097 0.775644 -0.241609 +v 0.875247 2.95469 0.001498 +vn 0.590796 0.769843 -0.241456 +v 0.991648 2.90284 0.115071 +vn 0.566403 0.791121 -0.2309 +v 0.970549 2.93863 0.192074 +vn 0.565512 0.800239 -0.199535 +v 0.999275 2.91947 0.195744 +vn 0.558125 0.804094 -0.204765 +v 0.982399 2.85746 -0.045915 +vn 0.584216 0.765474 -0.269704 +v 0.956986 2.9011 0.026949 +vn 0.579361 0.776777 -0.246899 +v 0.988361 2.8797 0.032824 +vn 0.574692 0.778317 -0.252886 +v 0.856657 3.01665 0.167795 +vn 0.605718 0.770061 -0.200279 +v 0.812574 3.04921 0.156508 +vn 0.625795 0.751624 -0.208425 +v 0.829986 3.05859 0.249092 +vn 0.635874 0.750191 -0.18132 +v 0.770423 3.0856 0.156931 +vn 0.652609 0.725126 -0.219761 +v 0.728523 3.12631 0.160525 +vn 0.683119 0.69054 -0.237701 +v 0.761177 3.1084 0.203841 +vn 0.677421 0.703748 -0.2141 +v 0.82744 2.98618 -0.016079 +vn 0.598219 0.763772 -0.242458 +v 0.777789 3.02294 -0.02371 +vn 0.606396 0.756122 -0.246096 +v 0.810723 3.01283 0.027187 +vn 0.60432 0.761162 -0.235435 +v 0.700732 3.11791 0.062155 +vn 0.655163 0.708635 -0.261912 +v 0.710178 3.09114 0.011675 +vn 0.635373 0.727171 -0.259852 +v 0.683286 3.11467 0.011155 +vn 0.641153 0.716739 -0.274242 +v 0.819691 3.07888 0.297316 +vn 0.658735 0.732854 -0.170277 +v 0.846358 3.06444 0.33922 +vn 0.646346 0.747834 -0.151595 +v 0.84162 3.10333 0.611119 +vn 0.723865 0.689536 -0.0236393 +v 0.864923 3.07493 0.524574 +vn 0.66957 0.739687 -0.0673808 +v 0.835533 3.10502 0.548135 +vn 0.715928 0.695725 -0.058423 +v 0.754144 3.13066 0.253431 +vn 0.705028 0.677303 -0.210228 +v 0.735174 3.17324 0.319576 +vn 0.757214 0.616764 -0.21501 +v 0.776012 3.13415 0.346485 +vn 0.72616 0.66354 -0.180017 +v 0.80343 3.13866 0.529748 +vn 0.764218 0.639479 -0.0838908 +v 0.882039 3.03621 0.346813 +vn 0.617762 0.773995 -0.138932 +v 0.892451 3.04234 0.437156 +vn 0.625221 0.773986 -0.100224 +v 0.917735 3.00957 0.350156 +vn 0.591044 0.79489 -0.13717 +v 0.950851 2.98684 0.357624 +vn 0.571977 0.809101 -0.1349 +v 0.960709 2.99266 0.445199 +vn 0.570522 0.815556 -0.0968145 +v 0.983309 2.9645 0.356845 +vn 0.553277 0.821487 -0.137998 +v 0.898581 3.0463 0.528941 +vn 0.63081 0.773736 -0.0584095 +v 0.931726 3.02068 0.525611 +vn 0.590147 0.805228 -0.0577386 +v 1.01454 2.96829 0.60188 +vn 0.540345 0.841241 -0.0184812 +v 1.01763 2.96234 0.521558 +vn 0.536987 0.841354 -0.0613833 +v 0.995447 2.97616 0.51476 +vn 0.548718 0.833469 -0.0651013 +v 0.335724 3.15905 -1.27895 +vn 0.352003 0.894236 0.27647 +v 0.367347 3.15856 -1.31958 +vn 0.397114 0.873659 0.281106 +v 0.332923 3.18954 -1.36591 +vn 0.36778 0.872324 0.322163 +v 0.329871 3.22339 -1.44629 +vn 0.392434 0.841159 0.372085 +v 0.357277 3.22848 -1.48849 +vn 0.457876 0.808927 0.368763 +v 0.321838 3.26433 -1.52144 +vn 0.416349 0.795872 0.439593 +v 0.46585 3.08992 -1.25833 +vn 0.497098 0.841246 0.212598 +v 0.496149 3.08088 -1.29783 +vn 0.547746 0.811997 0.20158 +v 0.462718 3.11687 -1.35149 +vn 0.524266 0.819767 0.230495 +v 0.458155 3.14737 -1.44465 +vn 0.566188 0.787529 0.243372 +v 0.489897 3.13471 -1.48609 +vn 0.639669 0.742754 0.197836 +v 0.453541 3.18051 -1.53569 +vn 0.630166 0.73252 0.257496 +v 0.266849 3.21518 -1.36894 +vn 0.28702 0.889908 0.354518 +v 0.200357 3.23438 -1.37122 +vn 0.207744 0.903199 0.375597 +v 0.234928 3.20939 -1.32934 +vn 0.244458 0.909866 0.335239 +v 0.133568 3.24758 -1.37307 +vn 0.132388 0.912156 0.387873 +v 0.066646 3.25516 -1.37442 +vn 0.0615911 0.917216 0.3936 +v 0.10074 3.23621 -1.33485 +vn 0.0969628 0.928813 0.357637 +v 0.256106 3.29199 -1.51889 +vn 0.308838 0.812203 0.49492 +v 0.192095 3.31062 -1.51656 +vn 0.213526 0.823081 0.526256 +v 0.200253 3.26944 -1.44755 +vn 0.215726 0.86973 0.443883 +v 0.127816 3.32315 -1.51576 +vn 0.128473 0.829273 0.543876 +v 0.063506 3.33235 -1.51931 +vn 0.0539591 0.829426 0.556004 +v 0.066947 3.29123 -1.45033 +vn 0.0601642 0.880814 0.469623 +v 0.202379 3.20326 -1.28958 +vn 0.206109 0.926418 0.315069 +v 0.169349 3.19691 -1.24958 +vn 0.170431 0.94145 0.290903 +v 0.203609 3.17699 -1.2048 +vn 0.206909 0.943317 0.259503 +v 0.204292 3.15582 -1.11876 +vn 0.21051 0.956011 0.204277 +v 0.170567 3.15476 -1.0792 +vn 0.17847 0.967699 0.178062 +v 0.204645 3.14008 -1.03321 +vn 0.215766 0.965458 0.146072 +v 0.067459 3.22441 -1.29497 +vn 0.0632192 0.942266 0.328844 +v 0 3.20968 -1.24317 +vn 2.2094e-18 0.95643 0.291963 +v 0.067972 3.19846 -1.21222 +vn 0.0650604 0.960886 0.269193 +v 0.068245 3.17757 -1.12803 +vn 0.0674147 0.97508 0.211364 +v 0 3.16955 -1.07558 +vn -4.1665e-06 0.984585 0.174907 +v 0.068378 3.162 -1.04423 +vn 0.0700652 0.985873 0.152135 +v 0.270854 3.15792 -1.19841 +vn 0.276203 0.928442 0.248409 +v 0.337497 3.13323 -1.18993 +vn 0.34462 0.909524 0.232384 +v 0.303537 3.15872 -1.23856 +vn 0.312403 0.912443 0.264296 +v 0.403342 3.10279 -1.17889 +vn 0.41209 0.886305 0.211294 +v 0.468214 3.06657 -1.16505 +vn 0.479595 0.857774 0.184967 +v 0.434901 3.097 -1.21856 +vn 0.45211 0.865566 0.215389 +v 0.272256 3.12108 -1.0239 +vn 0.282213 0.949158 0.139485 +v 0.337693 3.09788 -1.01456 +vn 0.344483 0.92947 0.131974 +v 0.30561 3.11672 -1.06195 +vn 0.312343 0.935735 0.163833 +v 0.402526 3.06926 -0.998657 +vn 0.404065 0.907038 0.118376 +v 0.468238 3.03538 -0.982197 +vn 0.462854 0.88051 0.102321 +v 0.438177 3.05778 -1.03486 +vn 0.435431 0.889926 0.135761 +v 0.34187 3.10987 -0.612531 +vn 0.373914 0.904733 -0.204077 +v 0.408954 3.06987 -0.6659 +vn 0.421192 0.895086 -0.146351 +v 0.341443 3.09585 -0.687303 +vn 0.367081 0.91953 -0.140417 +v 0.340939 3.08719 -0.76417 +vn 0.361728 0.929498 -0.072016 +v 0.40737 3.05637 -0.826458 +vn 0.414168 0.910117 -0.0123393 +v 0.340401 3.08426 -0.843638 +vn 0.35686 0.934157 -0.00128995 +v 0.478959 3.05597 -0.559331 +vn 0.47346 0.855502 -0.209647 +v 0.542422 3.00709 -0.614217 +vn 0.511698 0.843404 -0.163814 +v 0.475952 3.03995 -0.64268 +vn 0.46954 0.869432 -0.153692 +v 0.474807 3.0291 -0.724138 +vn 0.46824 0.878845 -0.0915536 +v 0.541043 2.98698 -0.78363 +vn 0.515693 0.855687 -0.0431314 +v 0.473733 3.02415 -0.807235 +vn 0.467301 0.883736 -0.0253105 +v 0.273574 3.11771 -0.705987 +vn 0.306858 0.942006 -0.135877 +v 0.205436 3.13518 -0.721355 +vn 0.239868 0.961681 -0.13279 +v 0.205445 3.14754 -0.651411 +vn 0.247205 0.947391 -0.203322 +v 0.137085 3.14797 -0.733096 +vn 0.164701 0.977628 -0.130834 +v 0.068584 3.15523 -0.744153 +vn 0.0819974 0.988652 -0.12587 +v 0.068585 3.16649 -0.676557 +vn 0.0853568 0.976015 -0.200274 +v 0.272925 3.10759 -0.85838 +vn 0.294556 0.955609 0.00696105 +v 0.205043 3.12614 -0.870364 +vn 0.227655 0.973657 0.0128551 +v 0.205276 3.12794 -0.794226 +vn 0.233609 0.970473 -0.0600699 +v 0.136853 3.13966 -0.879485 +vn 0.154602 0.987834 0.016787 +v 0.068463 3.14789 -0.889233 +vn 0.0759459 0.996862 0.0223202 +v 0.068535 3.14893 -0.814942 +vn 0.0790082 0.995572 -0.0509311 +v 0.136852 3.1763 -0.599128 +vn 0.177676 0.945353 -0.273385 +v 0.205221 3.16466 -0.584047 +vn 0.25638 0.92822 -0.269586 +v 0.204649 3.18621 -0.518994 +vn 0.26784 0.905055 -0.330358 +v 0.135583 3.222 -0.47517 +vn 0.19628 0.896783 -0.396552 +v 0.203477 3.21187 -0.45621 +vn 0.281131 0.878994 -0.385142 +v 0 3.17944 -0.634162 +vn 4.13282e-06 0.967958 -0.251114 +v 0.06849 3.18237 -0.611854 +vn 0.0892128 0.958078 -0.272265 +v 0.068272 3.20256 -0.549733 +vn 0.0938599 0.935852 -0.339665 +v 0 3.22109 -0.511521 +vn 2.2104e-18 0.922756 -0.385386 +v 0.067881 3.22675 -0.489898 +vn 0.0992019 0.910559 -0.401299 +v 0.273644 3.14875 -0.563993 +vn 0.324439 0.90793 -0.265334 +v 0.342163 3.12885 -0.539331 +vn 0.383461 0.885785 -0.261425 +v 0.410614 3.10511 -0.511249 +vn 0.434601 0.862801 -0.258257 +v 0.478816 3.0787 -0.477456 +vn 0.478523 0.839445 -0.257582 +v 0.271761 3.19797 -0.430507 +vn 0.352502 0.858682 -0.372031 +v 0.340515 3.18057 -0.398539 +vn 0.41188 0.837771 -0.358461 +v 0.34196 3.15248 -0.467768 +vn 0.39627 0.863217 -0.312773 +v 0.409716 3.15957 -0.361739 +vn 0.462028 0.817604 -0.34359 +v 0.480537 3.13644 -0.315142 +vn 0.505634 0.79749 -0.329156 +v 0.479847 3.10503 -0.397191 +vn 0.488876 0.820135 -0.297284 +v 0.310894 3.37662 -0.113625 +vn 0.52604 0.603523 -0.599201 +v 0.377368 3.3228 -0.110029 +vn 0.556691 0.652869 -0.51367 +v 0.316837 3.33195 -0.159152 +vn 0.49705 0.678905 -0.540397 +v 0.324463 3.28918 -0.211074 +vn 0.473192 0.733276 -0.488258 +v 0.39953 3.23502 -0.218305 +vn 0.507618 0.751915 -0.420652 +v 0.331866 3.24923 -0.268887 +vn 0.4517 0.775764 -0.440633 +v 0.42501 3.36403 -0.008607 +vn 0.64463 0.539623 -0.541535 +v 0.487995 3.30946 0.01212 +vn 0.667544 0.585518 -0.45995 +v 0.434799 3.31491 -0.052872 +vn 0.613077 0.623056 -0.485735 +v 0.447084 3.26585 -0.10719 +vn 0.581019 0.686154 -0.437733 +v 0.488706 3.23592 -0.098017 +vn 0.594539 0.696851 -0.40115 +v 0.468051 3.21607 -0.16344 +vn 0.556391 0.731417 -0.394282 +v 0.254493 3.34103 -0.200188 +vn 0.428237 0.704066 -0.566484 +v 0.191441 3.34884 -0.233067 +vn 0.345833 0.728196 -0.591718 +v 0.188743 3.38945 -0.189089 +vn 0.368132 0.657427 -0.657471 +v 0.128012 3.35473 -0.257404 +vn 0.245243 0.749846 -0.614481 +v 0.064262 3.35644 -0.274795 +vn 0.12561 0.768373 -0.627555 +v 0.063371 3.39502 -0.231839 +vn 0.134648 0.702195 -0.699136 +v 0.264949 3.26309 -0.307187 +vn 0.386968 0.797735 -0.462466 +v 0.198554 3.27428 -0.337492 +vn 0.310578 0.819008 -0.48246 +v 0.194936 3.31028 -0.282933 +vn 0.327048 0.7796 -0.534101 +v 0.132451 3.2825 -0.359735 +vn 0.218569 0.83803 -0.499933 +v 0.066422 3.28579 -0.376223 +vn 0.111302 0.853281 -0.509435 +v 0.065334 3.31988 -0.323364 +vn 0.117994 0.816318 -0.565422 +v 0.126133 3.43514 -0.177967 +vn 0.280731 0.574073 -0.769175 +v 0.188197 3.43164 -0.151929 +vn 0.399827 0.553821 -0.730357 +v 0.255112 3.47805 -0.083126 +vn 0.528857 0.329702 -0.782053 +v 0.197466 3.46955 -0.121901 +vn 0.438628 0.414556 -0.797338 +v 0.194121 3.51924 -0.104843 +vn 0.454585 0.213917 -0.864634 +v 0 3.42418 -0.210986 +vn -4.42777e-18 0.634646 -0.772803 +v 0.063249 3.43539 -0.195672 +vn 0.150241 0.605476 -0.781554 +v 0.132608 3.48376 -0.145944 +vn 0.321798 0.377644 -0.868235 +v 0.071775 3.47246 -0.16894 +vn 0.182125 0.468972 -0.864231 +v 0.065175 3.51934 -0.151 +vn 0.177871 0.269151 -0.94653 +v 0.249297 3.42726 -0.117221 +vn 0.484279 0.520146 -0.703507 +v 0.308887 3.42245 -0.074746 +vn 0.564532 0.493051 -0.66197 +v 0.366227 3.41751 -0.025671 +vn 0.622778 0.463972 -0.629982 +v 0.420941 3.41365 0.029449 +vn 0.677961 0.425057 -0.599746 +v 0.368068 3.46593 0.005338 +vn 0.656794 0.309853 -0.687468 +v 0.314979 3.46553 -0.042417 +vn 0.605264 0.348045 -0.715905 +v 0.318289 3.51314 -0.023012 +vn 0.62898 0.158342 -0.761125 +v 0.375507 3.51558 0.027707 +vn 0.677964 0.109872 -0.726838 +v 0.431738 3.51537 0.083469 +vn 0.72413 0.0723073 -0.685863 +v 0.423001 3.46405 0.060442 +vn 0.707916 0.26926 -0.652957 +v 1.31801 1.10903 0.33947 +vn 0.620753 -0.782763 0.0441388 +v 1.31964 1.11519 0.414791 +vn 0.618172 -0.783493 0.063269 +v 1.30215 1.10278 0.422115 +vn 0.579762 -0.811584 0.0721675 +v 1.28107 1.08569 0.391778 +vn 0.5593 -0.826846 0.0592436 +v 1.28086 1.09545 0.495209 +vn 0.558455 -0.823731 0.097952 +v 1.26034 1.07497 0.426104 +vn 0.536297 -0.840493 0.0771825 +v 1.31537 1.12722 0.547575 +vn 0.614148 -0.781837 0.107488 +v 1.3113 1.13677 0.624933 +vn 0.608828 -0.779006 0.149925 +v 1.29096 1.11379 0.579157 +vn 0.576488 -0.80687 0.12893 +v 1.27409 1.10175 0.575851 +vn 0.545209 -0.828563 0.127397 +v 1.27135 1.11411 0.655744 +vn 0.548467 -0.820232 0.162488 +v 1.25606 1.09051 0.577157 +vn 0.524882 -0.841198 0.129939 +v 1.31665 1.10324 0.176568 +vn 0.624545 -0.78098 0.00372876 +v 1.31985 1.10678 0.256759 +vn 0.623954 -0.781162 0.0216169 +v 1.3027 1.09392 0.260866 +vn 0.588861 -0.807842 0.0251893 +v 1.28114 1.07705 0.150022 +vn 0.567675 -0.823248 0.00296548 +v 1.2773 1.07468 0.088566 +vn 0.563142 -0.826269 -0.0122643 +v 1.29602 1.08796 0.089895 +vn 0.591832 -0.805957 -0.0129612 +v 1.25085 1.05759 0.177936 +vn 0.519407 -0.854478 0.00910958 +v 1.26234 1.06641 0.26189 +vn 0.539047 -0.841794 0.0284865 +v 1.24863 1.05783 0.258402 +vn 0.513244 -0.857804 0.0274178 +v 1.27268 1.07348 0.009136 +vn 0.565405 -0.824423 -0.0253762 +v 1.26014 1.06344 0.09078 +vn 0.538611 -0.842501 -0.00955828 +v 1.34004 1.12376 0.256775 +vn 0.659025 -0.751841 0.0204964 +v 1.36042 1.1461 0.339368 +vn 0.705026 -0.708097 0.0391949 +v 1.36034 1.14233 0.25778 +vn 0.701284 -0.712643 0.0184737 +v 1.37973 1.16293 0.259595 +vn 0.746787 -0.664819 0.0180004 +v 1.3155 1.10268 0.091584 +vn 0.623795 -0.781475 -0.0133223 +v 1.33575 1.1197 0.091758 +vn 0.659073 -0.751927 -0.0151165 +v 1.35869 1.14014 0.175489 +vn 0.704014 -0.710186 -0.000393397 +v 1.35593 1.13811 0.09217 +vn 0.700547 -0.713387 -0.0176681 +v 1.37524 1.15846 0.093316 +vn 0.745287 -0.666449 -0.0198421 +v 1.31933 1.12086 0.473007 +vn 0.619553 -0.779696 0.0907128 +v 1.33948 1.13192 0.416507 +vn 0.656704 -0.751516 0.062948 +v 1.33699 1.14973 0.579256 +vn 0.651903 -0.748264 0.122977 +v 1.35395 1.15362 0.496341 +vn 0.693719 -0.714511 0.0907042 +v 1.35938 1.15033 0.419728 +vn 0.699711 -0.71161 0.0633689 +v 1.37912 1.17145 0.422045 +vn 0.750531 -0.658022 0.0609141 +v 1.35072 1.17494 0.647089 +vn 0.688023 -0.710729 0.146593 +v 1.36033 1.1697 0.567613 +vn 0.704921 -0.70144 0.105208 +v 1.37481 1.18675 0.579382 +vn 0.741622 -0.660368 0.117942 +v 1.17329 2.01027 -1.49617 +vn 0.734452 0.206684 -0.646422 +v 1.17892 1.94097 -1.50779 +vn 0.740556 0.12525 -0.660219 +v 1.13645 2.00079 -1.53742 +vn 0.678534 0.205591 -0.705212 +v 1.14548 1.92946 -1.54436 +vn 0.694015 0.100227 -0.71295 +v 1.11304 1.98547 -1.56279 +vn 0.656911 0.186443 -0.730552 +v 1.18642 1.87227 -1.50636 +vn 0.749402 0.0109898 -0.662024 +v 1.15006 1.85715 -1.54442 +vn 0.700515 -0.0104763 -0.713561 +v 1.11701 1.92104 -1.57141 +vn 0.662887 0.0909195 -0.743178 +v 1.13005 2.06346 -1.52157 +vn 0.666417 0.279859 -0.691062 +v 1.15824 2.0824 -1.48431 +vn 0.710605 0.298347 -0.637205 +v 1.09739 2.06475 -1.55034 +vn 0.643814 0.280477 -0.711924 +v 1.18721 2.04437 -1.46703 +vn 0.75616 0.255087 -0.602622 +v 1.26903 2.01336 -1.35624 +vn 0.851774 0.216805 -0.476945 +v 1.2428 2.01223 -1.40178 +vn 0.827062 0.215379 -0.519211 +v 1.2369 2.04542 -1.39539 +vn 0.819211 0.262319 -0.509982 +v 1.17266 2.1134 -1.45086 +vn 0.745687 0.328762 -0.57954 +v 1.25833 2.078 -1.33899 +vn 0.836211 0.303741 -0.456611 +v 1.23013 2.07867 -1.38793 +vn 0.812055 0.301309 -0.49978 +v 1.2219 2.11275 -1.37908 +vn 0.805522 0.335691 -0.488309 +v 1.21653 2.01378 -1.44007 +vn 0.792117 0.211718 -0.572474 +v 1.22072 1.94731 -1.45407 +vn 0.799706 0.129774 -0.586198 +v 1.20503 1.90758 -1.48188 +vn 0.784432 0.0672676 -0.616556 +v 1.24717 1.97858 -1.40684 +vn 0.834321 0.166728 -0.525461 +v 1.24977 1.94456 -1.41218 +vn 0.837864 0.114268 -0.533785 +v 1.27939 1.94414 -1.36165 +vn 0.866256 0.111837 -0.486922 +v 1.25464 1.9097 -1.40993 +vn 0.84725 0.0631927 -0.527422 +v 1.59022 1.73044 0.485454 +vn 0.970744 -0.23186 0.0624323 +v 1.57962 1.70019 0.531355 +vn 0.967192 -0.244169 0.0701473 +v 1.57291 1.66321 0.486996 +vn 0.963685 -0.260281 0.0597125 +v 1.55458 1.59861 0.487362 +vn 0.957796 -0.281751 0.0569543 +v 1.5437 1.57153 0.531665 +vn 0.955399 -0.288251 0.0642113 +v 1.5357 1.53671 0.487881 +vn 0.953063 -0.297668 0.0553616 +v 1.57902 1.74577 0.662556 +vn 0.971375 -0.2155 0.0999556 +v 1.56782 1.71706 0.705785 +vn 0.967901 -0.227275 0.107302 +v 1.56305 1.67958 0.663484 +vn 0.964664 -0.24553 0.0955904 +v 1.54556 1.61493 0.664582 +vn 0.958589 -0.269386 0.0924005 +v 1.5239 1.56739 0.743208 +vn 0.955298 -0.277049 0.103197 +v 1.52809 1.55443 0.662967 +vn 0.954207 -0.285822 0.0882933 +v 1.57584 1.65628 0.395667 +vn 0.963033 -0.2661 0.0419381 +v 1.57719 1.64977 0.302855 +vn 0.962164 -0.271406 0.02408 +v 1.58587 1.68639 0.348625 +vn 0.965922 -0.256576 0.0341084 +v 1.57684 1.64335 0.208975 +vn 0.960945 -0.276675 0.00599685 +v 1.57459 1.6367 0.114463 +vn 0.959219 -0.282392 -0.0124155 +v 1.58536 1.67307 0.160865 +vn 0.96347 -0.267808 -0.00204852 +v 1.53822 1.53053 0.395671 +vn 0.952763 -0.301423 0.0372376 +v 1.53899 1.52429 0.303575 +vn 0.951887 -0.305822 0.0195817 +v 1.54825 1.55729 0.350177 +vn 0.954192 -0.297715 0.0297137 +v 1.53812 1.51842 0.2102 +vn 0.950616 -0.310366 0.00140006 +v 1.53567 1.51338 0.116282 +vn 0.948955 -0.31491 -0.0177465 +v 1.5468 1.5455 0.163426 +vn 0.951665 -0.307064 -0.00669878 +v 1.59529 1.71698 0.301009 +vn 0.969334 -0.244363 0.0260303 +v 1.60396 1.74779 0.252966 +vn 0.972643 -0.231613 0.0179369 +v 1.61153 1.78583 0.298576 +vn 0.977447 -0.20931 0.028045 +v 1.62512 1.8556 0.294358 +vn 0.985962 -0.164623 0.0278911 +v 1.63102 1.88586 0.247459 +vn 0.989577 -0.14261 0.0200111 +v 1.63504 1.92614 0.292563 +vn 0.993712 -0.108002 0.0295328 +v 1.59316 1.70283 0.112472 +vn 0.966515 -0.256407 -0.010209 +v 1.60011 1.73232 0.063915 +vn 0.969397 -0.244823 -0.0181707 +v 1.60994 1.77043 0.110132 +vn 0.974858 -0.222663 -0.00857224 +v 1.62403 1.83841 0.107639 +vn 0.983751 -0.179365 -0.00789242 +v 1.62835 1.86698 0.059178 +vn 0.987245 -0.158312 -0.0168806 +v 1.63452 1.90568 0.105198 +vn 0.99227 -0.123784 -0.00876931 +v 1.60954 1.79342 0.392487 +vn 0.978468 -0.200985 0.0469548 +v 1.60526 1.798 0.483689 +vn 0.978834 -0.193366 0.067026 +v 1.60023 1.76141 0.438939 +vn 0.974346 -0.218356 0.0544955 +v 1.6 1.80611 0.572848 +vn 0.979747 -0.181589 0.0843877 +v 1.59292 1.81334 0.660562 +vn 0.979487 -0.173039 0.103259 +v 1.58981 1.77555 0.618625 +vn 0.975012 -0.202024 0.0924054 +v 1.63356 1.9479 0.383129 +vn 0.994864 -0.0859868 0.0533968 +v 1.63334 2.00461 0.44238 +vn 0.997773 -0.0243283 0.0621077 +v 1.62677 1.93671 0.474452 +vn 0.992919 -0.0944236 0.0720849 +v 1.62011 1.94395 0.564076 +vn 0.992029 -0.0881714 0.0900257 +v 1.6187 1.98103 0.605802 +vn 0.993745 -0.0486419 0.100521 +v 1.61128 1.94694 0.653976 +vn 0.990702 -0.0808708 0.109408 +v 1.27688 1.10316 -0.326193 +vn 0.613489 -0.781116 -0.11614 +v 1.28782 1.10063 -0.242183 +vn 0.614086 -0.784311 -0.0880618 +v 1.2681 1.08597 -0.241636 +vn 0.58164 -0.808951 -0.0853989 +v 1.23843 1.07539 -0.324669 +vn 0.552487 -0.826051 -0.111344 +v 1.24912 1.07269 -0.241177 +vn 0.553959 -0.828356 -0.0833945 +v 1.23179 1.06143 -0.239753 +vn 0.527469 -0.84566 -0.0814616 +v 1.29731 1.1003 -0.158388 +vn 0.621094 -0.781064 -0.0646595 +v 1.30503 1.10046 -0.07481 +vn 0.62026 -0.783122 -0.0446883 +v 1.28529 1.08562 -0.074382 +vn 0.588039 -0.807725 -0.0423137 +v 1.25883 1.07222 -0.157257 +vn 0.561152 -0.825519 -0.0602226 +v 1.26629 1.0722 -0.073918 +vn 0.560734 -0.827008 -0.0404258 +v 1.24902 1.06092 -0.073225 +vn 0.537198 -0.842577 -0.0384892 +v 1.25159 1.11604 -0.496789 +vn 0.60089 -0.777399 -0.185962 +v 1.26424 1.10721 -0.410282 +vn 0.601741 -0.784774 -0.148451 +v 1.24441 1.09265 -0.409642 +vn 0.571613 -0.807448 -0.145901 +v 1.21863 1.13966 -0.664616 +vn 0.584955 -0.765659 -0.267571 +v 1.23409 1.12404 -0.579199 +vn 0.585752 -0.779208 -0.222999 +v 1.21439 1.10958 -0.577887 +vn 0.558458 -0.799668 -0.220578 +v 1.21038 1.08513 -0.488495 +vn 0.53993 -0.822931 -0.176805 +v 1.2256 1.07948 -0.408227 +vn 0.542832 -0.827159 -0.145401 +v 1.21208 1.06912 -0.397347 +vn 0.519475 -0.843997 -0.133471 +v 1.17938 1.10779 -0.65132 +vn 0.529805 -0.808771 -0.255335 +v 1.19548 1.09634 -0.576431 +vn 0.531396 -0.818072 -0.219947 +v 1.18217 1.0854 -0.566407 +vn 0.50948 -0.835176 -0.207151 +v 1.28442 1.12329 -0.409164 +vn 0.637171 -0.756338 -0.148212 +v 1.31832 1.13964 -0.330308 +vn 0.694117 -0.709074 -0.124155 +v 1.30414 1.14054 -0.408954 +vn 0.679914 -0.718096 -0.14851 +v 1.3194 1.1581 -0.417762 +vn 0.725645 -0.669639 -0.158185 +v 1.25092 1.13872 -0.583857 +vn 0.624636 -0.746688 -0.228664 +v 1.27952 1.15389 -0.550336 +vn 0.670322 -0.71293 -0.205911 +v 1.26329 1.16617 -0.634177 +vn 0.657052 -0.708184 -0.258375 +v 1.29474 1.18005 -0.585326 +vn 0.704437 -0.671442 -0.230075 +v 1.308 1.1174 -0.242931 +vn 0.65057 -0.753896 -0.0916473 +v 1.31123 1.1018 0.008511 +vn 0.625602 -0.779603 -0.0290027 +v 1.32519 1.11732 -0.075112 +vn 0.656404 -0.75292 -0.0473862 +v 1.33728 1.1352 -0.159275 +vn 0.698465 -0.712124 -0.0708927 +v 1.32802 1.13548 -0.243606 +vn 0.69052 -0.71702 -0.0952089 +v 1.3471 1.15501 -0.242332 +vn 0.73522 -0.670806 -0.0973182 +v 1.35131 1.13701 0.008661 +vn 0.702875 -0.710511 -0.0337737 +v 1.34525 1.13554 -0.075272 +vn 0.697597 -0.7147 -0.0506114 +v 1.36448 1.1557 -0.075152 +vn 0.742176 -0.668007 -0.0542363 +v 1.45684 1.29069 0.197348 +vn 0.915852 -0.401485 -0.0050567 +v 1.45655 1.29044 0.290152 +vn 0.916438 -0.399737 0.0187746 +v 1.44463 1.26381 0.27863 +vn 0.899017 -0.437797 0.0101711 +v 1.45067 1.28867 0.01494 +vn 0.914299 -0.402113 -0.0486051 +v 1.45557 1.29099 0.103591 +vn 0.918439 -0.394642 -0.0269658 +v 1.44053 1.25807 0.103502 +vn 0.899689 -0.435612 -0.0283041 +v 1.42721 1.22991 0.179116 +vn 0.87077 -0.491674 -0.00400665 +v 1.43001 1.23555 0.27108 +vn 0.873407 -0.48679 0.0139766 +v 1.41244 1.20531 0.254513 +vn 0.841966 -0.539366 0.013345 +v 1.42119 1.22803 0.013696 +vn 0.869791 -0.491338 -0.0452873 +v 1.42586 1.22938 0.099807 +vn 0.873297 -0.486501 -0.0258753 +v 1.41023 1.20389 0.097163 +vn 0.837136 -0.546446 -0.0245027 +v 1.45847 1.30024 0.376147 +vn 0.916393 -0.399153 0.0299939 +v 1.47347 1.33218 0.289977 +vn 0.932768 -0.360246 0.0129196 +v 1.48491 1.36914 0.382605 +vn 0.940037 -0.339715 0.0304131 +v 1.48813 1.37212 0.294558 +vn 0.94155 -0.336617 0.0131283 +v 1.50217 1.41312 0.304038 +vn 0.946339 -0.322648 0.0184641 +v 1.46941 1.32498 0.110175 +vn 0.931732 -0.362288 -0.0249597 +v 1.48678 1.36765 0.203903 +vn 0.939139 -0.343485 -0.00594387 +v 1.48426 1.3644 0.112909 +vn 0.939178 -0.342512 -0.0250909 +v 1.49967 1.40758 0.11732 +vn 0.943688 -0.330197 -0.0205572 +v 1.45617 1.31528 0.541179 +vn 0.915556 -0.396591 0.0668805 +v 1.45744 1.30582 0.458344 +vn 0.917239 -0.394674 0.0538975 +v 1.47248 1.34396 0.464036 +vn 0.933272 -0.355969 0.0478518 +v 1.45158 1.33835 0.699882 +vn 0.912962 -0.39544 0.100633 +v 1.45431 1.32598 0.621222 +vn 0.916812 -0.389846 0.0864653 +v 1.4679 1.36218 0.63139 +vn 0.93174 -0.353648 0.0824297 +v 1.50331 1.42308 0.389015 +vn 0.946876 -0.319968 0.0323495 +v 1.50192 1.43031 0.478198 +vn 0.947313 -0.316473 0.0494202 +v 1.48632 1.38301 0.468826 +vn 0.942983 -0.329529 0.0468299 +v 1.49951 1.43875 0.565076 +vn 0.947245 -0.313894 0.0647938 +v 1.49641 1.44896 0.649395 +vn 0.947319 -0.309974 0.0806341 +v 1.48046 1.3992 0.64013 +vn 0.940176 -0.330513 0.0826445 +v 1.44421 1.27482 0.448244 +vn 0.900081 -0.432991 0.0487151 +v 1.43034 1.24015 0.356734 +vn 0.873805 -0.485291 0.0309556 +v 1.42947 1.24547 0.440184 +vn 0.873416 -0.483982 0.0539056 +v 1.4144 1.21881 0.432049 +vn 0.842491 -0.535301 0.0605104 +v 1.44044 1.29237 0.610981 +vn 0.897281 -0.432645 0.087777 +v 1.42786 1.25319 0.521821 +vn 0.869169 -0.489269 0.071849 +v 1.42568 1.26232 0.601516 +vn 0.867755 -0.487859 0.0948413 +v 1.4101 1.23456 0.592934 +vn 0.830033 -0.548969 0.0983793 +v 1.37131 2.2693 1.41529 +vn 0.80567 0.293189 0.514719 +v 1.35867 2.31866 1.40513 +vn 0.789509 0.338664 0.511842 +v 1.34401 2.31682 1.42719 +vn 0.755828 0.3415 0.558661 +v 1.32919 2.30744 1.45162 +vn 0.72501 0.331888 0.603498 +v 1.31561 2.36713 1.43154 +vn 0.718141 0.386719 0.578552 +v 1.31303 2.32488 1.46043 +vn 0.698187 0.354821 0.621801 +v 1.32959 2.41206 1.37921 +vn 0.762787 0.417469 0.493838 +v 1.31195 2.4604 1.36235 +vn 0.748774 0.459323 0.477871 +v 1.31312 2.41652 1.39906 +vn 0.729414 0.425128 0.53593 +v 1.29792 2.4198 1.4162 +vn 0.697839 0.429197 0.57342 +v 1.2803 2.46941 1.39808 +vn 0.689155 0.466778 0.554241 +v 1.28468 2.42162 1.43006 +vn 0.672841 0.431168 0.601149 +v 1.39143 2.16815 1.43105 +vn 0.827883 0.192543 0.526818 +v 1.3821 2.21911 1.42493 +vn 0.815916 0.244023 0.524151 +v 1.36739 2.21727 1.44711 +vn 0.787316 0.242781 0.566737 +v 1.40277 2.06775 1.43976 +vn 0.844194 0.0856175 0.529156 +v 1.3984 2.11702 1.43672 +vn 0.836452 0.139775 0.529917 +v 1.38342 2.11465 1.45928 +vn 0.806138 0.139153 0.575133 +v 1.36223 2.16497 1.47309 +vn 0.770574 0.192722 0.607515 +v 1.35352 2.21558 1.46616 +vn 0.754968 0.24216 0.609411 +v 1.34049 2.21563 1.48132 +vn 0.72777 0.246214 0.640101 +v 1.37458 2.05939 1.48118 +vn 0.789316 0.0807911 0.608649 +v 1.36932 2.11223 1.47871 +vn 0.77707 0.137673 0.614173 +v 1.35633 2.1105 1.49465 +vn 0.752961 0.138099 0.643411 +v 1.39797 2.22069 1.39757 +vn 0.844107 0.244155 0.477359 +v 1.40387 2.27096 1.35616 +vn 0.857464 0.289829 0.425153 +v 1.41456 2.22197 1.36596 +vn 0.868746 0.243519 0.431253 +v 1.43202 2.22131 1.32819 +vn 0.889673 0.24179 0.387323 +v 1.41437 2.11951 1.4088 +vn 0.865115 0.138431 0.482093 +v 1.43084 2.12332 1.37654 +vn 0.888326 0.141701 0.436805 +v 1.43655 2.06803 1.37845 +vn 0.894723 0.0845433 0.438547 +v 1.44878 2.11999 1.33829 +vn 0.908962 0.133389 0.394963 +v 1.34613 2.36479 1.39116 +vn 0.778467 0.381498 0.498446 +v 1.37435 2.31965 1.3781 +vn 0.820785 0.335874 0.462062 +v 1.34395 2.41569 1.35172 +vn 0.791872 0.419575 0.44373 +v 1.37602 2.36922 1.33376 +vn 0.830635 0.377732 0.409101 +v 1.39064 2.32067 1.34679 +vn 0.844827 0.33478 0.417361 +v 1.40797 2.32065 1.30869 +vn 0.866349 0.331739 0.373348 +v 1.34155 2.4654 1.30367 +vn 0.800916 0.453839 0.390595 +v 1.35929 2.41797 1.32052 +vn 0.815781 0.418046 0.399674 +v 1.37604 2.41807 1.28315 +vn 0.837536 0.414154 0.356386 +v 1.53116 1.59863 -0.357676 +vn 0.937756 -0.326456 -0.118493 +v 1.51567 1.59136 -0.449833 +vn 0.930583 -0.336115 -0.145058 +v 1.53398 1.62492 -0.40524 +vn 0.938446 -0.320511 -0.128809 +v 1.49522 1.57813 -0.541242 +vn 0.922998 -0.344828 -0.170789 +v 1.47965 1.56075 -0.587818 +vn 0.917715 -0.351084 -0.185845 +v 1.48297 1.59385 -0.631819 +vn 0.918329 -0.343123 -0.197328 +v 1.48679 1.4754 -0.349065 +vn 0.926784 -0.352007 -0.131009 +v 1.46134 1.44207 -0.431772 +vn 0.921366 -0.358313 -0.150651 +v 1.479 1.49111 -0.440641 +vn 0.921533 -0.358771 -0.148525 +v 1.46241 1.48939 -0.531377 +vn 0.91538 -0.363439 -0.17318 +v 1.44558 1.46851 -0.574148 +vn 0.910796 -0.367652 -0.187838 +v 1.44676 1.49542 -0.619862 +vn 0.908255 -0.368472 -0.198246 +v 1.53592 1.65044 -0.452021 +vn 0.939908 -0.311648 -0.13946 +v 1.53521 1.67271 -0.503113 +vn 0.941464 -0.298932 -0.155836 +v 1.55351 1.70835 -0.456333 +vn 0.94966 -0.280433 -0.139653 +v 1.56901 1.76598 -0.458691 +vn 0.960774 -0.239523 -0.139794 +v 1.56722 1.78893 -0.506309 +vn 0.96314 -0.219098 -0.15607 +v 1.58146 1.82255 -0.459948 +vn 0.972184 -0.185483 -0.143019 +v 1.49186 1.64249 -0.672392 +vn 0.922041 -0.32395 -0.211888 +v 1.49057 1.68304 -0.735069 +vn 0.925078 -0.298514 -0.234777 +v 1.51582 1.69422 -0.64225 +vn 0.934289 -0.293906 -0.201799 +v 1.53177 1.74955 -0.643541 +vn 0.946583 -0.251519 -0.201788 +v 1.52582 1.77041 -0.693581 +vn 0.948662 -0.221562 -0.22572 +v 1.54372 1.80195 -0.646065 +vn 0.957969 -0.196553 -0.208954 +v 1.56855 1.71762 -0.362619 +vn 0.955988 -0.270953 -0.112572 +v 1.5813 1.72822 -0.268563 +vn 0.961448 -0.260465 -0.0881782 +v 1.56657 1.69236 -0.314308 +vn 0.95374 -0.283165 -0.100986 +v 1.5918 1.73949 -0.174162 +vn 0.966059 -0.249765 -0.0659394 +v 1.60006 1.75072 -0.079511 +vn 0.969822 -0.239533 -0.0454871 +v 1.58777 1.71285 -0.125674 +vn 0.963282 -0.262476 -0.0565154 +v 1.59628 1.8363 -0.366505 +vn 0.977777 -0.175632 -0.114475 +v 1.6086 1.85107 -0.272403 +vn 0.982327 -0.164431 -0.0894181 +v 1.59712 1.81378 -0.318794 +vn 0.974688 -0.199989 -0.0999359 +v 1.61848 1.86619 -0.178063 +vn 0.985959 -0.153116 -0.0666369 +v 1.62603 1.88083 -0.083603 +vn 0.98877 -0.142212 -0.0459418 +v 1.61729 1.84188 -0.130008 +vn 0.982559 -0.177732 -0.0546657 +v 1.56361 1.6665 -0.265906 +vn 0.95206 -0.292129 -0.090787 +v 1.55975 1.6402 -0.21748 +vn 0.950339 -0.30047 -0.0810808 +v 1.54434 1.60588 -0.263089 +vn 0.94405 -0.315898 -0.0947589 +v 1.52444 1.54708 -0.258849 +vn 0.937881 -0.332844 -0.0979526 +v 1.52008 1.52177 -0.212164 +vn 0.937818 -0.335321 -0.0897602 +v 1.504 1.49057 -0.257885 +vn 0.933389 -0.343277 -0.104617 +v 1.58278 1.68553 -0.077155 +vn 0.961031 -0.272249 -0.0479547 +v 1.57692 1.65769 -0.028664 +vn 0.958645 -0.281863 -0.039397 +v 1.56381 1.62166 -0.074833 +vn 0.953452 -0.297146 -0.0513111 +v 1.54403 1.56019 -0.072728 +vn 0.947385 -0.315313 -0.0551293 +v 1.53773 1.53376 -0.024876 +vn 0.94661 -0.319015 -0.0464559 +v 1.52437 1.50234 -0.071333 +vn 0.943066 -0.327312 -0.0590965 +v 1.16383 2.86219 0.867921 +vn 0.581505 0.803046 0.130263 +v 1.16573 2.8706 0.797935 +vn 0.577386 0.811096 0.0935331 +v 1.14937 2.88094 0.804861 +vn 0.537132 0.837872 0.0972661 +v 1.13316 2.87996 0.882559 +vn 0.514674 0.846084 0.138753 +v 1.13488 2.88905 0.810447 +vn 0.504559 0.85752 0.1004 +v 1.12166 2.89592 0.815995 +vn 0.477855 0.872594 0.101167 +v 1.16949 2.87485 0.721058 +vn 0.576719 0.815085 0.0550617 +v 1.16665 2.88015 0.644045 +vn 0.557732 0.829992 0.00693322 +v 1.15424 2.88792 0.655566 +vn 0.523371 0.851832 0.021558 +v 1.13752 2.89424 0.736082 +vn 0.505607 0.860886 0.0568969 +v 1.14 2.89611 0.660387 +vn 0.49308 0.869785 0.0185829 +v 1.12678 2.90325 0.664706 +vn 0.465793 0.884739 0.0165465 +v 1.16135 2.83718 0.995169 +vn 0.586398 0.783438 0.205821 +v 1.16284 2.85023 0.935825 +vn 0.586155 0.792243 0.169628 +v 1.14674 2.85991 0.943913 +vn 0.546163 0.819005 0.175891 +v 1.17122 2.79161 1.11177 +vn 0.608075 0.740025 0.287414 +v 1.16729 2.81465 1.05623 +vn 0.603626 0.757714 0.248002 +v 1.15187 2.82253 1.06796 +vn 0.564381 0.782675 0.262476 +v 1.13391 2.85018 1.01681 +vn 0.52743 0.818727 0.226945 +v 1.13242 2.86727 0.951525 +vn 0.514356 0.837528 0.184347 +v 1.11922 2.87353 0.958789 +vn 0.490141 0.850921 0.188934 +v 1.14193 2.80417 1.13523 +vn 0.545959 0.773 0.323109 +v 1.13756 2.829 1.07775 +vn 0.534709 0.798883 0.275449 +v 1.12417 2.83464 1.08658 +vn 0.510905 0.811422 0.283851 +v 1.18004 2.83918 0.925776 +vn 0.623028 0.764862 0.163778 +v 1.1991 2.8268 0.906071 +vn 0.661166 0.736953 0.14057 +v 1.19786 2.81135 0.977924 +vn 0.66311 0.723985 0.190083 +v 1.22148 2.80083 0.928876 +vn 0.697631 0.698505 0.159378 +v 1.18516 2.80629 1.03653 +vn 0.635626 0.736754 0.230595 +v 1.20273 2.79017 1.03644 +vn 0.684383 0.695467 0.218963 +v 1.22995 2.76164 1.03607 +vn 0.723994 0.6551 0.216047 +v 1.18354 2.85842 0.789012 +vn 0.617204 0.781682 0.089619 +v 1.17435 2.87432 0.571909 +vn 0.564834 0.82489 -0.0227758 +v 1.1863 2.86583 0.65507 +vn 0.608673 0.793068 0.023663 +v 1.2482 2.80432 0.732542 +vn 0.722183 0.688219 0.0693354 +v 1.22617 2.81902 0.801142 +vn 0.693232 0.714205 0.0966477 +v 1.246 2.79878 0.80096 +vn 0.729872 0.67688 0.0954986 +v 1.25592 2.8045 0.585532 +vn 0.713195 0.700944 0.00557786 +v 1.23376 2.8247 0.658385 +vn 0.688429 0.724469 0.0347846 +v 1.25449 2.80399 0.658412 +vn 0.72437 0.688389 0.0375284 +v 1.44222 1.95646 1.37488 +vn 0.89997 -0.0200758 0.43549 +v 1.42431 1.90401 1.40468 +vn 0.873231 -0.0719339 0.481967 +v 1.44133 1.90104 1.3718 +vn 0.897652 -0.0687734 0.435306 +v 1.42356 2.01345 1.41083 +vn 0.876304 0.0320301 0.480693 +v 1.44076 2.01145 1.37801 +vn 0.899534 0.0309058 0.435756 +v 1.47445 1.95666 1.29926 +vn 0.933083 -0.0175759 0.359231 +v 1.45833 1.89913 1.33331 +vn 0.919291 -0.0665247 0.387917 +v 1.47781 1.90219 1.28431 +vn 0.937893 -0.062706 0.341211 +v 1.47032 2.06815 1.30044 +vn 0.927738 0.0834095 0.363792 +v 1.45837 2.01044 1.33873 +vn 0.919708 0.03027 0.391433 +v 1.47842 2.01491 1.28813 +vn 0.937131 0.0314939 0.347555 +v 1.40436 1.85065 1.42783 +vn 0.840039 -0.128301 0.527137 +v 1.40776 1.9078 1.43381 +vn 0.846895 -0.071052 0.526992 +v 1.39187 1.90291 1.457 +vn 0.81901 -0.0811599 0.568011 +v 1.37448 1.85331 1.47134 +vn 0.787938 -0.137721 0.600155 +v 1.3768 1.89923 1.47726 +vn 0.789529 -0.0871347 0.607496 +v 1.36315 1.89572 1.49351 +vn 0.765018 -0.0944118 0.637051 +v 1.40885 1.96284 1.4365 +vn 0.851066 -0.0219829 0.524598 +v 1.40694 2.01641 1.43948 +vn 0.848124 0.036557 0.528535 +v 1.39183 2.01018 1.46235 +vn 0.81916 0.0264402 0.572955 +v 1.37851 1.95209 1.48001 +vn 0.796754 -0.0330261 0.603401 +v 1.37751 2.00543 1.48215 +vn 0.79167 0.0214752 0.610572 +v 1.36428 2.00291 1.49848 +vn 0.768351 0.0199938 0.639716 +v 1.36373 1.74952 1.45242 +vn 0.76383 -0.243224 0.597834 +v 1.38368 1.79612 1.44306 +vn 0.797978 -0.187398 0.572812 +v 1.36584 1.80373 1.46927 +vn 0.769845 -0.185706 0.610616 +v 1.34211 1.63845 1.42365 +vn 0.717585 -0.35658 0.598266 +v 1.36889 1.69147 1.41938 +vn 0.760754 -0.292969 0.579156 +v 1.3502 1.69805 1.44633 +vn 0.736684 -0.295321 0.608344 +v 1.35135 1.78346 1.4802 +vn 0.744753 -0.217297 0.630972 +v 1.33313 1.67772 1.45597 +vn 0.710225 -0.32713 0.623351 +v 1.39984 1.79457 1.41911 +vn 0.82663 -0.179973 0.533191 +v 1.39369 1.74153 1.40773 +vn 0.814029 -0.229806 0.533428 +v 1.41683 1.79381 1.39061 +vn 0.856013 -0.169588 0.488346 +v 1.43391 1.792 1.3584 +vn 0.883955 -0.159845 0.4394 +v 1.42755 1.73867 1.34813 +vn 0.872226 -0.206223 0.443501 +v 1.45047 1.78908 1.3208 +vn 0.908558 -0.153444 0.388557 +v 1.38596 1.69072 1.39577 +vn 0.792342 -0.279182 0.54245 +v 1.378 1.64383 1.38051 +vn 0.775209 -0.329054 0.539236 +v 1.40307 1.68966 1.36828 +vn 0.826555 -0.265276 0.496422 +v 1.41997 1.68725 1.33728 +vn 0.857838 -0.252145 0.447813 +v 1.4108 1.6374 1.32318 +vn 0.83965 -0.302373 0.451175 +v 1.4363 1.68326 1.30061 +vn 0.886517 -0.241945 0.394399 +v 1.06479 1.67092 -1.58049 +vn 0.636623 -0.299115 -0.710803 +v 1.03485 1.67826 -1.61139 +vn 0.667664 -0.288034 -0.686484 +v 1.0736 1.7522 -1.59953 +vn 0.663469 -0.182916 -0.7255 +v 1.04257 1.76668 -1.63335 +vn 0.702627 -0.164094 -0.692379 +v 1.0736 1.83924 -1.61387 +vn 0.701007 -0.0515771 -0.711287 +v 0.986475 1.6789 -1.65922 +vn 0.670618 -0.29856 -0.679068 +v 1.01747 1.72235 -1.64579 +vn 0.688982 -0.237044 -0.684919 +v 0.99832 1.77013 -1.67977 +vn 0.711619 -0.179949 -0.67913 +v 1.04151 1.84752 -1.64782 +vn 0.730695 -0.0583704 -0.680205 +v 1.08711 1.68654 -1.56739 +vn 0.623314 -0.272925 -0.732797 +v 1.09815 1.75159 -1.57792 +vn 0.648555 -0.180178 -0.739535 +v 1.11176 1.69565 -1.54969 +vn 0.64113 -0.257183 -0.723056 +v 1.09796 1.82098 -1.58972 +vn 0.665835 -0.0785593 -0.741951 +v 1.11954 1.77036 -1.56334 +vn 0.661166 -0.144519 -0.736189 +v 1.07221 1.61234 -1.54654 +vn 0.599998 -0.379287 -0.704375 +v 1.04748 1.6054 -1.56389 +vn 0.612217 -0.387099 -0.689452 +v 1.05213 1.5408 -1.51916 +vn 0.573038 -0.478708 -0.665181 +v 1.09783 1.62205 -1.53001 +vn 0.613918 -0.362423 -0.701252 +v 1.07865 1.55086 -1.50365 +vn 0.586813 -0.467827 -0.660899 +v 1.01642 1.59217 -1.58499 +vn 0.635573 -0.400555 -0.660002 +v 1.00622 1.63684 -1.61982 +vn 0.657443 -0.347481 -0.6686 +v 1.02693 1.53252 -1.53495 +vn 0.586639 -0.484784 -0.648722 +v 0.996652 1.52126 -1.55469 +vn 0.60444 -0.496878 -0.622707 +v 0.988242 1.55698 -1.58947 +vn 0.62289 -0.446828 -0.642147 +v 1.11171 2.50554 -0.817437 +vn 0.466102 0.86719 -0.175298 +v 1.1182 2.48642 -0.896687 +vn 0.501134 0.84808 -0.172118 +v 1.10024 2.49552 -0.902321 +vn 0.484239 0.859037 -0.166036 +v 1.13027 2.53523 -0.646413 +vn 0.4208 0.876028 -0.235588 +v 1.13926 2.51107 -0.726046 +vn 0.443544 0.871324 -0.209911 +v 1.12184 2.51841 -0.731729 +vn 0.433153 0.878181 -0.202919 +v 1.08085 2.51965 -0.827618 +vn 0.4871 0.857874 -0.163661 +v 1.08361 2.50366 -0.907977 +vn 0.481501 0.862268 -0.157004 +v 1.06906 2.51093 -0.913176 +vn 0.501044 0.851413 -0.155083 +v 1.10022 2.54673 -0.655557 +vn 0.440384 0.868913 -0.225946 +v 1.10551 2.52513 -0.736735 +vn 0.428622 0.882394 -0.19407 +v 1.09132 2.53111 -0.741325 +vn 0.447921 0.873357 -0.191348 +v 1.13794 2.47548 -0.891024 +vn 0.5292 0.828547 -0.182915 +v 1.15077 2.48718 -0.802143 +vn 0.509247 0.838517 -0.193795 +v 1.15831 2.46339 -0.885248 +vn 0.554765 0.808703 -0.19554 +v 1.17636 2.45361 -0.87252 +vn 0.584951 0.787341 -0.194748 +v 1.19859 2.45704 -0.793737 +vn 0.590026 0.778755 -0.213098 +v 1.19919 2.43186 -0.886039 +vn 0.637853 0.742075 -0.206079 +v 1.15476 2.50626 -0.712579 +vn 0.468272 0.856879 -0.21559 +v 1.16899 2.52024 -0.630724 +vn 0.470943 0.846293 -0.249 +v 1.17659 2.49009 -0.725962 +vn 0.520919 0.826071 -0.215056 +v 1.20166 2.47032 -0.737764 +vn 0.562792 0.797069 -0.218967 +v 1.22975 2.45354 -0.721839 +vn 0.608296 0.760149 -0.228363 +v 1.14579 2.4196 -1.0939 +vn 0.646591 0.728124 -0.227496 +v 1.13495 2.44362 -1.03988 +vn 0.593175 0.779113 -0.202795 +v 1.1518 2.43369 -1.02694 +vn 0.619744 0.759372 -0.198172 +v 1.11731 2.42005 -1.17159 +vn 0.633039 0.730724 -0.255547 +v 1.1343 2.40961 -1.15718 +vn 0.667082 0.704391 -0.242559 +v 1.18731 2.38392 -1.07941 +vn 0.706637 0.663196 -0.246648 +v 1.1729 2.41273 -1.03608 +vn 0.667095 0.713389 -0.214618 +v 1.2021 2.39202 -1.01005 +vn 0.698371 0.682466 -0.215682 +v 1.16883 2.37297 -1.15974 +vn 0.716865 0.643052 -0.269423 +v 1.11522 2.45596 -1.04834 +vn 0.569739 0.798907 -0.192732 +v 1.10544 2.44508 -1.11963 +vn 0.590363 0.778634 -0.212606 +v 1.09576 2.46748 -1.05647 +vn 0.545887 0.817151 -0.185124 +v 1.07762 2.47762 -1.06378 +vn 0.533602 0.826195 -0.18075 +v 1.068 2.46692 -1.13781 +vn 0.560933 0.802018 -0.205232 +v 1.06069 2.48694 -1.07068 +vn 0.533742 0.827632 -0.173622 +v 1.09787 2.43162 -1.18461 +vn 0.607156 0.752518 -0.255103 +v 1.09113 2.414 -1.24611 +vn 0.63632 0.708441 -0.3053 +v 1.07842 2.44285 -1.19648 +vn 0.584699 0.770376 -0.254261 +v 1.06009 2.45332 -1.2059 +vn 0.574967 0.778185 -0.252669 +v 1.04288 2.46322 -1.2142 +vn 0.574451 0.78012 -0.247829 +v 1.22977 2.65282 1.26664 +vn 0.680522 0.604179 0.414557 +v 1.21363 2.69182 1.23413 +vn 0.666866 0.635753 0.388726 +v 1.19919 2.69849 1.24635 +vn 0.625494 0.656123 0.422208 +v 1.19023 2.68646 1.27677 +vn 0.612528 0.643665 0.458807 +v 1.1689 2.73335 1.23392 +vn 0.585744 0.696288 0.414834 +v 1.16745 2.70773 1.27559 +vn 0.580113 0.672791 0.459153 +v 1.19537 2.72898 1.20044 +vn 0.643916 0.674958 0.360284 +v 1.18992 2.75621 1.15654 +vn 0.647735 0.689438 0.324213 +v 1.17004 2.77035 1.16342 +vn 0.593179 0.728562 0.342544 +v 1.16014 2.76692 1.18629 +vn 0.57601 0.726244 0.375208 +v 1.14129 2.77707 1.19419 +vn 0.54645 0.745409 0.381782 +v 1.26877 2.56169 1.3226 +vn 0.714545 0.531991 0.454324 +v 1.25082 2.60784 1.29479 +vn 0.702972 0.564237 0.432975 +v 1.23655 2.61286 1.30998 +vn 0.668179 0.576872 0.469846 +v 1.27603 2.51403 1.36328 +vn 0.702717 0.499653 0.506493 +v 1.26149 2.51683 1.37981 +vn 0.671208 0.504356 0.543235 +v 1.21686 2.57151 1.37888 +vn 0.616848 0.548723 0.564271 +v 1.21038 2.61218 1.34453 +vn 0.616435 0.582126 0.530224 +v 1.19698 2.61885 1.35213 +vn 0.59581 0.591142 0.543655 +v 1.25685 2.46749 1.42604 +vn 0.646351 0.467511 0.603045 +v 1.25228 2.51336 1.39354 +vn 0.644762 0.49942 0.578672 +v 1.23637 2.52277 1.40258 +vn 0.628256 0.510705 0.586919 +v 1.2665 2.60539 1.27064 +vn 0.730914 0.556851 0.394566 +v 1.26276 2.64355 1.21836 +vn 0.73824 0.583555 0.338327 +v 1.28232 2.60378 1.24195 +vn 0.757051 0.549579 0.353322 +v 1.29778 2.6029 1.20703 +vn 0.77918 0.543632 0.311997 +v 1.29225 2.5096 1.34418 +vn 0.734331 0.492195 0.467441 +v 1.30674 2.51201 1.31682 +vn 0.761299 0.491668 0.422714 +v 1.30222 2.55944 1.26451 +vn 0.771164 0.518717 0.369106 +v 1.32217 2.51325 1.28589 +vn 0.786674 0.487212 0.379167 +v 1.33835 2.51302 1.24939 +vn 0.809043 0.482032 0.336296 +v 1.22892 2.68697 1.21373 +vn 0.701776 0.622453 0.3465 +v 1.19837 2.75922 1.13153 +vn 0.673147 0.682271 0.285271 +v 1.28677 2.64753 1.15009 +vn 0.767899 0.579389 0.273201 +v 1.25081 2.67616 1.18538 +vn 0.73742 0.604919 0.300474 +v 1.22781 2.71724 1.15593 +vn 0.712484 0.637741 0.292663 +v 1.25842 2.70938 1.09045 +vn 0.743425 0.621761 0.246442 +v 1.2047 2.77169 1.08365 +vn 0.683356 0.684077 0.255076 +v 1.17382 2.83839 0.276495 +vn 0.513313 0.839267 -0.179277 +v 1.17517 2.82142 0.205837 +vn 0.501315 0.839535 -0.209438 +v 1.15948 2.82775 0.196515 +vn 0.45338 0.862418 -0.225129 +v 1.14043 2.85646 0.276178 +vn 0.438907 0.8775 -0.193272 +v 1.14179 2.83915 0.206436 +vn 0.429318 0.875344 -0.222395 +v 1.12756 2.84614 0.207567 +vn 0.404171 0.885486 -0.229259 +v 1.17351 2.80099 0.128564 +vn 0.488539 0.83729 -0.245508 +v 1.17524 2.77824 0.057978 +vn 0.47551 0.836292 -0.272956 +v 1.15938 2.78353 0.048593 +vn 0.430719 0.854557 -0.290197 +v 1.13908 2.81809 0.126221 +vn 0.416254 0.870904 -0.261263 +v 1.14472 2.79644 0.06591 +vn 0.412467 0.867 -0.279609 +v 1.12786 2.7979 0.047443 +vn 0.380483 0.874167 -0.301769 +v 1.17651 2.86144 0.423184 +vn 0.542411 0.833716 -0.103479 +v 1.1756 2.85226 0.353695 +vn 0.526088 0.839365 -0.136738 +v 1.16046 2.85972 0.345375 +vn 0.47878 0.864723 -0.151734 +v 1.17017 2.87297 0.494133 +vn 0.539157 0.838943 -0.0740517 +v 1.15772 2.88146 0.504735 +vn 0.505531 0.860668 -0.060735 +v 1.14367 2.88181 0.432629 +vn 0.469098 0.876077 -0.11152 +v 1.14341 2.87066 0.356813 +vn 0.454442 0.8786 -0.146778 +v 1.12968 2.8779 0.359356 +vn 0.426261 0.89166 -0.152463 +v 1.14211 2.89452 0.584143 +vn 0.490301 0.871111 -0.0277439 +v 1.14329 2.88976 0.508349 +vn 0.475269 0.87734 -0.0662837 +v 1.12992 2.89698 0.511459 +vn 0.447886 0.891339 -0.0700985 +v 1.19472 2.83929 0.353421 +vn 0.572928 0.808919 -0.131919 +v 1.21691 2.80963 0.281685 +vn 0.602745 0.782637 -0.155493 +v 1.2157 2.82367 0.353157 +vn 0.615985 0.778187 -0.122426 +v 1.23915 2.80395 0.353757 +vn 0.654982 0.747544 -0.110348 +v 1.19024 2.86016 0.506487 +vn 0.589422 0.806171 -0.0516648 +v 1.20849 2.84441 0.482386 +vn 0.622886 0.779447 -0.0668991 +v 1.21279 2.84442 0.551331 +vn 0.644844 0.76413 -0.0168016 +v 1.23619 2.82174 0.499645 +vn 0.672041 0.739308 -0.0422448 +v 1.19531 2.80884 0.207509 +vn 0.548103 0.812086 -0.200247 +v 1.17611 2.75197 -0.015468 +vn 0.468914 0.829935 -0.302203 +v 1.19594 2.76626 0.060132 +vn 0.521229 0.812156 -0.26215 +v 1.21829 2.77351 0.13553 +vn 0.57798 0.78599 -0.219451 +v 1.21737 2.79362 0.208948 +vn 0.590354 0.784912 -0.188135 +v 1.24163 2.77446 0.210167 +vn 0.630785 0.755783 -0.175794 +v 1.21997 2.7255 -0.012093 +vn 0.552511 0.786156 -0.276929 +v 1.21862 2.7516 0.061832 +vn 0.56386 0.787294 -0.24946 +v 1.24393 2.73287 0.063841 +vn 0.605811 0.760322 -0.234316 +v 0.910302 1.27114 1.52203 +vn 0.47855 -0.71538 0.509137 +v 0.937324 1.24236 1.45204 +vn 0.475706 -0.746126 0.465832 +v 0.964536 1.28891 1.49382 +vn 0.507784 -0.697944 0.505005 +v 1.03669 1.35761 1.50654 +vn 0.561785 -0.626944 0.539757 +v 1.01001 1.30973 1.47511 +vn 0.535142 -0.676357 0.506128 +v 1.05496 1.32113 1.44188 +vn 0.546426 -0.666814 0.506732 +v 0.890032 1.19288 1.41475 +vn 0.431333 -0.789703 0.436258 +v 0.943231 1.20938 1.38993 +vn 0.459149 -0.772165 0.439253 +v 0.985176 1.21896 1.362 +vn 0.475286 -0.763172 0.437804 +v 0.992068 1.19023 1.30166 +vn 0.463233 -0.786067 0.409283 +v 1.03217 1.23982 1.34589 +vn 0.49439 -0.745739 0.4466 +v 0.98096 1.33483 1.53631 +vn 0.533392 -0.647897 0.543803 +v 0.995991 1.383 1.57535 +vn 0.552629 -0.600432 0.577998 +v 0.941341 1.36523 1.60756 +vn 0.524921 -0.615286 0.588116 +v 1.01095 1.43376 1.61031 +vn 0.570329 -0.547962 0.611933 +v 1.02603 1.48725 1.64087 +vn 0.586116 -0.492903 0.643052 +v 0.970551 1.4709 1.67734 +vn 0.558448 -0.50431 0.65864 +v 1.05998 1.45004 1.5776 +vn 0.593344 -0.535234 0.601222 +v 1.04082 1.4039 1.55274 +vn 0.57617 -0.582734 0.573105 +v 1.083 1.41361 1.51923 +vn 0.589082 -0.57752 0.565202 +v 1.10326 1.46533 1.54751 +vn 0.608364 -0.525674 0.594609 +v 1.11905 1.51794 1.57479 +vn 0.623072 -0.473888 0.622263 +v 1.07562 1.50299 1.60624 +vn 0.60772 -0.482694 0.630621 +v 0.895699 1.39954 1.67973 +vn 0.511466 -0.575562 0.638068 +v 0.881483 1.34776 1.64067 +vn 0.492508 -0.63165 0.598711 +v 0.815318 1.32744 1.67115 +vn 0.45663 -0.654055 0.603076 +v 0.789495 1.34809 1.71113 +vn 0.441594 -0.62869 0.640113 +v 0.747721 1.31568 1.70588 +vn 0.402084 -0.669546 0.624529 +v 0.922546 1.51257 1.74516 +vn 0.538806 -0.4538 0.709757 +v 0.909579 1.45452 1.71453 +vn 0.526935 -0.515827 0.675472 +v 0.843155 1.43566 1.7497 +vn 0.49372 -0.530538 0.689035 +v 0.815287 1.46015 1.78658 +vn 0.471729 -0.501142 0.725485 +v 0.773192 1.42366 1.78677 +vn 0.4384 -0.54031 0.718242 +v 0.866587 1.29863 1.59707 +vn 0.468193 -0.68519 0.557952 +v 0.850219 1.25181 1.54902 +vn 0.442648 -0.734956 0.513715 +v 0.822244 1.20624 1.50259 +vn 0.410298 -0.784381 0.46519 +v 0.770273 1.15971 1.46265 +vn 0.358944 -0.829473 0.427941 +v 0.832111 1.17622 1.43948 +vn 0.397835 -0.808598 0.43347 +v 0.715001 1.26266 1.66521 +vn 0.36717 -0.729245 0.577398 +v 0.653942 1.20815 1.62878 +vn 0.31721 -0.780086 0.539299 +v 0.724167 1.22166 1.60314 +vn 0.36776 -0.765793 0.527555 +v 0.712192 1.18087 1.54694 +vn 0.339439 -0.81463 0.470276 +v 0.638044 1.13455 1.51141 +vn 0.283322 -0.858353 0.427736 +v 0.705934 1.14532 1.48541 +vn 0.316144 -0.846813 0.42774 +v 0.340333 1.17365 1.7021 +vn 0.132121 -0.820134 0.556709 +v 0.422244 1.17938 1.68825 +vn 0.172195 -0.813915 0.55488 +v 0.398778 1.22142 1.75251 +vn 0.167683 -0.771659 0.613534 +v 0.502083 1.18692 1.67141 +vn 0.216344 -0.805538 0.551638 +v 0.57944 1.19646 1.6516 +vn 0.264774 -0.79442 0.546618 +v 0.560267 1.23709 1.7157 +vn 0.260987 -0.755644 0.600739 +v 0.331651 1.09996 1.57185 +vn 0.107811 -0.901248 0.419677 +v 0.411504 1.10541 1.55987 +vn 0.142447 -0.895291 0.422094 +v 0.373914 1.1192 1.59992 +vn 0.130673 -0.883529 0.449779 +v 0.489407 1.11258 1.54531 +vn 0.181298 -0.887013 0.424663 +v 0.564978 1.12166 1.52821 +vn 0.225656 -0.875752 0.426775 +v 0.5304 1.13386 1.56971 +vn 0.210989 -0.866748 0.451919 +v 0.435657 1.27249 1.80135 +vn 0.194838 -0.717195 0.669081 +v 0.350896 1.26683 1.81696 +vn 0.150631 -0.722171 0.675114 +v 0.443749 1.32629 1.85077 +vn 0.207023 -0.643224 0.73716 +v 0.451647 1.38507 1.8952 +vn 0.21662 -0.570115 0.792492 +v 0.404584 1.35231 1.88262 +vn 0.187716 -0.609204 0.770476 +v 0.598001 1.28933 1.75975 +vn 0.294964 -0.700917 0.649393 +v 0.518168 1.2799 1.78225 +vn 0.242925 -0.710228 0.66073 +v 0.608725 1.34248 1.80654 +vn 0.310945 -0.629099 0.712424 +v 0.619191 1.40013 1.84848 +vn 0.323393 -0.559467 0.76316 +v 0.573582 1.3661 1.84085 +vn 0.289405 -0.598513 0.747012 +v 0.310225 1.29087 1.84953 +vn 0.13319 -0.685527 0.715761 +v 0.263884 1.26108 1.82744 +vn 0.110549 -0.726043 0.678705 +v 0.174046 1.2473 1.82469 +vn 0.0744394 -0.735524 0.673397 +v 0.088666 1.25745 1.84202 +vn 0.0336413 -0.722011 0.691063 +v 0.128823 1.22787 1.80695 +vn 0.0503841 -0.759095 0.649027 +v 0.364048 1.38017 1.91278 +vn 0.168602 -0.573336 0.801785 +v 0.322375 1.40969 1.94093 +vn 0.148976 -0.536335 0.830753 +v 0.274101 1.3769 1.92668 +vn 0.120476 -0.57475 0.809412 +v 0.182932 1.37102 1.93385 +vn 0.082149 -0.585212 0.806709 +v 0.150246 1.40304 1.95884 +vn 0.0617115 -0.543128 0.837379 +v 0.094233 1.3728 1.94153 +vn 0.037032 -0.579028 0.814466 +v 0.230195 1.21027 1.77358 +vn 0.0933199 -0.782765 0.615281 +v 0.172823 1.16604 1.71968 +vn 0.0640185 -0.831337 0.552069 +v 0.25681 1.16945 1.71283 +vn 0.0963067 -0.825352 0.556345 +v 0.253303 1.13034 1.64896 +vn 0.0856636 -0.872184 0.481619 +v 0.210325 1.11117 1.61939 +vn 0.0660122 -0.892031 0.447128 +v 0.250241 1.09605 1.58124 +vn 0.0768494 -0.905371 0.417609 +v 0.084388 1.21109 1.78916 +vn 0.0316367 -0.782094 0.622357 +v 0.043671 1.1925 1.76658 +vn 0.0164034 -0.802924 0.595856 +v 0.08707 1.16721 1.72873 +vn 0.033242 -0.831006 0.555269 +v 0.085358 1.12782 1.66378 +vn 0.0280354 -0.874977 0.483352 +v 0.042486 1.11318 1.63812 +vn 0.0140047 -0.890012 0.455722 +v 0.084226 1.09348 1.59543 +vn 0.0250601 -0.908175 0.417839 +v 1.01464 1.71272 1.76946 +vn 0.594158 -0.250651 0.764297 +v 1.06277 1.66176 1.71114 +vn 0.615152 -0.31021 0.724816 +v 1.07142 1.7235 1.72727 +vn 0.61995 -0.246903 0.744782 +v 1.12205 1.73403 1.68721 +vn 0.64137 -0.243283 0.727639 +v 1.15731 1.68576 1.63659 +vn 0.651423 -0.300408 0.696709 +v 1.16625 1.74433 1.65073 +vn 0.656007 -0.240281 0.715486 +v 0.995987 1.58749 1.73114 +vn 0.582288 -0.379669 0.718882 +v 1.03994 1.54336 1.66794 +vn 0.598609 -0.434045 0.673255 +v 1.05225 1.60163 1.69135 +vn 0.608193 -0.372707 0.70085 +v 1.10248 1.61529 1.65358 +vn 0.629591 -0.366304 0.685154 +v 1.13357 1.57236 1.59864 +vn 0.635346 -0.417893 0.649385 +v 1.14639 1.6284 1.61923 +vn 0.644466 -0.360827 0.674142 +v 1.07815 1.78655 1.73971 +vn 0.623431 -0.183323 0.760083 +v 1.08288 1.85064 1.74844 +vn 0.626013 -0.11825 0.770795 +v 1.02785 1.84192 1.79048 +vn 0.60245 -0.127317 0.787937 +v 1.0858 1.91547 1.75324 +vn 0.62611 -0.0532557 0.777914 +v 1.08968 1.98054 1.75192 +vn 0.625711 0.0109534 0.779978 +v 1.0312 1.97647 1.79749 +vn 0.601241 0.013742 0.798949 +v 1.17316 1.80383 1.66162 +vn 0.658953 -0.177124 0.731032 +v 1.17797 1.86413 1.66925 +vn 0.660135 -0.114813 0.74232 +v 1.13368 1.85731 1.70703 +vn 0.645709 -0.116323 0.754672 +v 1.18081 1.92496 1.67345 +vn 0.660131 -0.0502476 0.749468 +v 1.18381 1.98602 1.6723 +vn 0.659635 0.01286 0.751476 +v 1.14002 1.98301 1.71027 +vn 0.645865 0.0117423 0.763361 +v 0.997381 1.8741 1.81764 +vn 0.58388 -0.0901702 0.806817 +v 0.964399 1.83631 1.8359 +vn 0.56659 -0.12596 0.814316 +v 0.894509 1.83019 1.88093 +vn 0.521393 -0.121415 0.844635 +v 0.845791 1.89694 1.91711 +vn 0.495189 -0.0604477 0.86668 +v 0.822071 1.82214 1.92197 +vn 0.476744 -0.126688 0.869865 +v 0.984711 2.04587 1.82735 +vn 0.574521 0.0757224 0.814979 +v 0.967443 1.97553 1.84314 +vn 0.560931 0.0169906 0.827688 +v 0.900416 1.95335 1.88695 +vn 0.526572 -0.00712814 0.850101 +v 0.825633 1.97256 1.93028 +vn 0.477249 0.00823242 0.87873 +v 0.958494 1.76567 1.82616 +vn 0.570069 -0.19199 0.79885 +v 0.952002 1.69867 1.81181 +vn 0.56706 -0.257755 0.782308 +v 0.943775 1.63336 1.79326 +vn 0.562343 -0.323952 0.760806 +v 0.935921 1.57179 1.76973 +vn 0.552355 -0.393606 0.734832 +v 0.820542 1.75382 1.91015 +vn 0.474604 -0.197003 0.85787 +v 0.811169 1.68331 1.89638 +vn 0.466074 -0.260528 0.845518 +v 0.851927 1.72192 1.88418 +vn 0.496996 -0.227822 0.837312 +v 0.804051 1.6139 1.87566 +vn 0.464035 -0.331524 0.82144 +v 0.795149 1.54729 1.85058 +vn 0.458341 -0.401095 0.793125 +v 0.836588 1.58582 1.84439 +vn 0.488109 -0.364114 0.793203 +v 0.389081 1.66339 2.04046 +vn 0.187299 -0.264452 0.946036 +v 0.479051 1.66351 2.02016 +vn 0.240558 -0.267459 0.933058 +v 0.433703 1.70262 2.04127 +vn 0.211699 -0.229872 0.949917 +v 0.567499 1.64795 1.99032 +vn 0.288344 -0.282981 0.914757 +v 0.609199 1.62227 1.96796 +vn 0.321098 -0.307852 0.895613 +v 0.652073 1.66576 1.96572 +vn 0.353329 -0.267981 0.896295 +v 0.379733 1.51381 1.98723 +vn 0.181494 -0.417187 0.890514 +v 0.418585 1.48035 1.96219 +vn 0.201566 -0.454819 0.867474 +v 0.469743 1.51699 1.96783 +vn 0.231013 -0.417903 0.87863 +v 0.553819 1.51879 1.94396 +vn 0.286344 -0.419587 0.861367 +v 0.592217 1.49078 1.91625 +vn 0.309115 -0.451191 0.837183 +v 0.637384 1.52846 1.91813 +vn 0.338601 -0.409674 0.847063 +v 0.479377 1.74175 2.03928 +vn 0.234664 -0.19556 0.952202 +v 0.528997 1.77707 2.0328 +vn 0.269001 -0.157415 0.950189 +v 0.483018 1.82299 2.05189 +vn 0.241147 -0.124847 0.962425 +v 0.484415 1.90498 2.05917 +vn 0.242761 -0.0548091 0.968537 +v 0.530459 1.94405 2.04846 +vn 0.270556 -0.0205939 0.962484 +v 0.484813 1.98748 2.06074 +vn 0.244847 0.0154587 0.969439 +v 0.680744 1.74206 1.97435 +vn 0.375335 -0.19984 0.90509 +v 0.744922 1.80448 1.95831 +vn 0.411714 -0.14218 0.900154 +v 0.661331 1.82006 1.99569 +vn 0.356759 -0.12891 0.92526 +v 0.663095 1.89824 2.00285 +vn 0.354523 -0.0586287 0.933208 +v 0.706524 1.93576 1.98708 +vn 0.388219 -0.0214742 0.921317 +v 0.662738 1.97812 2.00503 +vn 0.357667 0.0113212 0.93378 +v 0.389804 1.82538 2.07281 +vn 0.188746 -0.12314 0.974275 +v 0.294409 1.82796 2.08907 +vn 0.139157 -0.121614 0.982774 +v 0.341553 1.78511 2.0757 +vn 0.162572 -0.157343 0.974071 +v 0.197312 1.8305 2.1007 +vn 0.092097 -0.120238 0.988464 +v 0.101024 1.83552 2.10813 +vn 0.05226 -0.116842 0.991775 +v 0.147982 1.78961 2.099 +vn 0.0693828 -0.15393 0.985643 +v 0.391296 1.99264 2.08159 +vn 0.192833 0.0170613 0.981083 +v 0.295483 1.99751 2.09778 +vn 0.142856 0.0185031 0.989571 +v 0.343611 1.95289 2.09027 +vn 0.166426 -0.0174229 0.9859 +v 0.197947 2.00175 2.10933 +vn 0.0949752 0.0197765 0.995283 +v 0.101246 2.00786 2.11624 +vn 0.0540986 0.0230522 0.998269 +v 0.148736 1.96087 2.11349 +vn 0.0715987 -0.0143008 0.997331 +v 0.292966 1.74469 2.07593 +vn 0.137532 -0.192259 0.971659 +v 0.244265 1.70425 2.07347 +vn 0.112663 -0.227841 0.967159 +v 0.294051 1.66317 2.0565 +vn 0.137004 -0.26432 0.954654 +v 0.312336 1.58516 2.02898 +vn 0.146396 -0.339318 0.92921 +v 0.286858 1.50914 2.00133 +vn 0.13427 -0.417405 0.898746 +v 0.345499 1.5489 2.00925 +vn 0.162706 -0.378814 0.911058 +v 0.049245 1.71749 2.09033 +vn 0.0243542 -0.21493 0.976326 +v 0 1.68709 2.08372 +vn -4.97294e-18 -0.242638 0.970117 +v 0.049078 1.67616 2.08054 +vn 0.0238092 -0.252023 0.967428 +v 0.095894 1.58815 2.05165 +vn 0.0440174 -0.335081 0.941161 +v 0.048675 1.55765 2.04194 +vn 0.0231483 -0.365408 0.930559 +v 0.096616 1.51159 2.02065 +vn 0.0476469 -0.415131 0.908513 +v 1.01238 2.24721 1.76332 +vn 0.586229 0.265462 0.765418 +v 1.06666 2.23865 1.72344 +vn 0.608653 0.257369 0.750535 +v 1.05707 2.30268 1.70672 +vn 0.601771 0.311243 0.735527 +v 1.11659 2.23289 1.68385 +vn 0.626829 0.255776 0.735978 +v 1.16015 2.2275 1.64777 +vn 0.639851 0.254927 0.724985 +v 1.14989 2.28787 1.63322 +vn 0.633577 0.306783 0.710256 +v 1.02573 2.11283 1.78835 +vn 0.596147 0.139375 0.790686 +v 1.08402 2.10885 1.7437 +vn 0.619286 0.141636 0.772285 +v 1.07474 2.17388 1.73656 +vn 0.613973 0.200673 0.763392 +v 1.13409 2.10723 1.70265 +vn 0.638878 0.14104 0.756269 +v 1.1777 2.10561 1.66527 +vn 0.652158 0.140453 0.744958 +v 1.16874 2.16662 1.65914 +vn 0.646017 0.198464 0.737072 +v 1.09501 2.35626 1.64955 +vn 0.614184 0.358541 0.703013 +v 1.04591 2.36572 1.68671 +vn 0.595311 0.360927 0.717869 +v 1.03317 2.42728 1.66387 +vn 0.588279 0.407888 0.698252 +v 1.06371 2.46894 1.61106 +vn 0.599644 0.44574 0.664637 +v 1.01965 2.48735 1.63763 +vn 0.581475 0.454036 0.675084 +v 1.17188 2.33362 1.59171 +vn 0.634894 0.348756 0.689405 +v 1.1379 2.34745 1.61575 +vn 0.626634 0.357002 0.692734 +v 1.1242 2.40616 1.59557 +vn 0.619623 0.402972 0.673558 +v 1.14248 2.44811 1.55158 +vn 0.618976 0.440667 0.65014 +v 1.10509 2.4646 1.57575 +vn 0.611417 0.448575 0.651881 +v 0.990799 2.37619 1.72584 +vn 0.572439 0.36401 0.734718 +v 0.929796 2.39088 1.76458 +vn 0.548087 0.370201 0.750034 +v 0.939932 2.32418 1.78751 +vn 0.553141 0.31912 0.769544 +v 0.86437 2.39974 1.80526 +vn 0.505582 0.372699 0.778127 +v 0.793191 2.41222 1.84301 +vn 0.461963 0.376486 0.803025 +v 0.83407 2.3714 1.83727 +vn 0.486584 0.348762 0.801 +v 0.965694 2.50153 1.67337 +vn 0.559052 0.458058 0.691118 +v 0.906357 2.51605 1.71008 +vn 0.531564 0.463225 0.709128 +v 0.920491 2.45439 1.73748 +vn 0.540276 0.421536 0.728292 +v 0.841523 2.53444 1.74491 +vn 0.504026 0.469039 0.725231 +v 0.772861 2.54682 1.78154 +vn 0.457103 0.472409 0.753583 +v 0.813804 2.50663 1.78058 +vn 0.4815 0.446861 0.753972 +v 0.912234 2.2916 1.81946 +vn 0.532792 0.292082 0.794242 +v 0.950288 2.25407 1.80649 +vn 0.554923 0.267388 0.787759 +v 0.956441 2.18386 1.82296 +vn 0.555714 0.204698 0.80578 +v 0.926218 2.15138 1.85084 +vn 0.538774 0.174243 0.824235 +v 0.962296 2.11558 1.83357 +vn 0.562273 0.140005 0.815014 +v 0.801907 2.34193 1.86837 +vn 0.464787 0.324375 0.823865 +v 0.767906 2.31136 1.89827 +vn 0.441191 0.298919 0.846167 +v 0.809436 2.27006 1.8898 +vn 0.467558 0.268845 0.842088 +v 0.815619 2.19694 1.90702 +vn 0.470127 0.209475 0.85738 +v 0.779708 2.16335 1.93356 +vn 0.44516 0.179753 0.877224 +v 0.820363 2.12282 1.91975 +vn 0.472809 0.145356 0.869093 +v 0.383744 2.32001 2.03068 +vn 0.200047 0.282299 0.938237 +v 0.475608 2.31062 2.01132 +vn 0.251245 0.280544 0.926375 +v 0.427998 2.35441 2.00959 +vn 0.226204 0.309898 0.923469 +v 0.564668 2.30046 1.98756 +vn 0.30387 0.278332 0.91115 +v 0.65036 2.29001 1.95936 +vn 0.358363 0.275617 0.89197 +v 0.605199 2.33324 1.96268 +vn 0.330831 0.305618 0.892832 +v 0.389171 2.15897 2.06703 +vn 0.196908 0.157653 0.967664 +v 0.482249 2.15141 2.04675 +vn 0.248645 0.155703 0.955998 +v 0.434836 2.19588 2.05037 +vn 0.223238 0.190062 0.956055 +v 0.572469 2.14355 2.02189 +vn 0.302386 0.153507 0.940743 +v 0.659255 2.13586 1.99241 +vn 0.358597 0.15111 0.921181 +v 0.614679 2.17901 2.00113 +vn 0.330236 0.18542 0.925507 +v 0.471036 2.38767 1.9866 +vn 0.252598 0.336012 0.907354 +v 0.512757 2.41976 1.9618 +vn 0.279 0.361512 0.889645 +v 0.465778 2.46261 1.95782 +vn 0.254376 0.387321 0.886158 +v 0.459954 2.53515 1.92537 +vn 0.256889 0.434918 0.863049 +v 0.500064 2.56409 1.89752 +vn 0.283489 0.457549 0.842783 +v 0.453671 2.60499 1.88972 +vn 0.260455 0.479257 0.838139 +v 0.644206 2.36495 1.93602 +vn 0.35809 0.331561 0.872834 +v 0.681599 2.39556 1.90768 +vn 0.384964 0.356553 0.851277 +v 0.637106 2.43802 1.9086 +vn 0.358062 0.383775 0.851181 +v 0.62921 2.50892 1.87744 +vn 0.358515 0.432696 0.827189 +v 0.664875 2.5362 1.84634 +vn 0.384437 0.454737 0.803382 +v 0.620659 2.57732 1.84289 +vn 0.3597 0.478709 0.800908 +v 0.37575 2.47336 1.97623 +vn 0.203865 0.387992 0.898833 +v 0.28354 2.4825 1.99052 +vn 0.153623 0.388182 0.908688 +v 0.33182 2.44055 1.99907 +vn 0.17757 0.363705 0.914433 +v 0.189699 2.48968 2.00067 +vn 0.103466 0.388152 0.915769 +v 0.094865 2.49769 2.00538 +vn 0.0532499 0.390287 0.919152 +v 0.14321 2.4549 2.01943 +vn 0.0777913 0.364732 0.927857 +v 0.365944 2.61675 1.90749 +vn 0.210708 0.477937 0.852747 +v 0.276099 2.62662 1.92141 +vn 0.160265 0.476116 0.864655 +v 0.323522 2.58707 1.93327 +vn 0.18354 0.456268 0.870708 +v 0.184673 2.63425 1.93139 +vn 0.108952 0.47427 0.873612 +v 0.092304 2.64226 1.93581 +vn 0.0565233 0.474749 0.878304 +v 0.139541 2.6024 1.95305 +vn 0.0817812 0.45401 0.887236 +v 0.286794 2.40647 2.02009 +vn 0.151489 0.338221 0.928794 +v 0.240764 2.37114 2.0392 +vn 0.125664 0.312271 0.941645 +v 0.289635 2.32815 2.04567 +vn 0.149783 0.283652 0.947157 +v 0.291998 2.24782 2.06672 +vn 0.148246 0.2241 0.963225 +v 0.244738 2.21005 2.08148 +vn 0.122668 0.193415 0.973418 +v 0.293805 2.16573 2.08275 +vn 0.14665 0.159306 0.976276 +v 0.096003 2.42131 2.03545 +vn 0.052213 0.341582 0.938401 +v 0.048233 2.39139 2.04799 +vn 0.0271031 0.324966 0.945337 +v 0.097009 2.34254 2.06162 +vn 0.0544854 0.288299 0.955989 +v 0.049101 2.2291 2.09274 +vn 0.0269204 0.204239 0.978551 +v 0 2.19877 2.09927 +vn -4.26929e-06 0.179863 0.983692 +v 0.049268 2.1875 2.1008 +vn 0.0263272 0.171247 0.984876 +v 0.907023 2.72675 1.53173 +vn 0.532556 0.622706 0.573255 +v 0.95734 2.70836 1.50366 +vn 0.550518 0.618349 0.560869 +v 0.94244 2.75708 1.46154 +vn 0.544318 0.654557 0.524664 +v 0.999283 2.68713 1.48495 +vn 0.566674 0.608054 0.556013 +v 1.02594 2.63477 1.51214 +vn 0.578906 0.568804 0.584234 +v 1.04075 2.67706 1.45288 +vn 0.575373 0.608204 0.546841 +v 0.936744 2.6191 1.60891 +vn 0.545386 0.543186 0.63836 +v 0.989042 2.60253 1.57686 +vn 0.566737 0.538214 0.623807 +v 0.973047 2.65678 1.54197 +vn 0.559136 0.57787 0.594502 +v 1.03262 2.58214 1.55384 +vn 0.58487 0.52798 0.615763 +v 1.05932 2.52589 1.57417 +vn 0.596354 0.487777 0.637523 +v 1.07576 2.5744 1.51859 +vn 0.595278 0.528507 0.605248 +v 0.967699 2.78158 1.40142 +vn 0.550067 0.68256 0.481184 +v 0.927013 2.80374 1.41592 +vn 0.540936 0.68775 0.484137 +v 0.903317 2.85258 1.3698 +vn 0.543606 0.712198 0.444147 +v 0.909621 2.88461 1.30568 +vn 0.550528 0.737583 0.391012 +v 0.864032 2.90791 1.32606 +vn 0.552086 0.730136 0.40262 +v 1.02335 2.79939 1.30645 +vn 0.544246 0.720797 0.429241 +v 1.00762 2.7697 1.37202 +vn 0.555006 0.684719 0.472365 +v 1.03971 2.75636 1.35351 +vn 0.555706 0.684513 0.47184 +v 0.950528 2.89609 1.21924 +vn 0.544325 0.769838 0.333256 +v 0.945056 2.87093 1.28149 +vn 0.547776 0.745871 0.37897 +v 0.984175 2.84906 1.26842 +vn 0.541429 0.748579 0.382733 +v 0.878412 2.82438 1.44013 +vn 0.530943 0.685646 0.497985 +v 0.824994 2.84644 1.46572 +vn 0.518571 0.681951 0.515777 +v 0.838849 2.79678 1.515 +vn 0.511771 0.65825 0.552085 +v 0.769002 2.86954 1.4903 +vn 0.503109 0.680909 0.532206 +v 0.708808 2.89216 1.516 +vn 0.479107 0.681332 0.553393 +v 0.74348 2.85509 1.53112 +vn 0.483663 0.668632 0.564803 +v 0.816948 2.9678 1.27978 +vn 0.571169 0.733751 0.367935 +v 0.812977 2.93304 1.35003 +vn 0.544933 0.722151 0.426083 +v 0.756058 2.95039 1.39014 +vn 0.527725 0.709515 0.467006 +v 0.694407 2.99503 1.39273 +vn 0.539566 0.686652 0.487214 +v 0.697744 2.94518 1.45799 +vn 0.502279 0.688883 0.522644 +v 0.791326 2.76551 1.59077 +vn 0.486881 0.628266 0.606819 +v 0.851641 2.7458 1.56113 +vn 0.51074 0.626488 0.588776 +v 0.865233 2.69223 1.60339 +vn 0.514069 0.589084 0.623469 +v 0.816686 2.65351 1.67516 +vn 0.48949 0.554591 0.672925 +v 0.879239 2.63606 1.64209 +vn 0.519576 0.54895 0.654748 +v 0.713358 2.8425 1.57001 +vn 0.466649 0.654324 0.595062 +v 0.685691 2.82472 1.6097 +vn 0.443987 0.642598 0.624455 +v 0.725939 2.78828 1.6178 +vn 0.4627 0.629991 0.623714 +v 0.737323 2.73232 1.66337 +vn 0.460096 0.597425 0.656806 +v 0.708867 2.70979 1.70197 +vn 0.43484 0.579498 0.689272 +v 0.749072 2.6742 1.70534 +vn 0.460332 0.559426 0.689302 +v 0.343953 2.86829 1.74118 +vn 0.243634 0.609386 0.754514 +v 0.426892 2.8554 1.72184 +vn 0.293897 0.617769 0.729374 +v 0.382412 2.89061 1.7092 +vn 0.27543 0.623531 0.731675 +v 0.50739 2.83902 1.70067 +vn 0.337848 0.623564 0.705001 +v 0.58338 2.82235 1.67643 +vn 0.377971 0.625686 0.682389 +v 0.556049 2.88328 1.63462 +vn 0.380111 0.642596 0.665271 +v 0.355087 2.74806 1.82821 +vn 0.223123 0.554176 0.801938 +v 0.440221 2.7355 1.81043 +vn 0.272018 0.558423 0.78369 +v 0.394837 2.7729 1.79853 +vn 0.252398 0.573179 0.77959 +v 0.522777 2.72118 1.78926 +vn 0.319221 0.561521 0.763408 +v 0.602233 2.70547 1.76488 +vn 0.3652 0.562813 0.741532 +v 0.558539 2.7439 1.7561 +vn 0.345636 0.580745 0.737069 +v 0.418543 2.91299 1.67499 +vn 0.306847 0.63529 0.708697 +v 0.49033 2.93932 1.61643 +vn 0.356171 0.646829 0.674355 +v 0.411081 2.96668 1.62928 +vn 0.317706 0.640015 0.699602 +v 0.387369 3.02434 1.58757 +vn 0.323167 0.63801 0.698932 +v 0.400602 3.07829 1.53145 +vn 0.356272 0.632855 0.687433 +v 0.321691 3.07562 1.57029 +vn 0.289839 0.630921 0.719675 +v 0.564913 2.93633 1.57588 +vn 0.410549 0.657296 0.63199 +v 0.561464 2.99151 1.51919 +vn 0.440901 0.661699 0.606433 +v 0.554141 3.04955 1.46055 +vn 0.477329 0.652574 0.588476 +v 0.518653 3.02746 1.51076 +vn 0.425743 0.65305 0.626314 +v 0.333868 2.98027 1.64943 +vn 0.272682 0.636626 0.721354 +v 0.251217 2.99232 1.66662 +vn 0.215669 0.629766 0.746245 +v 0.29432 2.95923 1.68149 +vn 0.237724 0.628964 0.740197 +v 0.167531 3.00027 1.68018 +vn 0.148167 0.62414 0.767135 +v 0.083623 3.00548 1.68816 +vn 0.0688358 0.62263 0.779483 +v 0.126724 2.97587 1.70669 +vn 0.110132 0.619628 0.777131 +v 0.241342 3.10094 1.57721 +vn 0.236555 0.628726 0.740774 +v 0.244994 3.0476 1.62155 +vn 0.226189 0.632084 0.741153 +v 0.16214 3.10806 1.59246 +vn 0.162885 0.630147 0.759199 +v 0.081058 3.11426 1.60036 +vn 0.0771033 0.629706 0.772997 +v 0.121838 3.08515 1.61885 +vn 0.120089 0.629283 0.767842 +v 0.255135 2.9363 1.71209 +vn 0.201777 0.619127 0.758926 +v 0.214757 2.91233 1.741 +vn 0.166824 0.608981 0.775443 +v 0.259402 2.87908 1.75668 +vn 0.190292 0.602191 0.775342 +v 0.263661 2.81997 1.80022 +vn 0.180324 0.578701 0.795354 +v 0.221915 2.79389 1.82729 +vn 0.14932 0.562749 0.81303 +v 0.267891 2.75849 1.84239 +vn 0.172 0.549487 0.817606 +v 0.087231 2.95066 1.73115 +vn 0.0720991 0.613781 0.786177 +v 0.042861 2.93102 1.74945 +vn 0.036786 0.606053 0.794573 +v 0.086605 2.89509 1.77344 +vn 0.0696143 0.594146 0.801339 +v 0.088076 2.83597 1.81592 +vn 0.0657102 0.571503 0.817965 +v 0.04434 2.81311 1.83429 +vn 0.0331861 0.560348 0.827592 +v 0.08952 2.7744 1.85735 +vn 0.0620558 0.543894 0.836856 +v 0.663007 4.1771 -0.24522 +vn 0.658481 -0.42928 -0.61816 +v 0.692193 4.16076 -0.200417 +vn 0.680547 -0.445961 -0.581356 +v 0.645755 4.15026 -0.243796 +vn 0.638033 -0.46121 -0.616603 +v 0.620285 4.06245 -0.197214 +vn 0.616949 -0.535007 -0.577184 +v 0.656788 4.04791 -0.141642 +vn 0.643348 -0.546641 -0.535992 +v 0.610635 4.03516 -0.181545 +vn 0.608488 -0.557983 -0.564267 +v 0.83288 4.23904 -0.063855 +vn 0.808053 -0.343728 -0.478436 +v 0.852449 4.22316 -0.016368 +vn 0.824183 -0.359312 -0.43774 +v 0.818717 4.21073 -0.065605 +vn 0.786633 -0.385404 -0.48236 +v 0.791111 4.11836 -0.025668 +vn 0.753983 -0.476018 -0.452677 +v 0.815022 4.10379 0.032954 +vn 0.773022 -0.483896 -0.410221 +v 0.780077 4.08926 -0.012415 +vn 0.741348 -0.503607 -0.443603 +v 0.486676 4.10899 -0.353365 +vn 0.514025 -0.497087 -0.699059 +v 0.431136 4.1019 -0.386536 +vn 0.461225 -0.506114 -0.728779 +v 0.449607 4.12712 -0.391762 +vn 0.482113 -0.47989 -0.732989 +v 0.251016 4.07365 -0.457974 +vn 0.297265 -0.527008 -0.796176 +v 0.189703 4.07139 -0.476561 +vn 0.222975 -0.531003 -0.817507 +v 0.207901 4.09491 -0.486335 +vn 0.247566 -0.507313 -0.825436 +v 0.458868 4.00133 -0.287754 +vn 0.491687 -0.582246 -0.647482 +v 0.404833 3.99175 -0.317839 +vn 0.446807 -0.588733 -0.673615 +v 0.411735 4.01764 -0.335201 +vn 0.45134 -0.568424 -0.687886 +v 0.234597 3.96956 -0.387992 +vn 0.286396 -0.602583 -0.744897 +v 0.176037 3.96433 -0.403768 +vn 0.223555 -0.606117 -0.763312 +v 0.179314 3.98932 -0.422101 +vn 0.225056 -0.587431 -0.777351 +v 0.4991 4.21785 -0.410483 +vn 0.528994 -0.383527 -0.757016 +v 0.455721 4.18254 -0.421086 +vn 0.489645 -0.418895 -0.764706 +v 0.441915 4.20328 -0.440471 +vn 0.473539 -0.397265 -0.786092 +v 0.495661 4.33464 -0.462563 +vn 0.529334 -0.276602 -0.802058 +v 0.439709 4.29426 -0.482529 +vn 0.477349 -0.318436 -0.818985 +v 0.438274 4.32388 -0.494396 +vn 0.477404 -0.290382 -0.829315 +v 0.258785 4.18117 -0.516963 +vn 0.303195 -0.419536 -0.855606 +v 0.211524 4.1497 -0.516521 +vn 0.250451 -0.45102 -0.856654 +v 0.195712 4.17184 -0.532013 +vn 0.227089 -0.427747 -0.874908 +v 0.255888 4.29909 -0.568064 +vn 0.299462 -0.322347 -0.898006 +v 0.193491 4.26371 -0.573216 +vn 0.232131 -0.355792 -0.905278 +v 0.192724 4.29369 -0.584795 +vn 0.231903 -0.33011 -0.915013 +v 0.554679 4.25938 -0.389771 +vn 0.576235 -0.34657 -0.740163 +v 0.555082 4.22639 -0.373399 +vn 0.571997 -0.373627 -0.730221 +v 0.706679 4.27178 -0.253978 +vn 0.705786 -0.321114 -0.631468 +v 0.751507 4.31675 -0.223149 +vn 0.746779 -0.27515 -0.605486 +v 0.751862 4.28376 -0.206964 +vn 0.741103 -0.303794 -0.598728 +v 0.548406 4.37617 -0.439069 +vn 0.578136 -0.231783 -0.782327 +v 0.551132 4.3464 -0.427696 +vn 0.578272 -0.261615 -0.77276 +v 0.702042 4.38745 -0.30634 +vn 0.710709 -0.206531 -0.672487 +v 0.742925 4.43171 -0.273121 +vn 0.750525 -0.152879 -0.642916 +v 0.746578 4.40269 -0.261292 +vn 0.751017 -0.18422 -0.634063 +v 0.226739 3.75796 1.30956 +vn 0.192969 -0.363416 0.911423 +v 0.151867 3.75351 1.32164 +vn 0.128406 -0.343312 0.930402 +v 0.222638 3.71718 1.297 +vn 0.202504 -0.258369 0.944583 +v 0.218982 3.67448 1.28839 +vn 0.21278 -0.133193 0.96798 +v 0.147032 3.67171 1.30207 +vn 0.141533 -0.114643 0.983273 +v 0.217072 3.62948 1.28628 +vn 0.224551 0.00359831 0.974456 +v 0.075984 3.74996 1.32722 +vn 0.0634131 -0.336005 0.939723 +v 0 3.74474 1.32874 +vn -6.80564e-07 -0.315218 0.949019 +v 0.074667 3.71018 1.31591 +vn 0.0672739 -0.22408 0.972246 +v 0.073529 3.66864 1.30861 +vn 0.0708053 -0.0954032 0.992917 +v 0 3.66335 1.31176 +vn -4.99365e-18 -0.07556 0.997141 +v 0.073333 3.6247 1.30802 +vn 0.0761493 0.045866 0.996041 +v 0.429511 3.69389 1.21866 +vn 0.441424 -0.25324 0.860822 +v 0.364582 3.72709 1.25792 +vn 0.350924 -0.301807 0.886434 +v 0.365711 3.67613 1.24307 +vn 0.380611 -0.182536 0.90654 +v 0.541954 3.69674 1.14797 +vn 0.591884 -0.273165 0.758323 +v 0.493717 3.7358 1.19692 +vn 0.505455 -0.335711 0.794867 +v 0.491219 3.68575 1.18032 +vn 0.531741 -0.239837 0.812238 +v 0.412049 3.58485 1.2149 +vn 0.478903 0.0523567 0.876305 +v 0.352746 3.62868 1.24296 +vn 0.395437 -0.0405139 0.917599 +v 0.357554 3.57759 1.24245 +vn 0.412294 0.0995528 0.905595 +v 0.416495 3.63663 1.21368 +vn 0.458006 -0.0979742 0.883534 +v 0.470731 3.58677 1.17938 +vn 0.559975 0.00893657 0.828461 +v 0.476654 3.64008 1.17935 +vn 0.540249 -0.129267 0.831517 +v 0.371167 3.77022 1.27242 +vn 0.331753 -0.39599 0.856231 +v 0.439914 3.77786 1.24684 +vn 0.407758 -0.409519 0.816105 +v 0.378526 3.81038 1.29093 +vn 0.320354 -0.471506 0.821618 +v 0.385713 3.84833 1.31161 +vn 0.312718 -0.528751 0.789069 +v 0.45693 3.86092 1.28893 +vn 0.388834 -0.527458 0.755378 +v 0.389783 3.88142 1.33393 +vn 0.302788 -0.572259 0.762128 +v 0.511355 3.78256 1.20825 +vn 0.493069 -0.414756 0.764761 +v 0.565992 3.79804 1.17886 +vn 0.55241 -0.43019 0.713988 +v 0.514801 3.82725 1.23285 +vn 0.474376 -0.476324 0.740326 +v 0.533535 3.87021 1.25038 +vn 0.472813 -0.521576 0.710216 +v 0.597413 3.89841 1.22513 +vn 0.543837 -0.522638 0.656575 +v 0.535531 3.91065 1.2805 +vn 0.457222 -0.556456 0.693761 +v 0.157406 3.82611 1.35641 +vn 0.11722 -0.504231 0.855576 +v 0.231041 3.79588 1.32651 +vn 0.184921 -0.449786 0.873783 +v 0.235266 3.83171 1.34576 +vn 0.178245 -0.516481 0.837542 +v 0 3.81711 1.36159 +vn 5.53078e-19 -0.485697 0.874127 +v 0.077398 3.78696 1.34304 +vn 0.0602652 -0.427716 0.901902 +v 0.078818 3.82206 1.36127 +vn 0.0571601 -0.500784 0.863683 +v 0.160065 3.89134 1.40098 +vn 0.108417 -0.605585 0.788361 +v 0.238899 3.86457 1.36711 +vn 0.173563 -0.567865 0.804615 +v 0.242393 3.89523 1.38905 +vn 0.16899 -0.606234 0.777124 +v 0 3.87981 1.40269 +vn -1.0184e-06 -0.592552 0.805532 +v 0.080005 3.8543 1.3818 +vn 0.0542439 -0.557568 0.828357 +v 0.080398 3.88421 1.40296 +vn 0.0532635 -0.599826 0.798355 +v 0.722118 3.83643 1.04189 +vn 0.742408 -0.427107 0.516149 +v 0.702836 3.77814 1.0236 +vn 0.752955 -0.389966 0.53008 +v 0.740915 3.78751 0.970685 +vn 0.803653 -0.389525 0.449902 +v 0.685402 3.71923 1.00781 +vn 0.770443 -0.341119 0.538567 +v 0.670347 3.65849 0.99493 +vn 0.800193 -0.268291 0.536386 +v 0.70904 3.68162 0.945134 +vn 0.833925 -0.311012 0.455896 +v 0.622865 3.81034 1.13806 +vn 0.620402 -0.433748 0.653425 +v 0.608313 3.75786 1.11959 +vn 0.636172 -0.375477 0.674019 +v 0.658434 3.76744 1.07304 +vn 0.698467 -0.38493 0.603302 +v 0.594773 3.7033 1.10521 +vn 0.659264 -0.298585 0.690086 +v 0.583259 3.64714 1.09589 +vn 0.687949 -0.200311 0.697568 +v 0.629216 3.65108 1.04705 +vn 0.750831 -0.233919 0.617685 +v 0.74463 3.73118 0.913733 +vn 0.852981 -0.352193 0.385206 +v 0.77449 3.79815 0.912695 +vn 0.846199 -0.3909 0.362138 +v 0.809765 3.82628 0.852712 +vn 0.875802 -0.398567 0.27224 +v 0.820956 3.81348 0.784706 +vn 0.901878 -0.397806 0.168424 +v 0.850989 3.8873 0.801853 +vn 0.892568 -0.409767 0.188185 +v 0.733291 3.66731 0.88313 +vn 0.884307 -0.306089 0.352576 +v 0.753444 3.66549 0.819266 +vn 0.918863 -0.316939 0.235034 +v 0.765492 3.66478 0.754561 +vn 0.937274 -0.328071 0.117846 +v 0.791575 3.73921 0.770715 +vn 0.916126 -0.372362 0.148525 +v 0.80041 3.86723 0.930561 +vn 0.834817 -0.417171 0.359234 +v 0.824911 3.93435 0.953156 +vn 0.829626 -0.426863 0.359872 +v 0.784974 3.91185 1.01004 +vn 0.78788 -0.437397 0.433507 +v 0.846574 3.99794 0.978551 +vn 0.829075 -0.422137 0.366654 +v 0.866188 4.05839 1.00171 +vn 0.83989 -0.391328 0.376096 +v 0.823274 4.02813 1.058 +vn 0.797673 -0.419969 0.432831 +v 0.864927 3.97402 0.900502 +vn 0.863315 -0.415585 0.286314 +v 0.881762 3.9648 0.824526 +vn 0.890503 -0.407165 0.203031 +v 0.905122 4.03859 0.865123 +vn 0.892465 -0.386637 0.232419 +v 0.9351 4.11849 0.874961 +vn 0.910485 -0.337745 0.238634 +v 0.902826 4.08679 0.940828 +vn 0.880183 -0.364253 0.304299 +v 0.758467 3.94831 1.0885 +vn 0.73722 -0.459651 0.495205 +v 0.740989 3.89375 1.06422 +vn 0.736698 -0.450644 0.504178 +v 0.691926 3.87636 1.1139 +vn 0.678433 -0.46435 0.569304 +v 0.657428 3.90392 1.17434 +vn 0.61959 -0.4962 0.608188 +v 0.637891 3.86037 1.15933 +vn 0.612498 -0.475844 0.631204 +v 0.79723 4.05183 1.12413 +vn 0.766068 -0.416749 0.489346 +v 0.7753 4.00038 1.11183 +vn 0.744943 -0.450559 0.491992 +v 0.722573 3.97463 1.16137 +vn 0.686189 -0.479831 0.546723 +v 0.687816 3.99462 1.21948 +vn 0.639868 -0.496327 0.58671 +v 0.664523 3.94717 1.20348 +vn 0.61624 -0.509696 0.600382 +v 0.839771 3.87105 0.514094 +vn 0.876255 -0.449284 -0.17413 +v 0.81824 3.8038 0.578602 +vn 0.898195 -0.418423 -0.134788 +v 0.800231 3.79608 0.508024 +vn 0.874203 -0.434038 -0.217669 +v 0.76314 3.72329 0.500349 +vn 0.878793 -0.399222 -0.26143 +v 0.751262 3.65767 0.557321 +vn 0.916097 -0.340207 -0.212191 +v 0.730389 3.65327 0.490844 +vn 0.890429 -0.34081 -0.301637 +v 0.865109 3.88992 0.664096 +vn 0.908551 -0.417677 -0.00895627 +v 0.846806 3.85002 0.690361 +vn 0.910715 -0.41247 0.0216045 +v 0.828864 3.81128 0.650467 +vn 0.911592 -0.40903 -0.0411632 +v 0.794104 3.73362 0.635707 +vn 0.920669 -0.382669 -0.0770209 +v 0.769226 3.66362 0.689448 +vn 0.942162 -0.335152 0.0017833 +v 0.764384 3.66119 0.62361 +vn 0.934418 -0.338635 -0.110408 +v 0.774199 3.78681 0.437095 +vn 0.843241 -0.452607 -0.289985 +v 0.740501 3.77643 0.366142 +vn 0.807521 -0.472597 -0.352934 +v 0.782027 3.84577 0.364493 +vn 0.810187 -0.499542 -0.306684 +v 0.699383 3.76534 0.295472 +vn 0.769138 -0.492487 -0.407288 +v 0.651166 3.75391 0.225371 +vn 0.729076 -0.511071 -0.455253 +v 0.69522 3.81782 0.220157 +vn 0.729187 -0.549065 -0.408428 +v 0.702261 3.64824 0.424438 +vn 0.860297 -0.340865 -0.379077 +v 0.667412 3.64279 0.358347 +vn 0.827838 -0.340393 -0.445888 +v 0.701631 3.70858 0.364271 +vn 0.813391 -0.421599 -0.400811 +v 0.626339 3.63715 0.292826 +vn 0.794509 -0.339305 -0.503614 +v 0.579573 3.63153 0.22812 +vn 0.76115 -0.337245 -0.554 +v 0.612963 3.692 0.229676 +vn 0.740556 -0.443508 -0.504854 +v 0.78413 3.89782 0.283178 +vn 0.779352 -0.538131 -0.320976 +v 0.826352 3.91714 0.364088 +vn 0.821408 -0.506371 -0.262444 +v 0.865754 3.98711 0.35315 +vn 0.837293 -0.495243 -0.231679 +v 0.866369 4.01104 0.30535 +vn 0.828114 -0.502467 -0.248504 +v 0.903237 4.05727 0.343316 +vn 0.860966 -0.464164 -0.208059 +v 0.686347 3.84078 0.172976 +vn 0.706492 -0.575957 -0.411269 +v 0.735051 3.88086 0.203435 +vn 0.733793 -0.568897 -0.371354 +v 0.767767 3.96507 0.135646 +vn 0.733117 -0.573828 -0.365049 +v 0.754904 3.98389 0.082335 +vn 0.718327 -0.574503 -0.392369 +v 0.786419 3.99608 0.124838 +vn 0.744492 -0.56105 -0.361875 +v 0.857966 3.93367 0.443512 +vn 0.856822 -0.475367 -0.199705 +v 0.881169 3.94862 0.523041 +vn 0.884202 -0.448141 -0.131744 +v 0.896472 3.96274 0.600478 +vn 0.903076 -0.425278 -0.0599315 +v 0.901056 3.96868 0.67581 +vn 0.912289 -0.409057 0.0200259 +v 0.880468 3.92493 0.631591 +vn 0.905134 -0.423375 -0.0385398 +v 0.933091 4.08066 0.432685 +vn 0.894274 -0.423441 -0.144817 +v 0.954042 4.10241 0.522459 +vn 0.918962 -0.386109 -0.080175 +v 0.927489 4.05435 0.479133 +vn 0.895843 -0.426872 -0.123474 +v 0.96591 4.12088 0.611856 +vn 0.934142 -0.356748 -0.0104636 +v 0.969309 4.13706 0.702665 +vn 0.939169 -0.336975 0.0664082 +v 0.952687 4.08757 0.652597 +vn 0.928096 -0.371917 0.0177895 +v 0.936567 4.80117 0.203695 +vn 0.954407 0.237268 -0.181137 +v 0.93298 4.83961 0.239383 +vn 0.95355 0.258067 -0.155386 +v 0.941275 4.81709 0.255339 +vn 0.959652 0.2434 -0.140799 +v 0.967683 4.70225 0.262066 +vn 0.972538 0.186962 -0.138617 +v 0.962879 4.74816 0.298547 +vn 0.971279 0.209941 -0.111991 +v 0.970778 4.72313 0.322515 +vn 0.974222 0.203273 -0.0978357 +v 0.92508 4.93161 0.454997 +vn 0.956334 0.291866 -0.0154615 +v 0.936478 4.89227 0.49629 +vn 0.962469 0.271084 0.0129143 +v 0.943 4.86418 0.408643 +vn 0.96392 0.263847 -0.0352669 +v 0.945129 4.85511 0.542566 +vn 0.965424 0.256704 0.0453751 +v 0.952158 4.81584 0.593743 +vn 0.965357 0.251561 0.0693027 +v 0.959277 4.79971 0.541107 +vn 0.968812 0.245019 0.0369999 +v 0.936995 4.76194 0.16048 +vn 0.952466 0.214326 -0.216503 +v 0.928682 4.79077 0.153806 +vn 0.94718 0.233734 -0.219588 +v 0.89239 4.73861 -0.003821 +vn 0.913922 0.196188 -0.355326 +v 0.884242 4.69675 -0.043718 +vn 0.90468 0.159922 -0.394941 +v 0.874208 4.72338 -0.055132 +vn 0.897076 0.180774 -0.403207 +v 0.968066 4.66138 0.218655 +vn 0.972341 0.155384 -0.174382 +v 0.962139 4.6867 0.209495 +vn 0.968688 0.174277 -0.176837 +v 0.928246 4.63311 0.045506 +vn 0.94051 0.117225 -0.318904 +v 0.917879 4.58847 0.004422 +vn 0.929208 0.0705264 -0.362766 +v 0.910649 4.61582 -0.007854 +vn 0.92423 0.0948091 -0.369878 +v 0.898812 4.89238 0.150031 +vn 0.926885 0.303025 -0.221496 +v 0.898213 4.85741 0.106098 +vn 0.923993 0.27678 -0.263874 +v 0.888186 4.88489 0.100835 +vn 0.916884 0.297299 -0.266339 +v 0.854692 4.91613 0.032103 +vn 0.889152 0.326268 -0.32087 +v 0.827957 4.96335 0.00944 +vn 0.871051 0.35391 -0.340614 +v 0.852321 4.98226 0.100415 +vn 0.891231 0.358733 -0.27752 +v 0.847786 4.84078 -0.04733 +vn 0.880631 0.267188 -0.391279 +v 0.840748 4.8021 -0.086497 +vn 0.872428 0.237704 -0.427044 +v 0.828788 4.82796 -0.095877 +vn 0.86347 0.256294 -0.434434 +v 0.798151 4.94025 -0.07861 +vn 0.844254 0.338463 -0.415545 +v 0.790955 4.90429 -0.119429 +vn 0.835493 0.310385 -0.453446 +v 0.777964 4.92932 -0.12568 +vn 0.825245 0.329666 -0.458575 +v 0.889548 4.96106 0.213715 +vn 0.922905 0.335259 -0.189337 +v 0.910211 4.91601 0.240905 +vn 0.9371 0.308145 -0.163981 +v 0.913759 4.9442 0.33258 +vn 0.944704 0.312339 -0.0998938 +v 0.895125 5.00883 0.381043 +vn 0.929441 0.362695 -0.0677663 +v 0.912014 4.9688 0.417542 +vn 0.944825 0.324569 -0.0442835 +v 0.844615 5.04556 0.167181 +vn 0.887631 0.398061 -0.231643 +v 0.867955 5.00328 0.188862 +vn 0.906079 0.365889 -0.212475 +v 0.876576 5.02356 0.273603 +vn 0.914158 0.375823 -0.151897 +v 0.858739 5.0808 0.324483 +vn 0.89917 0.423184 -0.111393 +v 0.879292 5.04003 0.344138 +vn 0.916572 0.388815 -0.0933756 +v 0.671776 3.35588 0.416118 +vn 0.925077 0.214183 -0.313622 +v 0.702824 3.30703 0.479023 +vn 0.931323 0.289342 -0.221174 +v 0.680565 3.30643 0.398129 +vn 0.899805 0.32992 -0.285487 +v 0.668007 3.25928 0.29621 +vn 0.82627 0.476997 -0.299586 +v 0.692305 3.26313 0.375556 +vn 0.860344 0.436341 -0.263469 +v 0.7155 3.21641 0.362917 +vn 0.814791 0.531259 -0.232118 +v 0.6944 3.35677 0.492468 +vn 0.954742 0.16663 -0.246377 +v 0.708368 3.36339 0.560285 +vn 0.975615 0.124591 -0.180699 +v 0.717815 3.31234 0.56015 +vn 0.957996 0.237246 -0.161113 +v 0.719364 3.25425 0.461532 +vn 0.88634 0.420699 -0.193426 +v 0.730263 3.26406 0.545055 +vn 0.922558 0.357681 -0.144747 +v 0.751496 3.21754 0.542852 +vn 0.877665 0.464614 -0.117638 +v 0.65238 3.30618 0.317814 +vn 0.862236 0.379317 -0.335661 +v 0.619005 3.30543 0.237944 +vn 0.819103 0.434112 -0.37499 +v 0.608752 3.3554 0.264928 +vn 0.846303 0.32983 -0.418311 +v 0.580271 3.30534 0.159088 +vn 0.770892 0.488844 -0.40836 +v 0.536528 3.3065 0.083411 +vn 0.719737 0.539998 -0.436326 +v 0.525467 3.35702 0.120531 +vn 0.749296 0.448137 -0.487574 +v 0.688825 3.21418 0.272195 +vn 0.779468 0.567618 -0.265029 +v 0.659553 3.20919 0.181814 +vn 0.738453 0.60707 -0.293517 +v 0.635629 3.25753 0.210766 +vn 0.783883 0.524017 -0.333066 +v 0.624213 3.20653 0.093432 +vn 0.698854 0.640842 -0.317686 +v 0.600696 3.20758 0.045747 +vn 0.677306 0.657356 -0.330363 +v 0.556576 3.25445 0.044533 +vn 0.688384 0.614559 -0.385285 +v 0.565457 3.40776 0.220964 +vn 0.821798 0.268215 -0.502702 +v 0.605241 3.40756 0.290364 +vn 0.864464 0.20671 -0.458229 +v 0.608928 3.46216 0.313258 +vn 0.87098 0.0674454 -0.486667 +v 0.579722 3.5177 0.26785 +vn 0.83206 -0.0426943 -0.55304 +v 0.620298 3.51942 0.332732 +vn 0.864839 -0.0805759 -0.495541 +v 0.472817 3.41058 0.089714 +vn 0.728626 0.379813 -0.569952 +v 0.521139 3.40869 0.153869 +vn 0.776045 0.327141 -0.539196 +v 0.523942 3.46172 0.182136 +vn 0.794457 0.1742 -0.581801 +v 0.484848 3.51557 0.142768 +vn 0.763326 0.0347963 -0.645076 +v 0.534374 3.51638 0.204423 +vn 0.798251 -0.00363965 -0.602313 +v 0.639999 3.40782 0.361328 +vn 0.902952 0.147537 -0.403621 +v 0.669166 3.40838 0.433436 +vn 0.936479 0.0945137 -0.337749 +v 0.692091 3.40939 0.505978 +vn 0.963958 0.0511746 -0.261086 +v 0.708425 3.40991 0.579066 +vn 0.984674 0.0214384 -0.17308 +v 0.655499 3.5214 0.398757 +vn 0.896229 -0.115402 -0.428317 +v 0.684725 3.52351 0.465659 +vn 0.925143 -0.14566 -0.350562 +v 0.673334 3.46419 0.450138 +vn 0.935856 -0.0267571 -0.351364 +v 0.707375 3.52563 0.533131 +vn 0.950254 -0.169682 -0.2612 +v 0.722848 3.52764 0.600906 +vn 0.969524 -0.185736 -0.15977 +v 0.712391 3.46687 0.590072 +vn 0.981636 -0.086928 -0.169809 +v 0.655268 3.35672 1.01107 +vn 0.888972 0.233314 0.394073 +v 0.666717 3.30098 1.02499 +vn 0.875948 0.318847 0.36201 +v 0.692158 3.30384 0.951155 +vn 0.917331 0.278863 0.284148 +v 0.682962 3.24724 1.03986 +vn 0.851798 0.403428 0.334194 +v 0.703779 3.19561 1.05715 +vn 0.810981 0.495345 0.311357 +v 0.726777 3.20353 0.974268 +vn 0.848179 0.469637 0.245018 +v 0.582198 3.35569 1.13952 +vn 0.761266 0.335882 0.554668 +v 0.595279 3.29644 1.16234 +vn 0.752712 0.407686 0.51693 +v 0.634489 3.29831 1.09606 +vn 0.82109 0.363494 0.440096 +v 0.613505 3.23769 1.18681 +vn 0.73593 0.477877 0.479626 +v 0.637254 3.1779 1.216 +vn 0.702507 0.554018 0.446708 +v 0.674039 3.18739 1.13768 +vn 0.762517 0.524846 0.378291 +v 0.722813 3.26057 0.887409 +vn 0.917279 0.344855 0.199184 +v 0.710712 3.30796 0.87502 +vn 0.948256 0.243655 0.203573 +v 0.720298 3.32365 0.797963 +vn 0.972706 0.196446 0.123501 +v 0.730533 3.30388 0.720488 +vn 0.973901 0.224145 0.0357107 +v 0.721142 3.3599 0.722848 +vn 0.993798 0.105283 0.0357982 +v 0.762559 3.16741 0.918081 +vn 0.82197 0.536223 0.191914 +v 0.743698 3.21108 0.890261 +vn 0.877243 0.441021 0.189593 +v 0.742866 3.25948 0.638261 +vn 0.937666 0.343638 -0.0519224 +v 0.743295 3.25848 0.722732 +vn 0.942464 0.332799 0.0317238 +v 0.760253 3.21837 0.715908 +vn 0.903683 0.427341 0.0271491 +v 0.701486 3.36105 0.868969 +vn 0.964516 0.1399 0.223911 +v 0.698123 3.41729 0.862406 +vn 0.968345 0.0302996 0.247768 +v 0.676709 3.41459 0.932578 +vn 0.935452 0.081581 0.343911 +v 0.704986 3.47494 0.842395 +vn 0.965924 -0.0805612 0.245971 +v 0.722367 3.53333 0.799005 +vn 0.967224 -0.177292 0.181783 +v 0.706297 3.53543 0.864134 +vn 0.940068 -0.152509 0.304981 +v 0.71751 3.41064 0.652892 +vn 0.997838 0.00905124 -0.065092 +v 0.718504 3.41487 0.7258 +vn 0.999023 -0.00578922 0.0438096 +v 0.721731 3.47229 0.72866 +vn 0.993094 -0.105971 0.0503448 +v 0.73057 3.52955 0.668573 +vn 0.980154 -0.192435 -0.0476047 +v 0.730391 3.53213 0.734575 +vn 0.979419 -0.190254 0.0673944 +v 0.647097 3.47332 0.990204 +vn 0.883221 0.040268 0.467225 +v 0.648633 3.41401 0.999333 +vn 0.891644 0.140842 0.430273 +v 0.614398 3.41428 1.06194 +vn 0.834262 0.196566 0.515139 +v 0.569884 3.4737 1.1053 +vn 0.756574 0.153486 0.63564 +v 0.573808 3.41486 1.12013 +vn 0.762971 0.251872 0.595345 +v 0.683735 3.55414 0.927679 +vn 0.893543 -0.140588 0.426399 +v 0.657962 3.59687 0.987957 +vn 0.831803 -0.173625 0.527217 +v 0.650258 3.53487 0.986124 +vn 0.86142 -0.06883 0.503208 +v 0.61297 3.53229 1.04328 +vn 0.809356 -0.0122711 0.58719 +v 0.574837 3.58995 1.09258 +vn 0.717445 -0.0824743 0.691716 +v 0.570287 3.53208 1.09587 +vn 0.74134 0.0405721 0.669902 +v 0.752834 2.70396 -1.67949 +vn 0.864472 0.400464 -0.303838 +v 0.778203 2.7071 -1.59719 +vn 0.863957 0.430933 -0.260528 +v 0.795821 2.64467 -1.6357 +vn 0.863967 0.403804 -0.300838 +v 0.835577 2.5881 -1.59812 +vn 0.861654 0.405102 -0.305688 +v 0.858063 2.59495 -1.52065 +vn 0.859883 0.434568 -0.267865 +v 0.872225 2.53812 -1.56136 +vn 0.860118 0.407642 -0.306635 +v 0.745098 2.78424 -1.57379 +vn 0.861764 0.461221 -0.211278 +v 0.790934 2.72343 -1.52069 +vn 0.858814 0.464176 -0.216746 +v 0.831173 2.6653 -1.48656 +vn 0.858609 0.461313 -0.223565 +v 0.866408 2.61601 -1.45382 +vn 0.855916 0.46407 -0.228137 +v 0.801536 2.5931 -1.68246 +vn 0.862104 0.373451 -0.342507 +v 0.806242 2.53706 -1.72677 +vn 0.855729 0.345625 -0.385059 +v 0.782297 2.59211 -1.72992 +vn 0.857814 0.357922 -0.368846 +v 0.814005 2.4748 -1.76202 +vn 0.847612 0.321329 -0.422258 +v 0.821519 2.4132 -1.79096 +vn 0.83854 0.294384 -0.458464 +v 0.771113 2.46812 -1.8476 +vn 0.83396 0.280323 -0.475321 +v 0.87968 2.48836 -1.60209 +vn 0.857878 0.382857 -0.342733 +v 0.886986 2.43693 -1.63782 +vn 0.854583 0.359412 -0.374848 +v 0.849582 2.48229 -1.67987 +vn 0.854946 0.353619 -0.3795 +v 0.895292 2.383 -1.6678 +vn 0.849797 0.336212 -0.405964 +v 0.904312 2.32765 -1.69238 +vn 0.844342 0.312636 -0.435138 +v 0.865598 2.36749 -1.73895 +vn 0.84244 0.304107 -0.444762 +v 0.759944 2.59614 -1.77632 +vn 0.854381 0.34081 -0.392276 +v 0.73884 2.59339 -1.82294 +vn 0.84768 0.324782 -0.41947 +v 0.712469 2.65715 -1.82616 +vn 0.852568 0.335135 -0.401013 +v 0.659569 2.73142 -1.87692 +vn 0.852849 0.325604 -0.408205 +v 0.632592 2.73692 -1.92699 +vn 0.843686 0.303248 -0.442984 +v 0.633446 2.77095 -1.90062 +vn 0.85413 0.320446 -0.409605 +v 0.72703 2.44883 -1.92891 +vn 0.80651 0.230547 -0.544418 +v 0.718059 2.52305 -1.90726 +vn 0.825743 0.265942 -0.497417 +v 0.657837 2.59043 -1.96891 +vn 0.812191 0.251854 -0.526227 +v 0.630042 2.58451 -2.01259 +vn 0.792815 0.222932 -0.567226 +v 0.626425 2.6222 -2.00166 +vn 0.798763 0.243831 -0.550022 +v 0.709324 2.71833 -1.77649 +vn 0.861151 0.365713 -0.353091 +v 0.705787 2.77407 -1.72101 +vn 0.866277 0.398231 -0.301623 +v 0.730691 2.71321 -1.72827 +vn 0.862094 0.384571 -0.329999 +v 0.699791 2.82537 -1.66301 +vn 0.86642 0.432454 -0.2496 +v 0.696531 2.86325 -1.59791 +vn 0.859269 0.478349 -0.181214 +v 0.721804 2.80654 -1.61902 +vn 0.863309 0.448462 -0.231472 +v 0.654771 2.85223 -1.76482 +vn 0.869251 0.395976 -0.295984 +v 0.631458 2.86436 -1.81565 +vn 0.869571 0.375936 -0.320184 +v 0.629604 2.89276 -1.78551 +vn 0.872133 0.393514 -0.290742 +v 0.643101 2.9452 -1.63463 +vn 0.856924 0.492458 -0.152205 +v 0.62152 2.96523 -1.68787 +vn 0.865915 0.463452 -0.188159 +v 0.616372 2.9868 -1.65354 +vn 0.857796 0.495346 -0.137182 +v 0.381897 3.36767 -1.94196 +vn 0.899679 0.391288 -0.193576 +v 0.412389 3.32547 -1.87143 +vn 0.900917 0.421915 -0.101669 +v 0.421065 3.28542 -1.92326 +vn 0.901149 0.382135 -0.204703 +v 0.460126 3.20172 -1.90656 +vn 0.897475 0.378437 -0.226548 +v 0.481356 3.17856 -1.85765 +vn 0.898904 0.397204 -0.184932 +v 0.483581 3.15388 -1.89373 +vn 0.894639 0.378329 -0.237673 +v 0.360253 3.43287 -1.84986 +vn 0.87471 0.480693 0.0617782 +v 0.371427 3.39712 -1.78543 +vn 0.822433 0.526748 0.214806 +v 0.39616 3.36296 -1.82477 +vn 0.882102 0.469699 0.0357623 +v 0.436471 3.28608 -1.79252 +vn 0.876529 0.481084 0.0159425 +v 0.447883 3.25268 -1.7067 +vn 0.804228 0.568885 0.172008 +v 0.458713 3.24519 -1.766 +vn 0.868182 0.495088 0.0338791 +v 0.421139 3.24562 -1.98091 +vn 0.891185 0.347981 -0.29103 +v 0.4196 3.19985 -2.03107 +vn 0.873837 0.317648 -0.368116 +v 0.399406 3.24787 -2.03747 +vn 0.87338 0.323021 -0.364507 +v 0.357808 3.22211 -2.1344 +vn 0.792451 0.269083 -0.547372 +v 0.383616 3.1895 -2.1113 +vn 0.825502 0.275555 -0.492561 +v 0.376558 3.17199 -2.13122 +vn 0.79222 0.249647 -0.556834 +v 0.462329 3.10003 -2.0147 +vn 0.872303 0.309132 -0.378847 +v 0.487029 3.07666 -1.97561 +vn 0.880483 0.324413 -0.345696 +v 0.484796 3.04984 -2.004 +vn 0.870592 0.308017 -0.383661 +v 0.436113 3.00461 -2.11862 +vn 0.794404 0.224801 -0.564258 +v 0.468573 2.97176 -2.08469 +vn 0.822235 0.245535 -0.513461 +v 0.459205 2.9445 -2.11032 +vn 0.789824 0.223604 -0.571122 +v 0.378861 3.29645 -2.04298 +vn 0.8694 0.334573 -0.3636 +v 0.332487 3.34589 -2.10035 +vn 0.825282 0.326005 -0.461118 +v 0.343288 3.37947 -2.05047 +vn 0.863648 0.349476 -0.363289 +v 0.309061 3.45655 -2.05496 +vn 0.85402 0.37919 -0.356181 +v 0.272762 3.48971 -2.09895 +vn 0.791606 0.403771 -0.458616 +v 0.280125 3.51586 -2.05782 +vn 0.826012 0.42959 -0.364907 +v 0.313546 3.27123 -2.17034 +vn 0.722166 0.260217 -0.640909 +v 0.340435 3.26833 -2.13643 +vn 0.795351 0.286103 -0.534379 +v 0.239424 3.48139 -2.15246 +vn 0.674149 0.404543 -0.617954 +v 0.267893 3.46169 -2.12906 +vn 0.766751 0.37322 -0.522302 +v 0.263632 3.43219 -2.15329 +vn 0.736723 0.327012 -0.591864 +v 0.34647 3.41312 -2.003 +vn 0.883335 0.3805 -0.273749 +v 0.345992 3.44313 -1.9531 +vn 0.893129 0.410493 -0.183893 +v 0.341197 3.46795 -1.90719 +vn 0.890612 0.449123 -0.0714053 +v 0.32582 3.49744 -1.86627 +vn 0.860691 0.502618 0.0811553 +v 0.273226 3.55137 -2.02784 +vn 0.829672 0.463426 -0.311256 +v 0.242626 3.60908 -2.01885 +vn 0.812705 0.516637 -0.269436 +v 0.278473 3.56922 -1.97594 +vn 0.849403 0.492598 -0.189369 +v 0.283244 3.56116 -1.8508 +vn 0.789828 0.569521 0.227633 +v 0.304129 3.53584 -1.92394 +vn 0.873686 0.484289 -0.0462342 +v 0.273074 3.59024 -1.90619 +vn 0.832974 0.549703 0.0630977 +v 0.806463 5.18557 0.482517 +vn 0.821225 0.569136 0.0409147 +v 0.77671 5.22119 0.521306 +vn 0.777822 0.621934 0.0905061 +v 0.798275 5.19064 0.539043 +vn 0.801175 0.590339 0.0980743 +v 0.819872 5.1609 0.361202 +vn 0.855261 0.513097 -0.072522 +v 0.79023 5.21009 0.403478 +vn 0.811721 0.583695 -0.0202256 +v 0.812856 5.17789 0.421311 +vn 0.838396 0.544773 -0.0177324 +v 0.847485 5.11663 0.52398 +vn 0.866739 0.49552 0.0567735 +v 0.817324 5.15969 0.560329 +vn 0.823947 0.556448 0.10713 +v 0.839341 5.12071 0.584548 +vn 0.848911 0.516717 0.111141 +v 0.860754 5.09029 0.398505 +vn 0.896987 0.43886 -0.0530716 +v 0.834721 5.14262 0.44332 +vn 0.864022 0.50339 -0.00797159 +v 0.859298 5.09827 0.467195 +vn 0.888765 0.45833 -0.00555396 +v 0.753304 5.25156 0.506681 +vn 0.751457 0.653943 0.087584 +v 0.757589 5.25153 0.44855 +vn 0.765492 0.642727 0.0304027 +v 0.727374 5.28124 0.495678 +vn 0.721847 0.686751 0.0854914 +v 0.697258 5.30237 0.547241 +vn 0.677041 0.721474 0.145224 +v 0.699375 5.31047 0.488809 +vn 0.685273 0.723301 0.0850704 +v 0.669553 5.33536 0.501993 +vn 0.649225 0.752802 0.108614 +v 0.76349 5.24462 0.379541 +vn 0.782934 0.621196 -0.0336218 +v 0.757966 5.24531 0.320211 +vn 0.784336 0.612787 -0.0964827 +v 0.731943 5.28176 0.374906 +vn 0.744436 0.667259 -0.02409 +v 0.698989 5.31603 0.361025 +vn 0.702005 0.71141 -0.0329275 +v 0.687173 5.32219 0.301574 +vn 0.696402 0.710833 -0.0986926 +v 0.661051 5.35123 0.372742 +vn 0.656967 0.753879 -0.00777895 +v 0.745995 5.24962 0.561878 +vn 0.734319 0.663589 0.142918 +v 0.716793 5.27036 0.602965 +vn 0.695386 0.693615 0.18798 +v 0.721164 5.24689 0.661691 +vn 0.695956 0.673157 0.25001 +v 0.684317 5.28893 0.645016 +vn 0.66154 0.712097 0.235123 +v 0.669823 5.27417 0.721725 +vn 0.658646 0.696748 0.284127 +v 0.64071 5.34508 0.573712 +vn 0.609602 0.772512 0.177793 +v 0.671224 5.31271 0.604316 +vn 0.638031 0.745483 0.192798 +v 0.646422 5.30234 0.703642 +vn 0.626235 0.732187 0.267828 +v 0.736771 5.24711 0.612583 +vn 0.717891 0.668253 0.195118 +v 0.755413 5.2223 0.625733 +vn 0.736228 0.645971 0.201715 +v 0.772878 5.19697 0.641335 +vn 0.753304 0.622686 0.21165 +v 0.753509 5.20122 0.68872 +vn 0.723803 0.635163 0.269587 +v 0.78657 5.17409 0.657292 +vn 0.774311 0.590598 0.227236 +v 0.696522 5.2379 0.744774 +vn 0.683238 0.665131 0.301308 +v 0.722115 5.19795 0.771313 +vn 0.702939 0.635586 0.319228 +v 0.783893 5.15098 0.718959 +vn 0.760505 0.588612 0.274166 +v 0.806697 2.19894 -1.90095 +vn 0.763568 0.121918 -0.634113 +v 0.847853 2.22746 -1.83951 +vn 0.800931 0.190143 -0.567763 +v 0.856619 2.16737 -1.845 +vn 0.784572 0.144894 -0.60287 +v 0.901368 2.1384 -1.79229 +vn 0.799388 0.165036 -0.577704 +v 0.932025 2.16464 -1.73766 +vn 0.820439 0.221539 -0.527068 +v 0.941155 2.10815 -1.74494 +vn 0.811109 0.177929 -0.557174 +v 0.788548 2.33094 -1.887 +vn 0.802024 0.212532 -0.5582 +v 0.829896 2.35073 -1.81321 +vn 0.827899 0.264612 -0.494534 +v 0.838821 2.28864 -1.82914 +vn 0.815488 0.230206 -0.531022 +v 0.883749 2.25101 -1.7752 +vn 0.824476 0.245571 -0.509837 +v 0.913698 2.27232 -1.71188 +vn 0.837362 0.287408 -0.464997 +v 0.923045 2.21795 -1.7268 +vn 0.82952 0.258662 -0.494966 +v 0.864699 2.1086 -1.84639 +vn 0.766854 0.0950589 -0.634743 +v 0.871801 2.05109 -1.84421 +vn 0.748237 0.0414661 -0.662134 +v 0.822539 2.07327 -1.89698 +vn 0.722375 0.0189056 -0.691243 +v 0.877662 1.99468 -1.83896 +vn 0.729304 -0.0137808 -0.684051 +v 0.882024 1.93924 -1.83109 +vn 0.710585 -0.0685343 -0.700265 +v 0.833324 1.95372 -1.88047 +vn 0.683093 -0.0876305 -0.725055 +v 0.944279 2.05816 -1.75403 +vn 0.795919 0.124097 -0.592547 +v 0.954874 2.00739 -1.74858 +vn 0.787209 0.077268 -0.611826 +v 0.915862 2.0301 -1.79435 +vn 0.766739 0.0607798 -0.639075 +v 0.955902 1.95789 -1.75111 +vn 0.765609 0.0138176 -0.643158 +v 0.963673 1.90915 -1.74107 +vn 0.755572 -0.0360095 -0.654075 +v 0.925498 1.92538 -1.78435 +vn 0.730805 -0.0520257 -0.680601 +v 0.775086 2.03163 -1.9419 +vn 0.667076 -0.0574005 -0.742775 +v 0.76864 2.09634 -1.95064 +vn 0.688287 -0.00548987 -0.725418 +v 0.710552 2.11961 -2.00343 +vn 0.644199 -0.0314405 -0.764211 +v 0.655664 2.0688 -2.04106 +vn 0.566161 -0.104955 -0.817586 +v 0.648797 2.14203 -2.05337 +vn 0.587628 -0.0583693 -0.807023 +v 0.783083 1.90704 -1.91721 +vn 0.630373 -0.15482 -0.760698 +v 0.779965 1.9687 -1.93061 +vn 0.647662 -0.107647 -0.754285 +v 0.722339 1.98378 -1.97986 +vn 0.60316 -0.128313 -0.787232 +v 0.66428 1.93006 -2.0101 +vn 0.53239 -0.190011 -0.824898 +v 0.660854 1.99847 -2.02654 +vn 0.547747 -0.149255 -0.823223 +v 0.760858 2.16322 -1.95635 +vn 0.710942 0.0459672 -0.701747 +v 0.751981 2.2327 -1.95847 +vn 0.73469 0.0959037 -0.67159 +v 0.742526 2.30443 -1.95599 +vn 0.758681 0.14534 -0.635043 +v 0.733359 2.37729 -1.94721 +vn 0.78218 0.191715 -0.592824 +v 0.640381 2.21898 -2.06308 +vn 0.612039 -0.0110038 -0.790751 +v 0.630652 2.3003 -2.0696 +vn 0.639609 0.0383086 -0.767745 +v 0.693046 2.26727 -2.0155 +vn 0.694407 0.0679132 -0.71637 +v 0.621395 2.38916 -2.07012 +vn 0.673616 0.0880506 -0.733817 +v 0.60809 2.47853 -2.06904 +vn 0.712789 0.121925 -0.6907 +v 0.642421 2.45135 -2.03789 +vn 0.736696 0.152202 -0.658872 +v 0.288229 2.3944 -2.24479 +vn 0.237016 -0.0975225 -0.966599 +v 0.319028 2.43769 -2.24042 +vn 0.281151 -0.0741054 -0.956798 +v 0.359286 2.38515 -2.22357 +vn 0.314706 -0.080081 -0.945805 +v 0.46116 2.4121 -2.18288 +vn 0.456925 -0.0232049 -0.889202 +v 0.486931 2.45699 -2.16848 +vn 0.521528 0.014364 -0.853113 +v 0.495884 2.40708 -2.16356 +vn 0.526191 -0.00672455 -0.85034 +v 0.293456 2.64333 -2.25812 +vn 0.304039 -0.0179177 -0.952491 +v 0.318131 2.69864 -2.24969 +vn 0.364418 0.00757122 -0.931205 +v 0.325895 2.64037 -2.24698 +vn 0.352107 -0.00716883 -0.935932 +v 0.420344 2.6353 -2.20181 +vn 0.515176 0.0358789 -0.856333 +v 0.441362 2.68527 -2.18483 +vn 0.564262 0.0785744 -0.821848 +v 0.456695 2.6238 -2.17931 +vn 0.558487 0.0555515 -0.827651 +v 0.365992 2.29624 -2.21225 +vn 0.301977 -0.117972 -0.945988 +v 0.37457 2.21157 -2.19775 +vn 0.297987 -0.145162 -0.943468 +v 0.335419 2.25518 -2.21569 +vn 0.257538 -0.140062 -0.956063 +v 0.380198 2.12903 -2.18173 +vn 0.286958 -0.178126 -0.941237 +v 0.384411 2.04949 -2.1639 +vn 0.277916 -0.209645 -0.93745 +v 0.345749 2.08953 -2.18323 +vn 0.240866 -0.20274 -0.949147 +v 0.507981 2.26456 -2.15037 +vn 0.460982 -0.0699667 -0.884647 +v 0.516278 2.18055 -2.13762 +vn 0.439178 -0.110125 -0.891625 +v 0.446444 2.19539 -2.17019 +vn 0.363954 -0.131457 -0.922094 +v 0.522931 2.10106 -2.12271 +vn 0.421765 -0.15015 -0.894186 +v 0.527925 2.02493 -2.10589 +vn 0.407681 -0.187558 -0.893654 +v 0.457304 2.03603 -2.13704 +vn 0.338011 -0.201558 -0.919306 +v 0.301672 2.2169 -2.21798 +vn 0.218273 -0.16098 -0.962519 +v 0.266781 2.17885 -2.2184 +vn 0.181937 -0.180689 -0.966566 +v 0.227094 2.22416 -2.23344 +vn 0.154545 -0.168921 -0.973438 +v 0.151606 2.22945 -2.24401 +vn 0.0972692 -0.173349 -0.980045 +v 0.114713 2.18966 -2.23978 +vn 0.0690716 -0.188594 -0.979623 +v 0.075637 2.23284 -2.25 +vn 0.0409005 -0.17559 -0.983613 +v 0.309908 2.05362 -2.18352 +vn 0.205385 -0.220396 -0.953542 +v 0.273119 2.01727 -2.18208 +vn 0.173676 -0.23554 -0.95622 +v 0.233619 2.05988 -2.19889 +vn 0.147047 -0.224675 -0.963275 +v 0.156212 2.06456 -2.20956 +vn 0.0936546 -0.22684 -0.969419 +v 0.117799 2.02649 -2.2036 +vn 0.0674142 -0.238954 -0.968688 +v 0.078118 2.06765 -2.21571 +vn 0.0398712 -0.227892 -0.97287 +v 0.222335 2.31074 -2.24787 +vn 0.160141 -0.138603 -0.977315 +v 0.216442 2.4014 -2.26029 +vn 0.166369 -0.108646 -0.98006 +v 0.255949 2.35217 -2.24724 +vn 0.196245 -0.118717 -0.973342 +v 0.209381 2.49491 -2.27052 +vn 0.172285 -0.0825592 -0.981581 +v 0.205092 2.54672 -2.2753 +vn 0.174241 -0.0660322 -0.982487 +v 0.239374 2.54391 -2.2683 +vn 0.211555 -0.060546 -0.975489 +v 0.073853 2.31942 -2.26423 +vn 0.0418038 -0.146899 -0.988268 +v 0.071671 2.40981 -2.27638 +vn 0.0428541 -0.118159 -0.99207 +v 0.10952 2.36307 -2.26831 +vn 0.072234 -0.131016 -0.988745 +v 0.067679 2.50562 -2.28659 +vn 0.0452083 -0.0939825 -0.994547 +v 0.067509 2.5576 -2.29106 +vn 0.0502084 -0.0749243 -0.995924 +v 0.101844 2.55322 -2.2885 +vn 0.0761141 -0.0745865 -0.994306 +v 1.02538 4.43643 0.528567 +vn 0.999494 0.0172151 -0.0267287 +v 1.02605 4.4188 0.58515 +vn 0.999957 0.000465255 0.00920795 +v 1.02554 4.40323 0.535711 +vn 0.999305 -0.0265307 -0.0261982 +v 1.01597 4.29968 0.555972 +vn 0.98592 -0.164972 -0.0273029 +v 1.01238 4.27643 0.609984 +vn 0.981477 -0.191564 0.00255207 +v 1.00935 4.26384 0.561134 +vn 0.976564 -0.213272 -0.0289561 +v 1.01758 4.51171 0.659854 +vn 0.990285 0.123597 0.0637064 +v 1.01589 4.49394 0.709161 +vn 0.989536 0.107614 0.0961125 +v 1.02239 4.44675 0.673396 +vn 0.996916 0.0444979 0.0646374 +v 1.02141 4.37642 0.689165 +vn 0.996576 -0.0456388 0.0689441 +v 1.01563 4.35411 0.740584 +vn 0.991577 -0.0703896 0.108719 +v 1.01318 4.30231 0.707355 +vn 0.985929 -0.146212 0.0810309 +v 1.01053 4.35598 0.386454 +vn 0.985155 -0.115694 -0.126822 +v 1.00165 4.34506 0.33555 +vn 0.976369 -0.134528 -0.169135 +v 1.00606 4.37424 0.341499 +vn 0.982779 -0.0892124 -0.161824 +v 0.956303 4.2905 0.183054 +vn 0.933156 -0.233231 -0.273537 +v 0.936413 4.27753 0.131434 +vn 0.910051 -0.264477 -0.319153 +v 0.945764 4.30717 0.135878 +vn 0.926706 -0.213452 -0.309279 +v 0.986561 4.22278 0.414602 +vn 0.950142 -0.28431 -0.128055 +v 0.974773 4.20838 0.365984 +vn 0.937136 -0.309387 -0.161418 +v 0.983715 4.24183 0.358896 +vn 0.949589 -0.269216 -0.160635 +v 0.923413 4.16366 0.220841 +vn 0.882258 -0.388134 -0.266408 +v 0.901098 4.14861 0.173101 +vn 0.858692 -0.414399 -0.301531 +v 0.911766 4.17981 0.162942 +vn 0.873243 -0.380368 -0.304576 +v 1.0006 4.39598 0.302681 +vn 0.980651 -0.061423 -0.18588 +v 0.991924 4.44335 0.250439 +vn 0.978658 -0.0174515 -0.204752 +v 1.00237 4.45298 0.304292 +vn 0.9856 -0.00420131 -0.169041 +v 0.995437 4.58573 0.322367 +vn 0.982403 0.13632 -0.127677 +v 0.993039 4.54443 0.274249 +vn 0.981963 0.0879473 -0.167375 +v 0.9883 4.57415 0.264289 +vn 0.979347 0.114753 -0.166467 +v 0.963183 4.40878 0.143231 +vn 0.95555 -0.0811029 -0.283454 +v 0.949664 4.36721 0.115003 +vn 0.93903 -0.134172 -0.316577 +v 0.944409 4.387 0.092274 +vn 0.935066 -0.121567 -0.332977 +v 0.952503 4.52374 0.095199 +vn 0.955697 0.0235729 -0.293407 +v 0.938337 4.47721 0.053255 +vn 0.940193 -0.0361016 -0.338723 +v 0.934681 4.50536 0.041185 +vn 0.93935 -0.00760163 -0.342875 +v 1.011 4.46354 0.360083 +vn 0.990114 0.0263654 -0.137767 +v 1.01548 4.49136 0.408516 +vn 0.992592 0.0680508 -0.100647 +v 1.01782 4.46419 0.418148 +vn 0.995232 0.0327849 -0.0918556 +v 1.01559 4.55016 0.559173 +vn 0.988785 0.149288 0.00405946 +v 1.01227 4.56569 0.607735 +vn 0.984721 0.170624 0.0348221 +v 1.01676 4.53576 0.611684 +vn 0.99049 0.132769 0.0360772 +v 0.997206 4.61229 0.375439 +vn 0.981513 0.168713 -0.0903814 +v 1.00286 4.58186 0.383511 +vn 0.9846 0.147793 -0.0933759 +v 0.99039 4.67498 0.536412 +vn 0.973384 0.228821 0.012865 +v 0.983449 4.69667 0.590328 +vn 0.968064 0.246585 0.0452499 +v 0.992372 4.66049 0.595287 +vn 0.970426 0.238248 0.038874 +v 0.833513 1.72716 -1.82312 +vn 0.622067 -0.28055 -0.730975 +v 0.884103 1.77766 -1.79576 +vn 0.661496 -0.222575 -0.716159 +v 0.881151 1.7256 -1.78044 +vn 0.647808 -0.271625 -0.711733 +v 0.923742 1.72396 -1.73991 +vn 0.667368 -0.265493 -0.695797 +v 0.959514 1.76426 -1.71865 +vn 0.696978 -0.210881 -0.685383 +v 0.960571 1.72315 -1.70328 +vn 0.689701 -0.257125 -0.676904 +v 0.837141 1.83838 -1.8553 +vn 0.649524 -0.185994 -0.737241 +v 0.884631 1.88459 -1.82109 +vn 0.692845 -0.121447 -0.710786 +v 0.885304 1.8307 -1.8093 +vn 0.67646 -0.172609 -0.715967 +v 0.92821 1.82327 -1.76579 +vn 0.696589 -0.161333 -0.699096 +v 0.961367 1.86009 -1.73863 +vn 0.731066 -0.101478 -0.674719 +v 0.965595 1.81278 -1.72514 +vn 0.721503 -0.149678 -0.67604 +v 0.876784 1.67455 -1.76304 +vn 0.635595 -0.319809 -0.702667 +v 0.870511 1.62462 -1.74409 +vn 0.622752 -0.366921 -0.69105 +v 0.823452 1.62118 -1.78351 +vn 0.598554 -0.374149 -0.70834 +v 0.863502 1.57591 -1.72247 +vn 0.611718 -0.415434 -0.673213 +v 0.858792 1.52659 -1.69412 +vn 0.604293 -0.459787 -0.650712 +v 0.811172 1.52233 -1.73391 +vn 0.579143 -0.463357 -0.670741 +v 0.911482 1.5771 -1.67812 +vn 0.631711 -0.41347 -0.655731 +v 0.907083 1.62142 -1.7085 +vn 0.639404 -0.368382 -0.674876 +v 0.945235 1.6313 -1.67682 +vn 0.658325 -0.355664 -0.663409 +v 0.974728 1.59381 -1.62631 +vn 0.640457 -0.39778 -0.656952 +v 0.930873 1.54503 -1.63757 +vn 0.633496 -0.450369 -0.629166 +v 0.76524 1.56426 -1.79884 +vn 0.557352 -0.427098 -0.712002 +v 0.771757 1.61738 -1.82359 +vn 0.567398 -0.381736 -0.729615 +v 0.715778 1.6138 -1.86327 +vn 0.528774 -0.389594 -0.754065 +v 0.650093 1.55239 -1.87311 +vn 0.47333 -0.444024 -0.76079 +v 0.655852 1.61059 -1.90126 +vn 0.481656 -0.397396 -0.781079 +v 0.767193 1.46924 -1.73222 +vn 0.547895 -0.515645 -0.658727 +v 0.760482 1.51388 -1.7703 +vn 0.549394 -0.471227 -0.690008 +v 0.655604 1.44725 -1.79944 +vn 0.468373 -0.536045 -0.702341 +v 0.645534 1.49649 -1.84106 +vn 0.464666 -0.491628 -0.736469 +v 0.70552 1.50534 -1.80633 +vn 0.511795 -0.479867 -0.712597 +v 0.777193 1.67235 -1.84611 +vn 0.578 -0.335701 -0.743788 +v 0.781186 1.72896 -1.86664 +vn 0.589244 -0.290086 -0.754083 +v 0.783594 1.78705 -1.88527 +vn 0.601493 -0.244934 -0.760404 +v 0.784271 1.84646 -1.9021 +vn 0.61509 -0.200043 -0.762658 +v 0.660512 1.67094 -1.92702 +vn 0.489882 -0.352561 -0.797318 +v 0.66383 1.73325 -1.95063 +vn 0.498654 -0.309627 -0.809614 +v 0.724511 1.731 -1.90962 +vn 0.548529 -0.299889 -0.780501 +v 0.665659 1.79734 -1.97224 +vn 0.508405 -0.26849 -0.818191 +v 0.665856 1.86301 -1.99201 +vn 0.519508 -0.228922 -0.823229 +v 0.727055 1.85474 -1.94819 +vn 0.572251 -0.214475 -0.791536 +v 0.313246 1.74611 -2.09361 +vn 0.197021 -0.333219 -0.922035 +v 0.351538 1.78179 -2.0974 +vn 0.225085 -0.315306 -0.92191 +v 0.388399 1.74372 -2.07434 +vn 0.253578 -0.332509 -0.90837 +v 0.461475 1.74456 -2.05156 +vn 0.322117 -0.327233 -0.888346 +v 0.533116 1.80767 -2.04529 +vn 0.383267 -0.288283 -0.877496 +v 0.531833 1.73836 -2.02151 +vn 0.37744 -0.325526 -0.866932 +v 0.313575 1.89739 -2.14224 +vn 0.199776 -0.271229 -0.941554 +v 0.350941 1.93319 -2.14378 +vn 0.231301 -0.255965 -0.938606 +v 0.390381 1.89339 -2.12223 +vn 0.264808 -0.262536 -0.927875 +v 0.464386 1.8878 -2.09705 +vn 0.329502 -0.255987 -0.90879 +v 0.531272 1.95108 -2.08733 +vn 0.397444 -0.220844 -0.890655 +v 0.532972 1.87865 -2.06717 +vn 0.390116 -0.253805 -0.885095 +v 0.386561 1.67237 -2.0471 +vn 0.251922 -0.370831 -0.893879 +v 0.383829 1.60337 -2.01738 +vn 0.250479 -0.413531 -0.875358 +v 0.348277 1.63758 -2.04241 +vn 0.222912 -0.391319 -0.892849 +v 0.380305 1.53709 -1.98495 +vn 0.248893 -0.460697 -0.851945 +v 0.3761 1.47387 -1.94958 +vn 0.24666 -0.512229 -0.822666 +v 0.341934 1.50364 -1.9769 +vn 0.220658 -0.485871 -0.845718 +v 0.529255 1.67101 -1.99561 +vn 0.372418 -0.365879 -0.852899 +v 0.525516 1.60587 -1.9674 +vn 0.367836 -0.409506 -0.834866 +v 0.456114 1.60762 -1.99605 +vn 0.31634 -0.409369 -0.855772 +v 0.520748 1.54321 -1.93666 +vn 0.363251 -0.456409 -0.812243 +v 0.515126 1.48327 -1.90316 +vn 0.357825 -0.507112 -0.784091 +v 0.447061 1.48106 -1.93011 +vn 0.310861 -0.507787 -0.803441 +v 0.309611 1.60275 -2.03578 +vn 0.19606 -0.413401 -0.88919 +v 0.270686 1.56804 -2.0272 +vn 0.169792 -0.43574 -0.883912 +v 0.233753 1.60244 -2.05004 +vn 0.144445 -0.412486 -0.899439 +v 0.156659 1.60248 -2.06023 +vn 0.094471 -0.411186 -0.906643 +v 0.117287 1.56759 -2.04755 +vn 0.069382 -0.433242 -0.898603 +v 0.078661 1.60286 -2.06633 +vn 0.0399828 -0.410273 -0.911086 +v 0.303376 1.47057 -1.9668 +vn 0.194267 -0.513135 -0.836034 +v 0.264741 1.43809 -1.95463 +vn 0.168076 -0.540923 -0.824107 +v 0.229071 1.46813 -1.98023 +vn 0.144116 -0.513132 -0.846124 +v 0.153573 1.46657 -1.9899 +vn 0.0949781 -0.512526 -0.853403 +v 0.114789 1.4346 -1.97386 +vn 0.0696603 -0.540392 -0.838525 +v 0.077173 1.46596 -1.99576 +vn 0.0397911 -0.512034 -0.858043 +v 0.235375 1.67412 -2.08054 +vn 0.144204 -0.370125 -0.917722 +v 0.236432 1.7482 -2.10844 +vn 0.144032 -0.332893 -0.9319 +v 0.27448 1.71016 -2.08799 +vn 0.169943 -0.350907 -0.92086 +v 0.23685 1.82425 -2.13398 +vn 0.144086 -0.300514 -0.942831 +v 0.236567 1.9018 -2.15742 +vn 0.14447 -0.272644 -0.951207 +v 0.275499 1.86104 -2.13896 +vn 0.170813 -0.285405 -0.943063 +v 0.079149 1.67594 -2.09709 +vn 0.0399069 -0.36811 -0.928925 +v 0.07944 1.75144 -2.12517 +vn 0.0398025 -0.331336 -0.942673 +v 0.118806 1.71322 -2.10905 +vn 0.0683487 -0.348782 -0.934708 +v 0.079502 1.82884 -2.15082 +vn 0.0397525 -0.299808 -0.953171 +v 0.079321 1.90764 -2.1743 +vn 0.0397397 -0.272981 -0.961198 +v 0.11907 1.8675 -2.16039 +vn 0.0675466 -0.285345 -0.956042 +v 0.313108 4.89288 1.96966 +vn 0.551998 0.82648 -0.110585 +v 0.357022 4.85891 1.96068 +vn 0.645601 0.763364 -0.0217948 +v 0.333743 4.86831 1.90716 +vn 0.521979 0.840072 -0.147705 +v 0.380735 4.83379 1.89226 +vn 0.603329 0.793652 -0.0781642 +v 0.348117 4.84821 1.8446 +vn 0.508946 0.851464 -0.126424 +v 0.405815 4.81375 1.94075 +vn 0.712441 0.699458 0.0564544 +v 0.431856 4.79041 1.86825 +vn 0.665146 0.746709 0.00252445 +v 0.398263 4.81346 1.82617 +vn 0.570795 0.817777 -0.0737083 +v 0.287622 4.89521 1.91589 +vn 0.419919 0.883684 -0.20681 +v 0.270828 4.91769 1.97257 +vn 0.434513 0.878179 -0.199999 +v 0.238821 4.91614 1.9217 +vn 0.311389 0.91686 -0.249809 +v 0.299113 4.87654 1.85674 +vn 0.424791 0.890913 -0.160708 +v 0.247632 4.89921 1.86537 +vn 0.325602 0.928056 -0.180819 +v 0.284182 4.91848 2.02679 +vn 0.575814 0.817567 0.00481855 +v 0.247875 4.93985 2.02197 +vn 0.453479 0.882383 -0.125529 +v 0.244439 4.94222 2.07234 +vn 0.536493 0.821525 0.193059 +v 0.226243 4.93624 1.97395 +vn 0.314227 0.910288 -0.269512 +v 0.210463 4.95479 2.01789 +vn 0.325907 0.916786 -0.230841 +v 0.216959 4.95901 2.05979 +vn 0.432045 0.901634 0.0198182 +v 0.323876 4.88633 2.02702 +vn 0.668671 0.735467 0.109399 +v 0.372633 4.83841 2.01657 +vn 0.741403 0.647573 0.175984 +v 0.27556 4.91434 2.08514 +vn 0.604767 0.724024 0.331732 +v 0.320747 4.86962 2.08563 +vn 0.681811 0.588172 0.434957 +v 0.766596 1.34723 -1.61627 +vn 0.525487 -0.643156 -0.556968 +v 0.812293 1.3637 -1.59059 +vn 0.550191 -0.629469 -0.548689 +v 0.801866 1.3249 -1.55401 +vn 0.535819 -0.667394 -0.517188 +v 0.849355 1.38165 -1.57291 +vn 0.572344 -0.61267 -0.545031 +v 0.870953 1.42419 -1.59539 +vn 0.590069 -0.567839 -0.573914 +v 0.88303 1.38952 -1.5456 +vn 0.587753 -0.608507 -0.533166 +v 0.791175 1.43291 -1.68095 +vn 0.554938 -0.555988 -0.618806 +v 0.838025 1.44903 -1.65178 +vn 0.583836 -0.543398 -0.603203 +v 0.823158 1.40375 -1.62308 +vn 0.56576 -0.586787 -0.579307 +v 0.890667 1.49351 -1.63819 +vn 0.608692 -0.503515 -0.61316 +v 0.910775 1.46567 -1.59386 +vn 0.609026 -0.535537 -0.585054 +v 0.829178 1.30773 -1.50125 +vn 0.543156 -0.686539 -0.48337 +v 0.787841 1.28473 -1.51351 +vn 0.518137 -0.707159 -0.481103 +v 0.750053 1.17452 -1.36564 +vn 0.453008 -0.799905 -0.393619 +v 0.73595 1.19688 -1.42545 +vn 0.463037 -0.781407 -0.41833 +v 0.784997 1.22114 -1.41377 +vn 0.491892 -0.758591 -0.427295 +v 0.84823 1.34612 -1.53151 +vn 0.561867 -0.649436 -0.512384 +v 0.903376 1.36481 -1.49319 +vn 0.574912 -0.636726 -0.513864 +v 0.865523 1.31931 -1.47587 +vn 0.554887 -0.67879 -0.480983 +v 0.826703 1.20918 -1.3426 +vn 0.49078 -0.76768 -0.41207 +v 0.824729 1.2391 -1.39873 +vn 0.511555 -0.742436 -0.432551 +v 0.859203 1.25493 -1.38414 +vn 0.523471 -0.730751 -0.438157 +v 0.741225 1.25906 -1.52455 +vn 0.492627 -0.726058 -0.479748 +v 0.696065 1.21655 -1.50247 +vn 0.452796 -0.766533 -0.455414 +v 0.699744 1.25111 -1.5535 +vn 0.467 -0.733915 -0.493234 +v 0.647076 1.2349 -1.57737 +vn 0.433496 -0.750694 -0.498538 +v 0.589657 1.18373 -1.54363 +vn 0.378769 -0.801611 -0.462553 +v 0.591287 1.21854 -1.59873 +vn 0.392371 -0.768933 -0.504763 +v 0.694676 1.15605 -1.38952 +vn 0.419121 -0.82182 -0.385939 +v 0.693545 1.18499 -1.44874 +vn 0.436694 -0.794835 -0.421349 +v 0.642304 1.16803 -1.46778 +vn 0.402638 -0.813456 -0.419729 +v 0.587072 1.12203 -1.42307 +vn 0.34291 -0.861605 -0.374231 +v 0.587126 1.15127 -1.48559 +vn 0.361925 -0.832954 -0.418566 +v 0.691763 1.28501 -1.60853 +vn 0.474296 -0.700945 -0.532653 +v 0.661841 1.31528 -1.67101 +vn 0.462226 -0.668276 -0.582884 +v 0.715937 1.3309 -1.64369 +vn 0.497454 -0.655448 -0.568267 +v 0.72793 1.37474 -1.68069 +vn 0.51092 -0.611529 -0.604147 +v 0.687243 1.40744 -1.74416 +vn 0.489444 -0.5772 -0.653671 +v 0.741252 1.4201 -1.71265 +vn 0.525497 -0.566229 -0.63501 +v 0.580232 1.25137 -1.65391 +vn 0.394111 -0.73504 -0.551719 +v 0.543575 1.27098 -1.7028 +vn 0.362537 -0.712917 -0.600264 +v 0.604646 1.29778 -1.6939 +vn 0.419315 -0.684956 -0.595827 +v 0.616468 1.34385 -1.73514 +vn 0.43353 -0.637641 -0.636761 +v 0.563217 1.36564 -1.78923 +vn 0.389551 -0.61417 -0.686327 +v 0.628164 1.39305 -1.77335 +vn 0.445016 -0.5887 -0.674828 +v 0.286545 1.25128 -1.78822 +vn 0.17675 -0.737404 -0.651916 +v 0.359093 1.30702 -1.82496 +vn 0.23581 -0.681369 -0.692914 +v 0.355332 1.25767 -1.77443 +vn 0.222184 -0.729836 -0.646509 +v 0.422321 1.26551 -1.75769 +vn 0.268533 -0.721392 -0.638344 +v 0.49385 1.31954 -1.78234 +vn 0.326941 -0.664145 -0.672325 +v 0.486567 1.27268 -1.73611 +vn 0.314409 -0.713465 -0.62619 +v 0.29526 1.35275 -1.88477 +vn 0.188689 -0.627761 -0.75519 +v 0.333292 1.38301 -1.89897 +vn 0.216219 -0.59782 -0.77192 +v 0.366335 1.36077 -1.87103 +vn 0.249071 -0.621601 -0.742682 +v 0.435016 1.36473 -1.84949 +vn 0.290593 -0.618871 -0.729763 +v 0.50932 1.42586 -1.86604 +vn 0.351264 -0.559312 -0.750855 +v 0.50203 1.37079 -1.82551 +vn 0.340171 -0.610778 -0.715006 +v 0.350389 1.21321 -1.72212 +vn 0.21197 -0.777284 -0.592366 +v 0.346132 1.17273 -1.66623 +vn 0.200712 -0.820888 -0.534656 +v 0.279009 1.16588 -1.67809 +vn 0.157566 -0.828714 -0.537035 +v 0.342846 1.13626 -1.60673 +vn 0.188343 -0.859683 -0.474839 +v 0.34084 1.10387 -1.54357 +vn 0.174938 -0.893346 -0.41392 +v 0.274585 1.09714 -1.55371 +vn 0.135261 -0.901245 -0.411658 +v 0.47898 1.22954 -1.68719 +vn 0.299324 -0.759393 -0.577692 +v 0.473639 1.19089 -1.63518 +vn 0.289981 -0.802179 -0.521939 +v 0.411507 1.1813 -1.652 +vn 0.24455 -0.811383 -0.530899 +v 0.470697 1.15569 -1.57871 +vn 0.280248 -0.837022 -0.469953 +v 0.468356 1.12323 -1.51777 +vn 0.264783 -0.869344 -0.417289 +v 0.405533 1.11252 -1.53155 +vn 0.21801 -0.8829 -0.415884 +v 0.208441 1.12431 -1.62645 +vn 0.107947 -0.873655 -0.474419 +v 0.210565 1.16076 -1.68754 +vn 0.116538 -0.834565 -0.538443 +v 0.141122 1.15736 -1.69471 +vn 0.0788397 -0.838738 -0.538797 +v 0.070131 1.12081 -1.64096 +vn 0.0390112 -0.877808 -0.477421 +v 0.070941 1.15746 -1.70261 +vn 0.0421357 -0.839158 -0.542253 +v 0.20665 1.0643 -1.49373 +vn 0.0910357 -0.934101 -0.345208 +v 0.207082 1.09215 -1.56184 +vn 0.0992626 -0.906701 -0.409926 +v 0.13864 1.08887 -1.56811 +vn 0.0657312 -0.91013 -0.409076 +v 0.070966 1.05977 -1.50507 +vn 0.0281531 -0.937369 -0.347197 +v 0.06956 1.08855 -1.57586 +vn 0.0355003 -0.911063 -0.410736 +v 0.213256 1.20147 -1.74511 +vn 0.12527 -0.790549 -0.59945 +v 0.214671 1.24739 -1.8008 +vn 0.136598 -0.744414 -0.653596 +v 0.21791 1.29652 -1.85151 +vn 0.140024 -0.689556 -0.710567 +v 0.22294 1.34876 -1.89706 +vn 0.140055 -0.629626 -0.76417 +v 0.257323 1.32349 -1.86847 +vn 0.162904 -0.658166 -0.735037 +v 0.069616 1.197 -1.75925 +vn 0.0381596 -0.798263 -0.6011 +v 0.072897 1.24105 -1.81259 +vn 0.0357516 -0.745487 -0.665561 +v 0.108242 1.21879 -1.78387 +vn 0.0649687 -0.771923 -0.632387 +v 0.074027 1.29067 -1.86384 +vn 0.0373441 -0.690301 -0.722558 +v 0.07516 1.3447 -1.91146 +vn 0.0385644 -0.631655 -0.77429 +v 0.111602 1.31793 -1.88611 +vn 0.0674724 -0.660559 -0.747736 +v 0.426079 3.76262 -0.058507 +vn 0.533793 -0.611832 -0.583718 +v 0.448731 3.74261 -0.016303 +vn 0.568479 -0.584469 -0.578988 +v 0.400257 3.71261 -0.03273 +vn 0.550146 -0.553699 -0.625106 +v 0.369604 3.6623 -0.019117 +vn 0.568739 -0.457077 -0.683825 +v 0.410577 3.6169 0.043661 +vn 0.64997 -0.318075 -0.690194 +v 0.346674 3.61314 -0.010562 +vn 0.597956 -0.303889 -0.741688 +v 0.572858 3.78736 0.074164 +vn 0.638254 -0.58886 -0.495859 +v 0.596112 3.74254 0.156171 +vn 0.688349 -0.526818 -0.498636 +v 0.535858 3.73027 0.091212 +vn 0.648048 -0.537277 -0.539785 +v 0.50065 3.67595 0.099113 +vn 0.665662 -0.45674 -0.590155 +v 0.527618 3.62618 0.16451 +vn 0.727831 -0.333718 -0.599078 +v 0.471077 3.62126 0.102548 +vn 0.69223 -0.32763 -0.643022 +v 0.324915 3.70446 -0.086017 +vn 0.48481 -0.556956 -0.674359 +v 0.246385 3.69776 -0.130751 +vn 0.402578 -0.557854 -0.725762 +v 0.292927 3.72386 -0.124528 +vn 0.436122 -0.592993 -0.676873 +v 0.165326 3.69251 -0.164995 +vn 0.300426 -0.550138 -0.779161 +v 0.081153 3.68839 -0.186422 +vn 0.148836 -0.550448 -0.821495 +v 0.125374 3.71208 -0.193176 +vn 0.223149 -0.594451 -0.77255 +v 0.279699 3.60961 -0.058634 +vn 0.537228 -0.271057 -0.798696 +v 0.209826 3.60279 -0.098214 +vn 0.449757 -0.24702 -0.858312 +v 0.224989 3.65193 -0.111276 +vn 0.420263 -0.437745 -0.794833 +v 0 3.62789 -0.163153 +vn -8.88365e-18 -0.312207 -0.950014 +v 0.064559 3.64883 -0.165877 +vn 0.137467 -0.422965 -0.895658 +v 0.069789 3.60285 -0.148526 +vn 0.172982 -0.22765 -0.958255 +v 0.226837 3.76385 -0.198466 +vn 0.327631 -0.655633 -0.680297 +v 0.185506 3.78073 -0.232355 +vn 0.26736 -0.658868 -0.703144 +v 0.234337 3.78462 -0.214778 +vn 0.327876 -0.657948 -0.677939 +v 0.258501 3.85416 -0.271993 +vn 0.330205 -0.665962 -0.668924 +v 0.21315 3.8727 -0.310343 +vn 0.276906 -0.661571 -0.696884 +v 0.266163 3.87783 -0.291714 +vn 0.332056 -0.660202 -0.6737 +v 0.086205 3.73222 -0.218531 +vn 0.138127 -0.624007 -0.769114 +v 0 3.76146 -0.251922 +vn -5.53163e-18 -0.666291 -0.745692 +v 0.095089 3.77504 -0.253994 +vn 0.146858 -0.667447 -0.730032 +v 0.050859 3.83475 -0.316585 +vn 0.0787919 -0.675343 -0.733282 +v 0 3.85086 -0.334165 +vn -8.84315e-18 -0.672123 -0.74044 +v 0.052473 3.85743 -0.337307 +vn 0.0784217 -0.672009 -0.736379 +v 0.370678 3.80018 -0.145541 +vn 0.462155 -0.647817 -0.605596 +v 0.414169 3.80655 -0.11719 +vn 0.49667 -0.645892 -0.579778 +v 0.401363 3.78381 -0.103059 +vn 0.494561 -0.642522 -0.585299 +v 0.536903 3.82866 -0.020665 +vn 0.586788 -0.628802 -0.510185 +v 0.574779 3.83678 0.014752 +vn 0.611853 -0.62367 -0.486489 +v 0.557888 3.81139 0.025855 +vn 0.608241 -0.620012 -0.495609 +v 0.419313 3.89903 -0.216171 +vn 0.469552 -0.646276 -0.601538 +v 0.467936 3.9077 -0.185327 +vn 0.506695 -0.642882 -0.574425 +v 0.455063 3.88217 -0.167693 +vn 0.502163 -0.649842 -0.570559 +v 0.603604 3.93767 -0.079587 +vn 0.605344 -0.620105 -0.499027 +v 0.645055 3.94868 -0.040793 +vn 0.633839 -0.61287 -0.471846 +v 0.628321 3.92062 -0.026184 +vn 0.625927 -0.621816 -0.470702 +v 0.616159 4.51708 1.78732 +vn 0.864859 -0.126708 0.485761 +v 0.610634 4.49002 1.78116 +vn 0.747683 -0.452002 0.486482 +v 0.636939 4.49508 1.73987 +vn 0.848423 -0.294305 0.439958 +v 0.662934 4.50401 1.68973 +vn 0.898523 -0.163125 0.407489 +v 0.652534 4.47558 1.68716 +vn 0.779705 -0.511306 0.361422 +v 0.677415 4.48984 1.64813 +vn 0.857012 -0.376926 0.351364 +v 0.589722 4.47401 1.7894 +vn 0.535901 -0.706979 0.461509 +v 0.623462 4.47321 1.74052 +vn 0.644404 -0.6495 0.4036 +v 0.626812 4.45604 1.70203 +vn 0.602651 -0.721976 0.339946 +v 0.649817 4.45447 1.65159 +vn 0.66183 -0.692705 0.286603 +v 0.642867 4.51113 1.73507 +vn 0.895213 -0.0677788 0.440454 +v 0.652822 4.5375 1.71117 +vn 0.903178 0.140801 0.405518 +v 0.611743 4.55218 1.79419 +vn 0.891056 0.13428 0.433577 +v 0.632258 4.57983 1.7293 +vn 0.861422 0.352533 0.365612 +v 0.684096 4.50611 1.64234 +vn 0.917855 -0.111919 0.38081 +v 0.691749 4.53723 1.62323 +vn 0.913677 0.126618 0.386216 +v 0.669117 4.57807 1.64641 +vn 0.850033 0.366983 0.377846 +v 0.57159 4.54706 1.86822 +vn 0.828227 -0.113022 0.548877 +v 0.569537 4.57705 1.87033 +vn 0.873155 0.122122 0.471896 +v 0.526531 4.58623 1.93753 +vn 0.771776 -0.105342 0.627108 +v 0.593662 4.59246 1.80888 +vn 0.86963 0.329597 0.367572 +v 0.556454 4.61325 1.87816 +vn 0.871301 0.300063 0.388326 +v 0.525034 4.61717 1.93779 +vn 0.840519 0.135101 0.524666 +v 0.563806 4.52305 1.86888 +vn 0.695825 -0.376353 0.611707 +v 0.587829 4.504 1.82579 +vn 0.753017 -0.35064 0.556792 +v 0.584076 4.49239 1.82049 +vn 0.603003 -0.594535 0.531898 +v 0.517798 4.56399 1.93927 +vn 0.596211 -0.369428 0.71278 +v 0.506072 4.54253 1.93244 +vn 0.351124 -0.608805 0.711385 +v 0.150058 5.32809 1.126 +vn 0.220754 0.649653 0.727475 +v 0.076071 5.32916 1.14055 +vn 0.100065 0.663373 0.741568 +v 0.145692 5.28216 1.16756 +vn 0.217479 0.630821 0.744827 +v 0.073413 5.28452 1.18003 +vn 0.0974668 0.641932 0.760541 +v 0.13851 5.23585 1.20735 +vn 0.204734 0.599937 0.773408 +v 0 5.31969 1.15376 +vn -6.63558e-18 0.663435 0.748234 +v 0 5.27462 1.1927 +vn -1.10635e-18 0.636725 0.771091 +v 0.069762 5.23774 1.21824 +vn 0.0915616 0.60486 0.791051 +v 0.21381 5.27817 1.1445 +vn 0.311264 0.616391 0.72331 +v 0.20436 5.23055 1.18772 +vn 0.302191 0.592643 0.746629 +v 0.218512 5.32632 1.10018 +vn 0.316792 0.632777 0.706566 +v 0.15295 5.36993 1.08706 +vn 0.223107 0.654194 0.722671 +v 0.222745 5.37126 1.05756 +vn 0.327388 0.634282 0.700359 +v 0.156955 5.40353 1.05552 +vn 0.235023 0.631775 0.738664 +v 0.295381 5.37276 1.01622 +vn 0.408349 0.638916 0.651949 +v 0.232693 5.40515 1.02272 +vn 0.35031 0.622391 0.699937 +v 0.077837 5.36902 1.10403 +vn 0.101646 0.667351 0.737774 +v 0 5.36038 1.11682 +vn 2.55607e-06 0.672128 0.740435 +v 0.079106 5.40138 1.07486 +vn 0.107356 0.641557 0.759526 +v 0 5.39414 1.08627 +vn 1.85294e-06 0.654198 0.756323 +v 0.398204 5.11429 -0.42438 +vn 0.490171 0.516816 -0.701878 +v 0.444005 5.09525 -0.404241 +vn 0.537851 0.483015 -0.690951 +v 0.416446 5.06671 -0.443486 +vn 0.521901 0.444884 -0.727803 +v 0.404391 5.01227 -0.482767 +vn 0.512447 0.397451 -0.761203 +v 0.446592 4.96302 -0.476799 +vn 0.550998 0.342075 -0.761174 +v 0.404413 4.96581 -0.504863 +vn 0.512257 0.34229 -0.787674 +v 0.534799 5.12782 -0.299172 +vn 0.607942 0.5126 -0.606339 +v 0.597611 5.11083 -0.245742 +vn 0.661177 0.486891 -0.570774 +v 0.551116 5.08417 -0.317032 +vn 0.630276 0.461631 -0.624218 +v 0.547908 5.03097 -0.356484 +vn 0.622992 0.415532 -0.662732 +v 0.59339 4.98882 -0.336601 +vn 0.667864 0.371644 -0.644856 +v 0.558302 4.98343 -0.374535 +vn 0.635582 0.372392 -0.676283 +v 0.341036 5.06025 -0.4963 +vn 0.452127 0.445117 -0.77295 +v 0.260646 5.05319 -0.541798 +vn 0.369389 0.442409 -0.817206 +v 0.295301 5.08141 -0.508886 +vn 0.400108 0.478331 -0.781737 +v 0.176166 5.04884 -0.576227 +vn 0.264362 0.440573 -0.857909 +v 0.087639 5.04429 -0.599193 +vn 0.129182 0.443442 -0.886945 +v 0.130678 5.07287 -0.575985 +vn 0.199846 0.474667 -0.857178 +v 0.35869 4.96589 -0.53292 +vn 0.472393 0.334242 -0.815553 +v 0.28037 4.94554 -0.580764 +vn 0.384996 0.301749 -0.872196 +v 0.313223 4.98293 -0.550766 +vn 0.425687 0.34696 -0.835709 +v 0.190463 4.93617 -0.617993 +vn 0.282683 0.286782 -0.91534 +v 0.096651 4.93001 -0.642168 +vn 0.154243 0.277372 -0.948301 +v 0.140416 4.96471 -0.622239 +vn 0.218033 0.324635 -0.920366 +v 0.247225 5.1033 -0.517764 +vn 0.341149 0.520725 -0.7826 +v 0.164591 5.1479 -0.5178 +vn 0.240692 0.573837 -0.782802 +v 0.242976 5.15077 -0.486041 +vn 0.332272 0.569048 -0.752183 +v 0.235783 5.19515 -0.453367 +vn 0.315232 0.62138 -0.717297 +v 0.155966 5.23595 -0.445904 +vn 0.215295 0.682355 -0.698598 +v 0.230047 5.23668 -0.417188 +vn 0.29745 0.674011 -0.67619 +v 0.083559 5.09601 -0.571476 +vn 0.120792 0.514867 -0.848718 +v 0 5.12818 -0.557734 +vn 2.21836e-18 0.551964 -0.833868 +v 0.083521 5.1434 -0.540381 +vn 0.129956 0.572832 -0.809305 +v 0.081048 5.18956 -0.505566 +vn 0.124314 0.630333 -0.766307 +v 0 5.21979 -0.486295 +vn 0 0.671846 -0.740691 +v 0.07904 5.23296 -0.467276 +vn 0.117295 0.685761 -0.718313 +v 0.31764 5.15442 -0.44525 +vn 0.408805 0.563274 -0.718053 +v 0.384427 5.16134 -0.397458 +vn 0.47025 0.557564 -0.684096 +v 0.569447 5.15731 -0.23594 +vn 0.629191 0.539802 -0.559224 +v 0.505464 5.1712 -0.289328 +vn 0.574254 0.557966 -0.599088 +v 0.299606 5.23738 -0.381338 +vn 0.366633 0.66575 -0.64989 +v 0.362256 5.24102 -0.337917 +vn 0.430264 0.65908 -0.616836 +v 0.368633 5.20251 -0.372455 +vn 0.443712 0.61382 -0.652951 +v 0.490375 5.2132 -0.262423 +vn 0.553757 0.605379 -0.571726 +v 0.436208 5.20487 -0.318887 +vn 0.50326 0.611158 -0.610913 +v 0.458509 5.23868 -0.26423 +vn 0.511907 0.641338 -0.571521 +v 0.457779 4.5835 -0.534274 +vn 0.519838 -0.0475948 -0.852938 +v 0.501653 4.62456 -0.507167 +vn 0.563839 -0.00148889 -0.825883 +v 0.509447 4.59299 -0.501331 +vn 0.566415 -0.0292707 -0.8236 +v 0.481612 4.45673 -0.504031 +vn 0.526473 -0.160024 -0.834996 +v 0.529918 4.4987 -0.478773 +vn 0.573138 -0.113747 -0.811526 +v 0.535666 4.46758 -0.469868 +vn 0.574828 -0.142428 -0.805783 +v 0.650843 4.62623 -0.386247 +vn 0.690015 0.0299414 -0.723176 +v 0.682804 4.66839 -0.351089 +vn 0.72129 0.0779513 -0.688233 +v 0.692784 4.63868 -0.343486 +vn 0.726615 0.0516788 -0.685098 +v 0.682903 4.50561 -0.35068 +vn 0.704878 -0.0832878 -0.704422 +v 0.718986 4.54944 -0.316481 +vn 0.740315 -0.0313223 -0.67153 +v 0.726373 4.51978 -0.306381 +vn 0.743934 -0.0602239 -0.665534 +v 0.410278 4.54263 -0.55824 +vn 0.471198 -0.0922267 -0.877192 +v 0.404332 4.57489 -0.564385 +vn 0.469731 -0.0646096 -0.880442 +v 0.23509 4.55512 -0.633803 +vn 0.295865 -0.107196 -0.949196 +v 0.179332 4.51772 -0.644257 +vn 0.229902 -0.144285 -0.962459 +v 0.176575 4.55098 -0.649515 +vn 0.22962 -0.117653 -0.966143 +v 0.429727 4.41547 -0.525969 +vn 0.475842 -0.203916 -0.855566 +v 0.425672 4.44681 -0.535225 +vn 0.474863 -0.175863 -0.862309 +v 0.248045 4.42404 -0.60725 +vn 0.297791 -0.215001 -0.930105 +v 0.188497 4.38707 -0.614943 +vn 0.231061 -0.250235 -0.940209 +v 0.18655 4.41916 -0.623569 +vn 0.230687 -0.224351 -0.946811 +v 0.42787 4.71097 -0.550981 +vn 0.510561 0.0658377 -0.857317 +v 0.3846 4.67179 -0.577204 +vn 0.46467 0.0203445 -0.88525 +v 0.377614 4.7039 -0.579687 +vn 0.462673 0.0494182 -0.885151 +v 0.394458 4.83563 -0.55236 +vn 0.496801 0.188196 -0.847214 +v 0.355864 4.79871 -0.580761 +vn 0.455379 0.14106 -0.879052 +v 0.347287 4.8301 -0.579687 +vn 0.451987 0.172197 -0.875246 +v 0.219076 4.68763 -0.645824 +vn 0.293659 0.00795701 -0.955877 +v 0.167542 4.65112 -0.659369 +vn 0.228875 -0.031978 -0.972931 +v 0.164367 4.68433 -0.660794 +vn 0.228561 -0.00243621 -0.973526 +v 0.201092 4.81793 -0.641802 +vn 0.286278 0.133242 -0.948837 +v 0.154179 4.78234 -0.658591 +vn 0.226504 0.0930583 -0.969554 +v 0.149725 4.81938 -0.65552 +vn 0.230092 0.128383 -0.964663 +v 0.467691 4.74991 -0.521778 +vn 0.551107 0.111669 -0.826928 +v 0.476509 4.71884 -0.51963 +vn 0.55464 0.0830367 -0.827937 +v 0.6105 4.74641 -0.410093 +vn 0.669687 0.136894 -0.729918 +v 0.639165 4.78591 -0.373778 +vn 0.696721 0.180981 -0.694137 +v 0.650539 4.75681 -0.369464 +vn 0.703295 0.155647 -0.69365 +v 0.430391 4.87184 -0.520917 +vn 0.53125 0.233833 -0.814307 +v 0.440733 4.8414 -0.522384 +vn 0.538006 0.202302 -0.818305 +v 0.566592 4.86318 -0.419239 +vn 0.644251 0.243789 -0.724919 +v 0.592865 4.89935 -0.381377 +vn 0.66681 0.283746 -0.689096 +v 0.604435 4.87154 -0.381146 +vn 0.674856 0.257957 -0.691395 +v 0.393892 4.32441 1.91224 +vn 0.473006 -0.7882 0.393707 +v 0.335002 4.31639 1.95712 +vn 0.371243 -0.837977 0.399966 +v 0.363022 4.30438 1.89995 +vn 0.377063 -0.859486 0.34512 +v 0.461107 4.31217 1.78267 +vn 0.556163 -0.763859 0.327417 +v 0.424597 4.31595 1.85148 +vn 0.486666 -0.808019 0.332056 +v 0.397162 4.29536 1.83619 +vn 0.438059 -0.828384 0.349119 +v 0.270035 4.3104 1.99682 +vn 0.282115 -0.873466 0.396822 +v 0.294317 4.29577 1.94252 +vn 0.279232 -0.89307 0.352782 +v 0.324339 4.28243 1.88312 +vn 0.320055 -0.874663 0.364046 +v 0.442146 4.33557 1.86868 +vn 0.623196 -0.668917 0.405188 +v 0.474833 4.33084 1.8041 +vn 0.640602 -0.684405 0.348164 +v 0.475764 4.35103 1.83318 +vn 0.804632 -0.389379 0.448276 +v 0.51216 4.33195 1.73072 +vn 0.699682 -0.629841 0.337261 +v 0.509806 4.34918 1.76473 +vn 0.821397 -0.406676 0.399903 +v 0.414856 4.34476 1.92027 +vn 0.623505 -0.606265 0.493644 +v 0.369281 4.33743 1.96181 +vn 0.518474 -0.685452 0.511215 +v 0.396754 4.35863 1.95369 +vn 0.693146 -0.352809 0.62855 +v 0.444636 4.35641 1.88972 +vn 0.792764 -0.334041 0.509845 +v 0.422852 4.35952 1.92321 +vn 0.758394 -0.30211 0.577554 +v 0.312986 4.33188 2.00486 +vn 0.421778 -0.747529 0.513132 +v 0.351265 4.35496 1.99727 +vn 0.608568 -0.448687 0.654465 +v 0.296631 4.35117 2.04027 +vn 0.51351 -0.539425 0.667329 +v 0.251301 4.32735 2.04305 +vn 0.331858 -0.798489 0.50228 +v 0.226434 5.40359 -0.190976 +vn 0.250606 0.847663 -0.467615 +v 0.153231 5.43513 -0.16579 +vn 0.174457 0.875966 -0.44972 +v 0.228185 5.42962 -0.140351 +vn 0.249353 0.866082 -0.433273 +v 0.229493 5.45349 -0.089517 +vn 0.249257 0.880976 -0.402185 +v 0.154716 5.4819 -0.06584 +vn 0.174969 0.903472 -0.391311 +v 0.230377 5.47523 -0.039155 +vn 0.249364 0.892927 -0.374831 +v 0.07655 5.40927 -0.235575 +vn 0.0931804 0.863387 -0.495862 +v 0 5.42965 -0.206485 +vn 6.63803e-18 0.879797 -0.47535 +v 0.076919 5.43679 -0.185183 +vn 0.0915595 0.882215 -0.461858 +v 0.07725 5.4619 -0.134951 +vn 0.090533 0.897693 -0.431221 +v 0 5.47948 -0.105806 +vn 2.21216e-18 0.909933 -0.414755 +v 0.077762 5.48475 -0.085221 +vn 0.0893211 0.909996 -0.404881 +v 0.301078 5.42128 -0.108264 +vn 0.316559 0.854047 -0.412788 +v 0.371335 5.40994 -0.071232 +vn 0.377463 0.839775 -0.390257 +v 0.366396 5.38602 -0.124623 +vn 0.377759 0.821987 -0.426188 +v 0.438184 5.39512 -0.032062 +vn 0.434513 0.822061 -0.367986 +v 0.500589 5.37619 0.005652 +vn 0.491977 0.798675 -0.346519 +v 0.490834 5.35491 -0.053363 +vn 0.489309 0.781965 -0.386144 +v 0.304247 5.46568 -0.004491 +vn 0.318112 0.880519 -0.351413 +v 0.375779 5.45347 0.037506 +vn 0.376773 0.86726 -0.325425 +v 0.374899 5.43237 -0.016674 +vn 0.377625 0.854267 -0.35725 +v 0.444756 5.43766 0.083689 +vn 0.435292 0.850918 -0.294041 +v 0.51089 5.41789 0.134342 +vn 0.493875 0.829756 -0.259986 +v 0.507455 5.3971 0.067613 +vn 0.493795 0.814564 -0.304388 +v 0.422854 5.3486 -0.140982 +vn 0.436009 0.782952 -0.443714 +v 0.361112 5.36055 -0.175597 +vn 0.379004 0.800623 -0.464068 +v 0.356836 5.33329 -0.223431 +vn 0.38259 0.774552 -0.503681 +v 0.408736 5.29801 -0.233541 +vn 0.438803 0.728823 -0.525612 +v 0.353969 5.30417 -0.267774 +vn 0.392303 0.741447 -0.544384 +v 0.527382 5.31741 -0.077726 +vn 0.539937 0.732019 -0.41547 +v 0.479897 5.3326 -0.108709 +vn 0.491842 0.756742 -0.430619 +v 0.414963 5.32406 -0.189436 +vn 0.436558 0.76011 -0.481299 +v 0.466507 5.30915 -0.162243 +vn 0.497319 0.730232 -0.468439 +v 0.450549 5.29094 -0.205716 +vn 0.49169 0.71308 -0.499758 +v 0.294891 5.36921 -0.209839 +vn 0.319692 0.813704 -0.485471 +v 0.224747 5.37528 -0.240669 +vn 0.253713 0.825034 -0.504924 +v 0.151518 5.37903 -0.265846 +vn 0.179477 0.834576 -0.520837 +v 0.076264 5.37926 -0.285474 +vn 0.0957205 0.84037 -0.533495 +v 0.291931 5.30853 -0.30258 +vn 0.33237 0.753765 -0.566894 +v 0.223982 5.31132 -0.334618 +vn 0.268417 0.762966 -0.588077 +v 0.223758 5.34457 -0.288769 +vn 0.259362 0.797239 -0.545107 +v 0.151627 5.31288 -0.3609 +vn 0.192612 0.772222 -0.605453 +v 0.076614 5.31151 -0.381194 +vn 0.104308 0.777348 -0.620362 +v 0.076245 5.3467 -0.33423 +vn 0.0993697 0.812066 -0.575043 +v 0.281596 5.59402 0.754125 +vn 0.606907 0.777769 0.16352 +v 0.26493 5.58242 0.83661 +vn 0.633026 0.700894 0.328673 +v 0.296763 5.56859 0.797623 +vn 0.657069 0.7041 0.269266 +v 0.324433 5.55717 0.75226 +vn 0.677646 0.701722 0.219959 +v 0.311813 5.55295 0.798013 +vn 0.695671 0.654243 0.29666 +v 0.324116 5.53733 0.802499 +vn 0.720822 0.612207 0.32499 +v 0.236494 5.57149 0.898813 +vn 0.59178 0.631115 0.501488 +v 0.293129 5.54492 0.850222 +vn 0.685747 0.594371 0.420088 +v 0.241823 5.53572 0.929016 +vn 0.616634 0.489927 0.616226 +v 0.26682 5.50608 0.923955 +vn 0.645108 0.440705 0.624191 +v 0.311277 5.57978 0.704323 +vn 0.604673 0.786259 0.127151 +v 0.284135 5.60368 0.660576 +vn 0.548055 0.835227 0.0450814 +v 0.330801 5.57113 0.651885 +vn 0.609061 0.788889 0.0818457 +v 0.302426 5.59341 0.611063 +vn 0.533718 0.845592 0.0109437 +v 0.329245 5.56574 0.70032 +vn 0.645212 0.750837 0.141232 +v 0.345002 5.55152 0.700751 +vn 0.674254 0.720198 0.163393 +v 0.31089 5.58677 0.555596 +vn 0.519094 0.853776 -0.0401126 +v 0.32186 5.58058 0.602128 +vn 0.566088 0.824237 0.0133662 +v 0.3415 5.5668 0.597446 +vn 0.585165 0.810309 0.0313157 +v 0.241107 5.63022 0.688014 +vn 0.5111 0.858372 0.0444311 +v 0.240289 5.62316 0.759506 +vn 0.534546 0.832736 0.144259 +v 0.212169 5.64193 0.738519 +vn 0.422503 0.899653 0.110073 +v 0.26164 5.61645 0.579798 +vn 0.467105 0.882496 -0.0549043 +v 0.227326 5.63703 0.61803 +vn 0.44495 0.89401 -0.0525828 +v 0.201142 5.65084 0.648485 +vn 0.379898 0.924627 -0.0272563 +v 0.238106 5.61062 0.818413 +vn 0.54967 0.796185 0.252888 +v 0.216304 5.60248 0.875372 +vn 0.496709 0.764695 0.410514 +v 0.204276 5.63543 0.797432 +vn 0.404438 0.892504 0.199665 +v 0.198116 5.62469 0.846826 +vn 0.400565 0.863672 0.305971 +v 0.752358 4.98344 1.00972 +vn 0.721296 0.424738 0.54711 +v 0.720453 4.977 1.05202 +vn 0.667049 0.437993 0.602667 +v 0.767691 4.93908 1.02169 +vn 0.741102 0.396715 0.54165 +v 0.711478 4.94741 1.08335 +vn 0.664581 0.450568 0.596088 +v 0.762747 4.89857 1.05793 +vn 0.728803 0.415334 0.544375 +v 0.796725 4.96974 0.954188 +vn 0.78701 0.399101 0.47046 +v 0.826988 4.92749 0.934919 +vn 0.824708 0.352926 0.441927 +v 0.833461 4.97429 0.881727 +vn 0.82963 0.400954 0.388522 +v 0.841324 4.87215 0.950114 +vn 0.830569 0.354117 0.429833 +v 0.804902 4.91143 0.985103 +vn 0.799899 0.352842 0.485452 +v 0.799644 4.88882 1.01056 +vn 0.786964 0.377894 0.487734 +v 0.867315 4.93157 0.846201 +vn 0.871671 0.346902 0.346192 +v 0.849165 4.92969 0.889715 +vn 0.849441 0.340528 0.403101 +v 0.862351 4.89672 0.887339 +vn 0.864401 0.315526 0.391478 +v 0.773131 5.00847 0.958064 +vn 0.750315 0.452545 0.481903 +v 0.736963 5.01724 1.00161 +vn 0.688496 0.478219 0.545234 +v 0.749345 5.03871 0.963377 +vn 0.708299 0.515399 0.482366 +v 0.800104 5.01384 0.906895 +vn 0.785028 0.457121 0.418058 +v 0.774084 5.03645 0.927034 +vn 0.739019 0.510647 0.43942 +v 0.713234 5.00547 1.03856 +vn 0.644082 0.475732 0.59903 +v 0.694954 5.04449 1.02458 +vn 0.610172 0.52783 0.590835 +v 0.730463 5.21339 0.108625 +vn 0.770881 0.572538 -0.279181 +v 0.762935 5.17232 0.120374 +vn 0.808527 0.522661 -0.270387 +v 0.744466 5.15721 0.045048 +vn 0.794221 0.509959 -0.330386 +v 0.792481 5.13041 0.133551 +vn 0.84004 0.476235 -0.25987 +v 0.819558 5.08801 0.148878 +vn 0.866118 0.434456 -0.247158 +v 0.80165 5.07084 0.067025 +vn 0.85132 0.424271 -0.308622 +v 0.752552 5.23791 0.251754 +vn 0.784906 0.598793 -0.159278 +v 0.783875 5.19806 0.266699 +vn 0.821028 0.550758 -0.150264 +v 0.77586 5.18615 0.194554 +vn 0.817426 0.53611 -0.210715 +v 0.812134 5.15795 0.284153 +vn 0.851594 0.505676 -0.138127 +v 0.837077 5.11743 0.298989 +vn 0.87662 0.462717 -0.132022 +v 0.831069 5.10417 0.228094 +vn 0.874485 0.447437 -0.187287 +v 0.749009 5.09813 -0.024258 +vn 0.80297 0.455981 -0.383824 +v 0.719833 5.14148 -0.030575 +vn 0.773501 0.498851 -0.390951 +v 0.688022 5.12599 -0.105898 +vn 0.743733 0.492541 -0.451956 +v 0.677521 5.06778 -0.178754 +vn 0.74057 0.443969 -0.504428 +v 0.648734 5.11417 -0.177553 +vn 0.71221 0.48762 -0.504958 +v 0.802216 5.00973 -0.005328 +vn 0.851963 0.384535 -0.355377 +v 0.776913 5.05527 -0.013631 +vn 0.827902 0.422535 -0.368839 +v 0.744513 5.03702 -0.097462 +vn 0.799274 0.41249 -0.437051 +v 0.738154 5.00306 -0.138064 +vn 0.793927 0.383547 -0.471775 +v 0.703088 5.01858 -0.181268 +vn 0.762039 0.396906 -0.511627 +v 0.688246 5.18296 -0.036323 +vn 0.736249 0.547363 -0.397909 +v 0.65138 5.22473 -0.042295 +vn 0.692156 0.597738 -0.404511 +v 0.677001 5.23737 0.026577 +vn 0.713757 0.610283 -0.343667 +v 0.615955 5.26243 -0.043025 +vn 0.645363 0.65036 -0.400672 +v 0.573232 5.2888 -0.064133 +vn 0.592799 0.689673 -0.415861 +v 0.594383 5.30538 -0.001119 +vn 0.605619 0.710508 -0.358336 +v 0.618409 5.14912 -0.184542 +vn 0.678945 0.523277 -0.51499 +v 0.593396 5.19202 -0.170914 +vn 0.649568 0.573668 -0.498965 +v 0.559243 5.23302 -0.164813 +vn 0.608656 0.629054 -0.483559 +v 0.534794 5.21325 -0.216681 +vn 0.589561 0.599789 -0.540991 +v 0.527919 5.24951 -0.180678 +vn 0.56389 0.658464 -0.498451 +v 0.654229 5.29028 0.083645 +vn 0.673186 0.677496 -0.296342 +v 0.694477 5.25307 0.097173 +vn 0.725788 0.625041 -0.287324 +v 0.707651 5.26711 0.168557 +vn 0.735183 0.637864 -0.229423 +v 0.677143 5.31836 0.229902 +vn 0.692013 0.701248 -0.171375 +v 0.717434 5.27783 0.239459 +vn 0.741922 0.649507 -0.166411 +v 0.557753 5.35255 0.038937 +vn 0.552445 0.767149 -0.326016 +v 0.608904 5.3238 0.065004 +vn 0.614284 0.72617 -0.308758 +v 0.620219 5.34245 0.138024 +vn 0.62046 0.741151 -0.256368 +v 0.573997 5.39391 0.189101 +vn 0.559023 0.796726 -0.22961 +v 0.631142 5.35718 0.215886 +vn 0.637417 0.746191 -0.19209 +v 0.121002 3.72565 -2.02007 +vn 0.402801 0.877125 -0.261538 +v 0.126958 3.73243 -1.92988 +vn 0.407424 0.908319 0.0946655 +v 0.153631 3.71662 -1.97883 +vn 0.523622 0.844529 -0.112206 +v 0.178678 3.6879 -2.01875 +vn 0.621734 0.741747 -0.251512 +v 0.183813 3.69634 -1.94272 +vn 0.655867 0.754673 0.0174942 +v 0.214116 3.66083 -1.98809 +vn 0.749514 0.646511 -0.14231 +v 0.139647 3.70221 -1.85605 +vn 0.407522 0.786136 0.464668 +v 0.164891 3.70509 -1.89578 +vn 0.54189 0.806848 0.235268 +v 0.201289 3.66447 -1.86994 +vn 0.637655 0.700354 0.320779 +v 0.24129 3.63394 -1.9408 +vn 0.77895 0.626553 -0.0258452 +v 0.120584 3.67026 -2.11355 +vn 0.371422 0.673438 -0.639162 +v 0.12153 3.70324 -2.07161 +vn 0.400903 0.786762 -0.469343 +v 0.152036 3.68447 -2.0698 +vn 0.531701 0.714628 -0.454534 +v 0.129731 3.55684 -2.19085 +vn 0.329005 0.419086 -0.84624 +v 0.133577 3.62023 -2.15137 +vn 0.390467 0.561359 -0.729665 +v 0.156812 3.60004 -2.15213 +vn 0.49481 0.492079 -0.716255 +v 0.210297 3.65107 -2.02963 +vn 0.744415 0.602175 -0.288498 +v 0.213047 3.62414 -2.06484 +vn 0.745586 0.513278 -0.425026 +v 0.186434 3.65928 -2.06253 +vn 0.64564 0.632715 -0.427575 +v 0.177758 3.62795 -2.10945 +vn 0.603217 0.559179 -0.568725 +v 0.237102 3.55553 -2.09721 +vn 0.743003 0.456478 -0.489464 +v 0.182627 3.57706 -2.1465 +vn 0.608755 0.441704 -0.659026 +v 0.090699 3.71436 -2.07283 +vn 0.261983 0.832001 -0.489018 +v 0.057779 3.74391 -2.02163 +vn 0.168916 0.948884 -0.266621 +v 0.059929 3.72167 -2.07346 +vn 0.150762 0.851898 -0.501539 +v 0.029902 3.72596 -2.07166 +vn 0.068399 0.863674 -0.499388 +v 0.095162 3.62842 -2.16062 +vn 0.237697 0.562356 -0.791995 +v 0.061601 3.68548 -2.11949 +vn 0.14791 0.718308 -0.679821 +v 0.063086 3.63539 -2.16286 +vn 0.125693 0.573349 -0.809612 +v 0.031431 3.64208 -2.16087 +vn 0.0563985 0.594052 -0.802447 +v 0.092282 3.74479 -1.97546 +vn 0.264822 0.960426 -0.0863183 +v 0.064734 3.75018 -1.92997 +vn 0.169678 0.976535 0.132627 +v 0.101961 3.73167 -1.88718 +vn 0.253742 0.909058 0.330497 +v 0 3.74838 -2.02152 +vn -4.47921e-18 0.963774 -0.266721 +v 0.030325 3.75523 -1.97748 +vn 0.0794957 0.993541 -0.0809742 +v 0 3.75567 -1.93484 +vn -4.62118e-06 0.992175 0.124854 +v 0.034411 3.74313 -1.888 +vn 0.0695934 0.936511 0.343661 +v 0.220827 2.93857 -2.27719 +vn 0.274547 0.0398126 -0.960749 +v 0.209984 2.99573 -2.27782 +vn 0.26785 0.0509556 -0.962112 +v 0.232263 3.00006 -2.27065 +vn 0.323032 0.0619859 -0.944356 +v 0.274512 2.93262 -2.25931 +vn 0.367839 0.057539 -0.928108 +v 0.283074 2.87103 -2.2592 +vn 0.357122 0.0397367 -0.933212 +v 0.253067 2.88034 -2.26955 +vn 0.316238 0.0308112 -0.948179 +v 0.410818 2.94576 -2.16805 +vn 0.700819 0.170786 -0.692593 +v 0.372339 3.01006 -2.19081 +vn 0.660897 0.158827 -0.733477 +v 0.394505 3.02047 -2.16603 +vn 0.729984 0.183935 -0.658249 +v 0.357598 2.94128 -2.21437 +vn 0.581815 0.111029 -0.805707 +v 0.382596 2.87941 -2.20459 +vn 0.590978 0.109797 -0.799181 +v 0.354457 2.87789 -2.22408 +vn 0.528292 0.0800239 -0.845283 +v 0.184168 2.99719 -2.28414 +vn 0.220678 0.0461307 -0.974255 +v 0.165057 2.93897 -2.29007 +vn 0.181926 0.026524 -0.982954 +v 0.158079 2.99879 -2.28942 +vn 0.177735 0.0431271 -0.983133 +v 0.078419 3.00117 -2.29897 +vn 0.0699977 0.0352854 -0.996923 +v 0.053116 2.9444 -2.30193 +vn 0.0468779 0.0207036 -0.998686 +v 0.047566 3.00384 -2.30061 +vn 0.0413971 0.0333941 -0.998585 +v 0.214958 2.7607 -2.28125 +vn 0.221532 -0.00894935 -0.975112 +v 0.190059 2.70592 -2.28523 +vn 0.1808 -0.0263741 -0.983166 +v 0.184202 2.76251 -2.28764 +vn 0.180504 -0.0144227 -0.983469 +v 0.091252 2.76741 -2.29938 +vn 0.0743674 -0.0219135 -0.99699 +v 0.061177 2.71296 -2.29961 +vn 0.0485752 -0.0336582 -0.998252 +v 0.055269 2.76962 -2.30156 +vn 0.0432046 -0.0247223 -0.99876 +v 0.154897 3.39082 -2.24051 +vn 0.307211 0.242424 -0.920246 +v 0.161038 3.33198 -2.25238 +vn 0.287973 0.193248 -0.937937 +v 0.13729 3.33871 -2.25732 +vn 0.213244 0.200791 -0.956143 +v 0.142679 3.47628 -2.21975 +vn 0.323363 0.332246 -0.88603 +v 0.107161 3.47981 -2.22834 +vn 0.199065 0.318704 -0.926715 +v 0.07767 3.39929 -2.2541 +vn 0.116164 0.220697 -0.9684 +v 0.081718 3.33589 -2.26688 +vn 0.103728 0.179761 -0.978226 +v 0.054976 3.33424 -2.26912 +vn 0.0529765 0.173848 -0.983347 +v 0.059892 3.57268 -2.19918 +vn 0.119208 0.431452 -0.894225 +v 0.077086 3.49464 -2.22822 +vn 0.131926 0.339827 -0.931189 +v 0.038323 3.49099 -2.23301 +vn 0.0443222 0.315297 -0.947957 +v 0.183982 3.17275 -2.2693 +vn 0.282601 0.108836 -0.953043 +v 0.178191 3.24143 -2.26324 +vn 0.280237 0.138277 -0.949919 +v 0.20149 3.22728 -2.25712 +vn 0.356887 0.120412 -0.926354 +v 0.28006 3.35956 -2.16906 +vn 0.711621 0.28984 -0.639991 +v 0.275303 3.27878 -2.20487 +vn 0.629579 0.234309 -0.740762 +v 0.17351 3.46292 -2.2119 +vn 0.416614 0.320109 -0.85086 +v 0.221129 3.36248 -2.21825 +vn 0.50799 0.261319 -0.820767 +v 0.203395 3.4493 -2.20001 +vn 0.519894 0.316519 -0.793427 +v 0.237464 3.42879 -2.18284 +vn 0.627088 0.313163 -0.713225 +v 0.111093 3.46434 -1.66356 +vn 0.111479 0.601022 0.79142 +v 0.15209 3.50669 -1.70076 +vn 0.20291 0.562854 0.801264 +v 0.099034 3.50881 -1.69298 +vn 0.102074 0.551002 0.828238 +v 0.167227 3.45489 -1.66706 +vn 0.203112 0.608815 0.76687 +v 0.117834 3.41481 -1.62349 +vn 0.116147 0.677135 0.726635 +v 0.176989 3.4041 -1.62619 +vn 0.204157 0.678146 0.706001 +v 0.048293 3.57072 -1.72682 +vn 0.051537 0.511226 0.8579 +v 0 3.53881 -1.70674 +vn 4.41805e-18 0.521549 0.853221 +v 0.051906 3.52189 -1.69761 +vn 0.0468992 0.537588 0.841902 +v 0.054981 3.47232 -1.6644 +vn 0.0443381 0.592313 0.804487 +v 0 3.43981 -1.63782 +vn 0 0.642591 0.766209 +v 0.058381 3.42329 -1.62506 +vn 0.0464077 0.670279 0.740656 +v 0.210952 3.4915 -1.70942 +vn 0.341003 0.584747 0.736063 +v 0.221942 3.44025 -1.67311 +vn 0.307105 0.617073 0.724505 +v 0.257318 3.46854 -1.71466 +vn 0.439347 0.607718 0.661553 +v 0.302359 3.45101 -1.73617 +vn 0.606082 0.597698 0.524806 +v 0.323835 3.39534 -1.69812 +vn 0.576032 0.613254 0.54047 +v 0.341768 3.41972 -1.75183 +vn 0.709945 0.582069 0.396452 +v 0.235281 3.38807 -1.63156 +vn 0.308164 0.677667 0.667685 +v 0.292221 3.36592 -1.6403 +vn 0.429938 0.672262 0.602675 +v 0.274489 3.42049 -1.68309 +vn 0.437278 0.620956 0.65054 +v 0.346607 3.33724 -1.65392 +vn 0.565481 0.654692 0.501607 +v 0.39849 3.30001 -1.67394 +vn 0.696249 0.62163 0.358905 +v 0.368129 3.36474 -1.71989 +vn 0.712208 0.585104 0.387833 +v 0.228518 3.60485 -1.81488 +vn 0.605301 0.636009 0.478647 +v 0.216839 3.57808 -1.77611 +vn 0.492278 0.546495 0.6775 +v 0.251439 3.5596 -1.79027 +vn 0.604311 0.569205 0.557507 +v 0.16122 3.64233 -1.7998 +vn 0.391514 0.654195 0.647105 +v 0.282735 3.53934 -1.8087 +vn 0.719397 0.556278 0.415961 +v 0.30569 3.51677 -1.82578 +vn 0.799952 0.519078 0.301055 +v 0.249465 3.61625 -1.87768 +vn 0.743599 0.635286 0.208499 +v 0.186031 3.59518 -1.77153 +vn 0.379171 0.587823 0.714628 +v 0.136409 3.60311 -1.7589 +vn 0.228158 0.555398 0.799673 +v 0.086062 3.60536 -1.75058 +vn 0.114425 0.53778 0.835284 +v 0.040404 3.61775 -1.75461 +vn 0.0494872 0.548662 0.834578 +v 0.116554 3.68183 -1.81665 +vn 0.251024 0.70452 0.663807 +v 0.08401 3.65514 -1.78501 +vn 0.14145 0.625966 0.766915 +v 0.07326 3.71783 -1.84727 +vn 0.155991 0.828572 0.537713 +v 0.039377 3.69436 -1.8138 +vn 0.0611846 0.717376 0.693994 +v 1.36325 2.61746 0.934373 +vn 0.823487 0.543906 0.161357 +v 1.3999 2.57566 0.880891 +vn 0.840478 0.521074 0.148589 +v 1.37391 2.62072 0.863876 +vn 0.824861 0.547948 0.139129 +v 1.38349 2.62327 0.790252 +vn 0.823989 0.555063 0.113787 +v 1.42043 2.5789 0.729395 +vn 0.839705 0.533544 0.101127 +v 1.39227 2.62432 0.714202 +vn 0.822995 0.560775 0.0906153 +v 1.41257 2.52568 0.968792 +vn 0.854205 0.487278 0.181369 +v 1.44949 2.47962 0.911549 +vn 0.87174 0.460416 0.16759 +v 1.42525 2.52849 0.896798 +vn 0.85579 0.492496 0.158337 +v 1.43703 2.5305 0.821442 +vn 0.856477 0.498128 0.135334 +v 1.47402 2.48174 0.756757 +vn 0.874029 0.47046 0.121414 +v 1.44784 2.53126 0.743564 +vn 0.856505 0.503928 0.111603 +v 1.35173 2.65876 0.840128 +vn 0.809371 0.573448 0.126796 +v 1.35269 2.67127 0.769036 +vn 0.803732 0.58609 0.102534 +v 1.32087 2.70253 0.832413 +vn 0.793268 0.597127 0.119018 +v 1.295 2.73858 0.819648 +vn 0.776121 0.620946 0.109829 +v 1.30275 2.73971 0.748218 +vn 0.771736 0.630273 0.0847346 +v 1.26993 2.7705 0.808734 +vn 0.754343 0.648443 0.102411 +v 1.36608 2.66445 0.694699 +vn 0.806723 0.586045 0.0758251 +v 1.36658 2.6718 0.615396 +vn 0.796888 0.602419 0.0453966 +v 1.33423 2.70797 0.683858 +vn 0.787722 0.612906 0.0619805 +v 1.3071 2.74293 0.675197 +vn 0.76973 0.635814 0.0570637 +v 1.31228 2.74132 0.600524 +vn 0.764608 0.643929 0.0270014 +v 1.28011 2.77525 0.665529 +vn 0.749156 0.6607 0.0473364 +v 1.27778 2.71373 1.01018 +vn 0.766769 0.611042 0.196706 +v 1.3027 2.69806 0.954238 +vn 0.790183 0.590406 0.164412 +v 1.27637 2.73302 0.951555 +vn 0.76925 0.616346 0.16844 +v 1.3157 2.65315 1.0397 +vn 0.799604 0.566586 0.199033 +v 1.28782 2.68261 1.06413 +vn 0.77374 0.593936 0.220378 +v 1.24134 2.76932 0.9698 +vn 0.726957 0.660261 0.18865 +v 1.26134 2.75578 0.934473 +vn 0.754626 0.637597 0.154949 +v 1.24556 2.77693 0.921265 +vn 0.736316 0.660974 0.144751 +v 1.32627 2.65801 0.979804 +vn 0.803703 0.568154 0.176812 +v 1.35207 2.61324 1.00069 +vn 0.821795 0.538683 0.18567 +v 1.37589 2.56881 1.01916 +vn 0.837113 0.510841 0.19566 +v 1.39907 2.52245 1.03659 +vn 0.851306 0.482821 0.205335 +v 1.30404 2.64948 1.09272 +vn 0.787339 0.569243 0.23677 +v 1.32698 2.60569 1.11713 +vn 0.807405 0.537932 0.242334 +v 1.33996 2.60925 1.06173 +vn 0.817299 0.535899 0.211743 +v 1.34872 2.56182 1.13762 +vn 0.824727 0.505694 0.253177 +v 1.37003 2.51604 1.15644 +vn 0.83782 0.479191 0.261596 +v 1.38481 2.51923 1.09936 +vn 0.846423 0.479582 0.231448 +v 1.52325 2.21739 1.04063 +vn 0.947067 0.229208 0.224783 +v 1.546 2.15927 0.994252 +vn 0.963041 0.167856 0.210654 +v 1.54079 2.21476 0.965083 +vn 0.953415 0.224556 0.201431 +v 1.55658 2.2143 0.887127 +vn 0.956633 0.226012 0.183773 +v 1.57081 2.18154 0.848621 +vn 0.966896 0.188624 0.171849 +v 1.57191 2.21169 0.804154 +vn 0.961326 0.223939 0.160322 +v 1.54076 2.10546 1.05104 +vn 0.966955 0.110089 0.229953 +v 1.55835 2.09848 0.976115 +vn 0.973143 0.102027 0.206356 +v 1.57576 2.07783 0.898663 +vn 0.979834 0.0771239 0.184328 +v 1.58799 2.02743 0.842385 +vn 0.98629 0.0142968 0.1644 +v 1.58935 2.08929 0.815042 +vn 0.983425 0.0828311 0.161288 +v 1.52798 2.27089 0.954652 +vn 0.939253 0.281075 0.196978 +v 1.51181 2.32515 0.946014 +vn 0.923195 0.333576 0.190887 +v 1.49562 2.32491 1.02004 +vn 0.918671 0.332089 0.213919 +v 1.49311 2.37795 0.936106 +vn 0.905961 0.381301 0.183967 +v 1.47223 2.42942 0.924656 +vn 0.888573 0.423566 0.176155 +v 1.45761 2.42762 0.997852 +vn 0.88559 0.41962 0.199122 +v 1.55761 2.27085 0.795361 +vn 0.945575 0.284354 0.158209 +v 1.5401 2.32565 0.790147 +vn 0.927652 0.342261 0.149397 +v 1.52701 2.32484 0.868332 +vn 0.926702 0.335392 0.169519 +v 1.521 2.37802 0.778787 +vn 0.910833 0.388638 0.139085 +v 1.49854 2.43065 0.7685 +vn 0.89228 0.43215 0.130705 +v 1.48592 2.43054 0.847937 +vn 0.890801 0.427703 0.15344 +v 1.46142 2.37539 1.07905 +vn 0.897419 0.375759 0.231181 +v 1.47869 2.32429 1.08964 +vn 0.913147 0.330767 0.238235 +v 1.46123 2.32346 1.15406 +vn 0.906113 0.32983 0.264898 +v 1.42758 2.37183 1.2015 +vn 0.882011 0.371506 0.289897 +v 1.44358 2.32215 1.21264 +vn 0.896274 0.330696 0.295521 +v 1.42133 2.47447 1.05258 +vn 0.865995 0.451674 0.214577 +v 1.44222 2.42543 1.06673 +vn 0.881483 0.416122 0.223228 +v 1.4262 2.42314 1.13048 +vn 0.875646 0.413459 0.249591 +v 1.39058 2.46877 1.17345 +vn 0.852495 0.44598 0.272678 +v 1.40986 2.42067 1.18844 +vn 0.866555 0.413113 0.280034 +v 1.49371 2.27206 1.09886 +vn 0.927728 0.282329 0.244155 +v 1.50534 2.21887 1.11031 +vn 0.940104 0.23156 0.25017 +v 1.50985 2.16558 1.13647 +vn 0.948746 0.177108 0.261752 +v 1.50444 2.11275 1.1845 +vn 0.951424 0.122607 0.282419 +v 1.52283 2.10948 1.12041 +vn 0.959854 0.116737 0.255055 +v 1.45759 2.27158 1.2222 +vn 0.910152 0.282263 0.303234 +v 1.4685 2.22018 1.23317 +vn 0.9213 0.23678 0.308451 +v 1.48698 2.21993 1.17467 +vn 0.931964 0.233622 0.277244 +v 1.4727 2.1689 1.25525 +vn 0.928366 0.183634 0.323133 +v 1.4682 2.12413 1.28917 +vn 0.926405 0.135294 0.351381 +v 1.48575 2.1157 1.24279 +vn 0.940857 0.126222 0.314413 +v 1.43517 1.40319 0.980595 +vn 0.886484 -0.413029 0.208695 +v 1.4414 1.38624 0.915076 +vn 0.89945 -0.400849 0.174096 +v 1.45445 1.42341 0.928092 +vn 0.919994 -0.354709 0.166713 +v 1.46131 1.48212 1.00543 +vn 0.927862 -0.326021 0.181059 +v 1.46789 1.46584 0.937949 +vn 0.932853 -0.322841 0.159874 +v 1.47937 1.50848 0.952361 +vn 0.943597 -0.291603 0.156822 +v 1.44542 1.36922 0.847177 +vn 0.905654 -0.399101 0.143212 +v 1.44867 1.35251 0.775465 +vn 0.910502 -0.394311 0.124519 +v 1.46194 1.38898 0.787156 +vn 0.927934 -0.353667 0.11772 +v 1.47412 1.42633 0.796875 +vn 0.93763 -0.327342 0.117034 +v 1.49288 1.46111 0.730328 +vn 0.947137 -0.306397 0.0951428 +v 1.48956 1.47498 0.802091 +vn 0.946958 -0.301513 0.111178 +v 1.42205 1.43962 1.09298 +vn 0.851638 -0.430745 0.298617 +v 1.43185 1.42576 1.03806 +vn 0.876664 -0.423268 0.228701 +v 1.44268 1.45798 1.05172 +vn 0.901071 -0.368314 0.228943 +v 1.446 1.51982 1.12607 +vn 0.899501 -0.34624 0.266486 +v 1.40077 1.4609 1.17617 +vn 0.810405 -0.460445 0.362261 +v 1.45422 1.4985 1.06604 +vn 0.917236 -0.329623 0.223664 +v 1.46553 1.54188 1.07956 +vn 0.93157 -0.291439 0.217347 +v 1.41745 1.53699 1.22558 +vn 0.839957 -0.386865 0.380536 +v 1.43024 1.52083 1.17745 +vn 0.867676 -0.385011 0.314491 +v 1.44521 1.56956 1.18763 +vn 0.899495 -0.31205 0.305832 +v 1.39885 1.37606 1.05636 +vn 0.806424 -0.512487 0.295021 +v 1.4074 1.33857 0.954578 +vn 0.827376 -0.512129 0.230593 +v 1.40371 1.35716 1.00638 +vn 0.822538 -0.507636 0.256393 +v 1.37285 1.32294 1.02466 +vn 0.742117 -0.596834 0.305043 +v 1.37582 1.38898 1.13156 +vn 0.759678 -0.539044 0.36376 +v 1.35655 1.33756 1.08795 +vn 0.717598 -0.603924 0.346884 +v 1.42781 1.35178 0.902355 +vn 0.874069 -0.450572 0.18163 +v 1.41687 1.30428 0.824118 +vn 0.849638 -0.501569 0.162921 +v 1.42007 1.28799 0.753266 +vn 0.856325 -0.496868 0.140821 +v 1.43493 1.31851 0.763841 +vn 0.888704 -0.440111 0.128477 +v 1.41299 1.32103 0.890748 +vn 0.840283 -0.506086 0.194427 +v 1.3975 1.29288 0.880153 +vn 0.802203 -0.558882 0.210053 +v 1.42291 1.27414 0.67893 +vn 0.861172 -0.494919 0.115923 +v 1.40423 1.25973 0.743843 +vn 0.815564 -0.559113 0.149159 +v 1.33517 2.00223 -1.23227 +vn 0.88274 0.213706 -0.41845 +v 1.36983 2.00254 -1.15685 +vn 0.893103 0.218281 -0.393346 +v 1.37479 1.96816 -1.16138 +vn 0.90636 0.155301 -0.392929 +v 1.30691 1.9745 -1.30186 +vn 0.877212 0.162281 -0.451844 +v 1.31146 1.93957 -1.30386 +vn 0.883273 0.104806 -0.456995 +v 1.34639 1.86257 -1.23819 +vn 0.905045 -0.0332255 -0.424016 +v 1.37814 1.89406 -1.16953 +vn 0.915552 0.0154958 -0.401901 +v 1.3782 1.85632 -1.16827 +vn 0.914947 -0.0517565 -0.400242 +v 1.28517 1.87162 -1.35955 +vn 0.875465 -0.00139694 -0.48328 +v 1.31426 1.90419 -1.30371 +vn 0.888784 0.0433673 -0.45627 +v 1.31562 1.86809 -1.30258 +vn 0.89186 -0.0158152 -0.452034 +v 1.40396 1.99892 -1.07767 +vn 0.902349 0.211226 -0.3757 +v 1.36292 2.03764 -1.14976 +vn 0.881787 0.275143 -0.383077 +v 1.38745 2.0703 -1.06341 +vn 0.872951 0.333729 -0.355783 +v 1.35443 2.07253 -1.14186 +vn 0.868026 0.328978 -0.371892 +v 1.34371 2.1072 -1.13299 +vn 0.855396 0.374785 -0.357539 +v 1.30018 2.00905 -1.30076 +vn 0.867559 0.216336 -0.447816 +v 1.29591 2.04245 -1.29035 +vn 0.861007 0.265814 -0.433601 +v 1.32123 2.07377 -1.21508 +vn 0.862882 0.31552 -0.394819 +v 1.28943 2.0759 -1.28108 +vn 0.851569 0.310221 -0.422603 +v 1.2804 2.10973 -1.27212 +vn 0.842878 0.349581 -0.409085 +v 1.46826 2.00384 -0.906504 +vn 0.91978 0.218067 -0.32627 +v 1.4373 2.00145 -0.993709 +vn 0.911651 0.217813 -0.348498 +v 1.42919 2.03801 -0.987202 +vn 0.895077 0.289145 -0.339458 +v 1.52253 2.0181 -0.729649 +vn 0.935253 0.22211 -0.275624 +v 1.49784 2.00981 -0.81756 +vn 0.926834 0.222643 -0.302338 +v 1.48845 2.04872 -0.811146 +vn 0.905625 0.300854 -0.29888 +v 1.44859 2.07905 -0.892586 +vn 0.879741 0.357057 -0.313953 +v 1.41899 2.07436 -0.979737 +vn 0.876167 0.350109 -0.331293 +v 1.40629 2.11051 -0.970931 +vn 0.857654 0.403385 -0.318921 +v 1.50132 2.09681 -0.713592 +vn 0.886303 0.36966 -0.27896 +v 1.47666 2.08718 -0.803604 +vn 0.881044 0.368904 -0.296095 +v 1.46164 2.12542 -0.795125 +vn 0.856871 0.426678 -0.28934 +v 1.44234 1.9638 -0.999243 +vn 0.925067 0.141399 -0.352502 +v 1.40922 1.92439 -1.09298 +vn 0.920006 0.0706532 -0.385484 +v 1.44429 1.92423 -1.00632 +vn 0.933846 0.0640956 -0.351887 +v 1.4297 1.90143 -1.04589 +vn 0.92691 0.0213815 -0.374673 +v 1.50377 1.96991 -0.822295 +vn 0.943539 0.13775 -0.301263 +v 1.47605 1.92578 -0.917408 +vn 0.941626 0.0562034 -0.331936 +v 1.50627 1.9276 -0.828707 +vn 0.953269 0.0538682 -0.297282 +v 1.49381 1.90125 -0.868554 +vn 0.945479 -0.000852022 -0.325681 +v 1.56346 2.05128 -0.545678 +vn 0.946851 0.231649 -0.223188 +v 1.57914 2.07391 -0.451859 +vn 0.950247 0.239796 -0.198817 +v 1.58806 2.02798 -0.455297 +vn 0.969913 0.155591 -0.187242 +v 1.5436 2.03821 -0.63951 +vn 0.938201 0.236256 -0.252907 +v 1.55273 1.99141 -0.640603 +vn 0.959483 0.146519 -0.240677 +v 1.60728 1.94724 -0.371222 +vn 0.990439 -0.00539336 -0.137845 +v 1.59353 1.92807 -0.459805 +vn 0.986143 -0.0232922 -0.164255 +v 1.59317 1.98188 -0.455341 +vn 0.983215 0.0661511 -0.170036 +v 1.53296 1.9356 -0.734904 +vn 0.962337 0.0510958 -0.267014 +v 1.55681 1.94706 -0.643577 +vn 0.971023 0.0527156 -0.233098 +v 1.55583 1.90213 -0.647895 +vn 0.971736 -0.0349061 -0.233475 +v 1.58969 2.09931 -0.362533 +vn 0.951838 0.250631 -0.176602 +v 1.56679 2.11894 -0.447109 +vn 0.923298 0.320085 -0.212287 +v 1.56044 2.1888 -0.35137 +vn 0.89743 0.390884 -0.204521 +v 1.55069 2.16267 -0.441705 +vn 0.892025 0.39211 -0.224813 +v 1.5314 2.20573 -0.435928 +vn 0.860253 0.452234 -0.235476 +v 1.53497 2.0758 -0.629685 +vn 0.914623 0.314126 -0.25454 +v 1.53711 2.13825 -0.531969 +vn 0.890295 0.384239 -0.244407 +v 1.52101 2.1168 -0.622434 +vn 0.886462 0.382046 -0.261202 +v 1.504 2.15746 -0.615008 +vn 0.857265 0.441739 -0.264505 +v 1.60751 2.14584 -0.175814 +vn 0.958596 0.256134 -0.124452 +v 1.60051 2.12386 -0.264772 +vn 0.956126 0.251617 -0.150042 +v 1.58703 2.17152 -0.25745 +vn 0.928911 0.330532 -0.166953 +v 1.5923 2.19523 -0.173911 +vn 0.932351 0.333323 -0.140061 +v 1.59593 2.21909 -0.083887 +vn 0.934873 0.336349 -0.1135 +v 1.61188 2.16831 -0.084787 +vn 0.959779 0.262864 -0.0986241 +v 1.57341 2.24306 -0.171762 +vn 0.902694 0.400915 -0.156238 +v 1.568 2.2185 -0.257976 +vn 0.8989 0.397909 -0.183432 +v 1.54781 2.26322 -0.250658 +vn 0.867419 0.457455 -0.195755 +v 1.55121 2.2894 -0.169475 +vn 0.870956 0.460384 -0.171703 +v 1.55325 2.31574 -0.081835 +vn 0.87552 0.460969 -0.144822 +v 1.57628 2.26815 -0.082864 +vn 0.906099 0.402967 -0.128851 +v 1.61869 2.09426 -0.17783 +vn 0.978337 0.175346 -0.110047 +v 1.61185 2.06972 -0.267338 +vn 0.977422 0.165392 -0.131496 +v 1.61858 2.01848 -0.264378 +vn 0.990331 0.077066 -0.115351 +v 1.62818 1.98619 -0.180957 +vn 0.996259 0.00525864 -0.0862563 +v 1.6189 1.9659 -0.27727 +vn 0.994147 -0.00435649 -0.107947 +v 1.62683 2.13593 0.004802 +vn 0.979214 0.192387 -0.0642477 +v 1.62351 2.11678 -0.08836 +vn 0.978274 0.186951 -0.0896086 +v 1.63153 2.06172 -0.087705 +vn 0.991947 0.10156 -0.0756743 +v 1.63617 2.04154 -0.039188 +vn 0.996838 0.058507 -0.0537733 +v 1.63485 2.00369 -0.085712 +vn 0.998178 0.0110238 -0.059329 +v 1.62089 2.18601 0.370709 +vn 0.977949 0.205444 0.0375176 +v 1.62518 2.17674 0.280721 +vn 0.979443 0.201263 0.0136283 +v 1.61667 2.21066 0.324194 +vn 0.970317 0.240825 0.0221136 +v 1.62764 2.16545 0.189929 +vn 0.980379 0.196853 -0.0102833 +v 1.6283 2.15174 0.098511 +vn 0.980643 0.192723 -0.0346025 +v 1.62198 2.18714 0.143494 +vn 0.971637 0.234821 -0.0279463 +v 1.6363 2.06456 0.378049 +vn 0.997708 0.0471145 0.0485776 +v 1.64004 2.05506 0.286598 +vn 0.998818 0.0408734 0.0263119 +v 1.63647 2.09101 0.330108 +vn 0.995738 0.085972 0.0333897 +v 1.64168 2.0456 0.194039 +vn 0.999372 0.0353136 0.00306548 +v 1.64138 2.03396 0.101207 +vn 0.999459 0.0278045 -0.0175865 +v 1.64016 2.0707 0.146788 +vn 0.997272 0.0730909 -0.010307 +v 1.61112 2.23401 0.277809 +vn 0.961428 0.274998 0.00575785 +v 1.6043 2.25585 0.231622 +vn 0.950531 0.310377 -0.012548 +v 1.59312 2.2892 0.274704 +vn 0.939312 0.343043 -0.0036829 +v 1.5713 2.3431 0.271917 +vn 0.91446 0.404418 -0.0144767 +v 1.56157 2.36153 0.225621 +vn 0.900435 0.433468 -0.0363557 +v 1.54628 2.39461 0.262983 +vn 0.885788 0.463005 -0.0317118 +v 1.61471 2.20773 0.095551 +vn 0.960074 0.275022 -0.0511843 +v 1.59759 2.24098 0.00637 +vn 0.936306 0.340299 -0.0867611 +v 1.59712 2.2611 0.09342 +vn 0.935683 0.346889 -0.0645438 +v 1.57678 2.31116 0.094988 +vn 0.911097 0.405711 -0.0728054 +v 1.55366 2.33984 0.005953 +vn 0.879959 0.460785 -0.115536 +v 1.55269 2.36076 0.093409 +vn 0.88376 0.459804 -0.0868826 +v 1.58804 2.3005 0.36389 +vn 0.938317 0.345043 0.0225192 +v 1.58158 2.30888 0.452898 +vn 0.93831 0.341818 0.0522916 +v 1.59481 2.27686 0.409231 +vn 0.949054 0.312616 0.0395991 +v 1.56653 2.33444 0.537975 +vn 0.930682 0.358907 0.0708252 +v 1.54293 2.37501 0.616898 +vn 0.913455 0.396783 0.0903517 +v 1.56473 2.31928 0.621239 +vn 0.935806 0.339914 0.0934132 +v 1.5343 2.42084 0.349354 +vn 0.884387 0.466735 -0.00413819 +v 1.50833 2.46751 0.430976 +vn 0.869599 0.493582 0.013249 +v 1.5357 2.41593 0.437616 +vn 0.894247 0.446876 0.0249762 +v 1.52753 2.42452 0.52233 +vn 0.893019 0.446479 0.0563458 +v 1.49399 2.47804 0.594766 +vn 0.873547 0.481431 0.0716897 +v 1.51931 2.42794 0.606206 +vn 0.892753 0.442863 0.0828531 +v 1.60018 2.25199 0.455214 +vn 0.958339 0.279205 0.0602555 +v 1.60192 2.22087 0.545398 +vn 0.967938 0.236854 0.0836419 +v 1.61471 2.19361 0.459646 +vn 0.975439 0.210006 0.0664484 +v 1.62517 2.13388 0.461489 +vn 0.988358 0.136405 0.0674016 +v 1.62423 2.1138 0.509384 +vn 0.990968 0.10763 0.07999 +v 1.63063 2.07012 0.469293 +vn 0.99621 0.0505961 0.070744 +v 1.58268 2.26266 0.627763 +vn 0.954979 0.279572 0.0992672 +v 1.59711 2.2041 0.633688 +vn 0.971366 0.21348 0.104282 +v 1.60761 2.14346 0.63897 +vn 0.98394 0.142134 0.10798 +v 1.61353 2.0812 0.645586 +vn 0.991216 0.0691567 0.112729 +v 1.6217 2.09378 0.558466 +vn 0.992299 0.0809214 0.093781 +v 1.43104 2.40327 -0.326714 +vn 0.74503 0.615322 -0.257503 +v 1.42708 2.37499 -0.403671 +vn 0.746098 0.609756 -0.267462 +v 1.39501 2.41333 -0.401938 +vn 0.720539 0.637634 -0.272481 +v 1.37112 2.33041 -0.659425 +vn 0.745546 0.613239 -0.260956 +v 1.38125 2.35555 -0.572948 +vn 0.733659 0.624747 -0.267274 +v 1.40933 2.31795 -0.581004 +vn 0.756575 0.596673 -0.267538 +v 1.49074 2.31992 -0.336249 +vn 0.804265 0.543347 -0.24069 +v 1.48461 2.29265 -0.415973 +vn 0.801239 0.542228 -0.252991 +v 1.4553 2.33474 -0.413263 +vn 0.772205 0.578787 -0.262117 +v 1.42234 2.25499 -0.677925 +vn 0.787576 0.554059 -0.269709 +v 1.43595 2.27878 -0.589688 +vn 0.778804 0.566791 -0.268722 +v 1.46112 2.23861 -0.598367 +vn 0.803141 0.532114 -0.267993 +v 1.39284 2.4483 -0.324325 +vn 0.713307 0.648098 -0.266763 +v 1.36483 2.44704 -0.399867 +vn 0.695231 0.663125 -0.277344 +v 1.33681 2.5086 -0.318246 +vn 0.663517 0.693038 -0.281858 +v 1.33439 2.47956 -0.395515 +vn 0.668768 0.687999 -0.28179 +v 1.30461 2.50744 -0.395552 +vn 0.637324 0.71661 -0.283351 +v 1.3898 2.38174 -0.488214 +vn 0.726517 0.631104 -0.27181 +v 1.35272 2.39106 -0.565512 +vn 0.710729 0.651197 -0.266097 +v 1.33026 2.45003 -0.476861 +vn 0.674969 0.683953 -0.276812 +v 1.32387 2.4237 -0.559393 +vn 0.68467 0.678359 -0.266563 +v 1.29565 2.45325 -0.554022 +vn 0.657311 0.704591 -0.267382 +v 1.39531 2.51114 -0.159574 +vn 0.721948 0.648606 -0.241043 +v 1.4005 2.47494 -0.238472 +vn 0.723052 0.642081 -0.254809 +v 1.36923 2.50888 -0.238246 +vn 0.6947 0.668179 -0.266324 +v 1.39452 2.56688 0.002709 +vn 0.740459 0.644691 -0.189985 +v 1.40388 2.53249 -0.072927 +vn 0.739119 0.639111 -0.2127 +v 1.3684 2.5694 -0.079723 +vn 0.710344 0.664923 -0.230842 +v 1.3347 2.57464 -0.158461 +vn 0.672063 0.691536 -0.264783 +v 1.33536 2.54251 -0.238597 +vn 0.66441 0.692513 -0.281045 +v 1.30596 2.57285 -0.231667 +vn 0.6397 0.711873 -0.289863 +v 1.33533 2.62932 -0.001442 +vn 0.690386 0.690436 -0.216019 +v 1.33552 2.60295 -0.081121 +vn 0.681507 0.690107 -0.243518 +v 1.30273 2.63432 -0.079758 +vn 0.651005 0.715284 -0.254088 +v 1.43491 2.4643 -0.161479 +vn 0.753485 0.617329 -0.226197 +v 1.43383 2.43382 -0.244111 +vn 0.748598 0.61591 -0.245471 +v 1.46549 2.3924 -0.247301 +vn 0.776865 0.584678 -0.233737 +v 1.4976 2.37919 -0.165355 +vn 0.810391 0.550466 -0.200636 +v 1.49513 2.34973 -0.250921 +vn 0.805376 0.549406 -0.222534 +v 1.43389 2.51964 0.002443 +vn 0.770023 0.6141 -0.173049 +v 1.43498 2.4931 -0.079202 +vn 0.762357 0.614223 -0.203818 +v 1.46748 2.45097 -0.079784 +vn 0.788857 0.58485 -0.188826 +v 1.49779 2.43293 0.004558 +vn 0.823062 0.549069 -0.14523 +v 1.49837 2.40727 -0.08021 +vn 0.816517 0.55024 -0.174746 +v 1.41105 2.61012 0.319745 +vn 0.79375 0.604956 -0.0631632 +v 1.42424 2.58318 0.243855 +vn 0.793904 0.601497 -0.0889755 +v 1.3943 2.62208 0.247794 +vn 0.773367 0.626257 -0.0985167 +v 1.42931 2.56345 0.164174 +vn 0.786611 0.607005 -0.113082 +v 1.43197 2.54306 0.083528 +vn 0.779471 0.609581 -0.14435 +v 1.40061 2.58263 0.086662 +vn 0.757265 0.634805 -0.153535 +v 1.47452 2.52153 0.335843 +vn 0.83746 0.545438 -0.0340432 +v 1.48815 2.4937 0.255999 +vn 0.839292 0.540504 -0.0586885 +v 1.45677 2.5395 0.24977 +vn 0.816157 0.573177 -0.0731817 +v 1.49344 2.47474 0.17299 +vn 0.835281 0.543266 -0.0846644 +v 1.49616 2.45537 0.088985 +vn 0.829481 0.546734 -0.114205 +v 1.46474 2.50017 0.086084 +vn 0.803893 0.580679 -0.12872 +v 1.37575 2.65347 0.311025 +vn 0.766174 0.637706 -0.0794283 +v 1.3588 2.66128 0.230539 +vn 0.74835 0.652797 -0.117591 +v 1.32179 2.71369 0.297867 +vn 0.730383 0.675258 -0.102796 +v 1.32714 2.69537 0.223842 +vn 0.724567 0.676577 -0.131324 +v 1.29668 2.72543 0.217666 +vn 0.698225 0.700724 -0.146519 +v 1.39082 2.61126 0.164562 +vn 0.757901 0.639414 -0.129366 +v 1.36392 2.62241 0.078658 +vn 0.728775 0.663336 -0.169916 +v 1.33058 2.67527 0.148622 +vn 0.71394 0.681828 -0.159378 +v 1.33249 2.65427 0.072248 +vn 0.702678 0.686112 -0.188396 +v 1.30108 2.68426 0.069105 +vn 0.675464 0.708777 -0.20343 +v 1.32042 2.73096 0.449408 +vn 0.75134 0.658929 -0.036066 +v 1.353 2.68827 0.381885 +vn 0.765196 0.641485 -0.0545198 +v 1.32236 2.72325 0.373982 +vn 0.743446 0.665269 -0.0685969 +v 1.34625 2.70184 0.534739 +vn 0.780295 0.625349 0.0088192 +v 1.31673 2.7379 0.525131 +vn 0.760346 0.649509 -0.00341815 +v 1.26286 2.79101 0.43039 +vn 0.698307 0.7129 -0.064343 +v 1.29277 2.75388 0.364226 +vn 0.717984 0.691039 -0.0834491 +v 1.26466 2.78073 0.353235 +vn 0.687905 0.718687 -0.10137 +v 1.28812 2.76994 0.515936 +vn 0.73718 0.675492 -0.0165981 +v 1.26086 2.79862 0.508184 +vn 0.709001 0.704604 -0.0291644 +v 1.38833 2.64494 0.381727 +vn 0.785044 0.617974 -0.0426038 +v 1.4165 2.60878 0.400165 +vn 0.806712 0.590408 -0.0251817 +v 1.44798 2.56445 0.410467 +vn 0.82759 0.561215 -0.0114837 +v 1.4785 2.5177 0.41981 +vn 0.8483 0.529511 0.00223633 +v 1.38104 2.65717 0.537469 +vn 0.79832 0.601899 0.0200638 +v 1.40715 2.62021 0.558417 +vn 0.817376 0.574957 0.0363439 +v 1.41315 2.61463 0.479669 +vn 0.812232 0.583312 0.0051827 +v 1.43713 2.57504 0.571418 +vn 0.836147 0.546377 0.0482834 +v 1.46627 2.5275 0.583416 +vn 0.854565 0.515828 0.0603359 +v 1.47374 2.52253 0.502069 +vn 0.852148 0.522298 0.0323862 +v 1.29489 2.2821 -0.998023 +vn 0.788553 0.552163 -0.270741 +v 1.26387 2.28729 -1.07846 +vn 0.792616 0.541426 -0.280389 +v 1.25415 2.3155 -1.04845 +vn 0.77825 0.571778 -0.259608 +v 1.25272 2.34758 -0.975743 +vn 0.74562 0.621249 -0.241039 +v 1.23614 2.34005 -1.04684 +vn 0.759 0.600307 -0.252092 +v 1.21874 2.36227 -1.04381 +vn 0.731527 0.637499 -0.241792 +v 1.24304 2.27899 -1.15101 +vn 0.800775 0.518709 -0.299501 +v 1.21636 2.28541 -1.20945 +vn 0.79011 0.514405 -0.333337 +v 1.21088 2.3067 -1.18783 +vn 0.77974 0.546069 -0.306291 +v 1.22008 2.33447 -1.10585 +vn 0.760011 0.590954 -0.270475 +v 1.20226 2.32843 -1.16861 +vn 0.761183 0.583506 -0.283056 +v 1.33743 2.30018 -0.83016 +vn 0.767735 0.58766 -0.255416 +v 1.31609 2.29117 -0.916154 +vn 0.779192 0.570972 -0.258556 +v 1.29431 2.32427 -0.905616 +vn 0.760797 0.600261 -0.24673 +v 1.35426 2.31555 -0.744796 +vn 0.755059 0.603929 -0.255255 +v 1.32847 2.34991 -0.736589 +vn 0.735328 0.630708 -0.247992 +v 1.28655 2.36803 -0.814675 +vn 0.721535 0.6508 -0.23632 +v 1.27346 2.35445 -0.893972 +vn 0.738215 0.631602 -0.236892 +v 1.25076 2.37936 -0.895202 +vn 0.708991 0.667512 -0.227508 +v 1.31651 2.39828 -0.644025 +vn 0.698233 0.669589 -0.253222 +v 1.30245 2.38231 -0.728642 +vn 0.711742 0.659562 -0.241664 +v 1.27727 2.41101 -0.72082 +vn 0.682835 0.69095 -0.237329 +v 1.33689 2.2561 -0.927891 +vn 0.795195 0.542809 -0.27023 +v 1.33141 2.2127 -1.02248 +vn 0.816815 0.492843 -0.299865 +v 1.35663 2.22017 -0.939485 +vn 0.81006 0.513217 -0.283568 +v 1.37497 2.1836 -0.950445 +vn 0.82487 0.482038 -0.295346 +v 1.37818 2.28216 -0.750172 +vn 0.774043 0.57663 -0.261449 +v 1.38024 2.22742 -0.856638 +vn 0.803086 0.528672 -0.274879 +v 1.39876 2.24484 -0.768726 +vn 0.792191 0.547099 -0.270401 +v 1.42402 2.20263 -0.776552 +vn 0.812283 0.513617 -0.276393 +v 1.28696 2.24681 -1.08744 +vn 0.809237 0.507371 -0.296161 +v 1.23446 2.24614 -1.22368 +vn 0.807532 0.477509 -0.346233 +v 1.27512 2.21146 -1.17246 +vn 0.824256 0.457441 -0.333692 +v 1.30325 2.21222 -1.1 +vn 0.821827 0.476257 -0.312698 +v 1.31796 2.17719 -1.11202 +vn 0.832927 0.445492 -0.328284 +v 1.21973 2.21426 -1.29497 +vn 0.807849 0.43508 -0.3976 +v 1.24735 2.2125 -1.23794 +vn 0.820545 0.442222 -0.362141 +v 1.25913 2.17824 -1.25076 +vn 0.828289 0.412162 -0.379552 +v 1.18016 2.60671 -0.369214 +vn 0.444096 0.833744 -0.328099 +v 1.1796 2.58919 -0.415058 +vn 0.439905 0.838056 -0.322716 +v 1.15739 2.60434 -0.404054 +vn 0.404673 0.852385 -0.331179 +v 1.14199 2.61313 -0.399438 +vn 0.375582 0.863324 -0.337061 +v 1.1397 2.58715 -0.470313 +vn 0.393236 0.864085 -0.314202 +v 1.12914 2.62041 -0.394492 +vn 0.364592 0.866599 -0.340704 +v 1.17332 2.54252 -0.55349 +vn 0.451134 0.847164 -0.2807 +v 1.15705 2.55297 -0.54617 +vn 0.412751 0.863684 -0.289288 +v 1.13643 2.55717 -0.562225 +vn 0.396415 0.87418 -0.280473 +v 1.12034 2.56259 -0.567509 +vn 0.390543 0.878881 -0.273942 +v 1.17613 2.69229 -0.16735 +vn 0.446531 0.827735 -0.339802 +v 1.1793 2.66147 -0.238059 +vn 0.440553 0.828723 -0.345154 +v 1.16274 2.66589 -0.247143 +vn 0.404976 0.843433 -0.353009 +v 1.17649 2.72359 -0.09 +vn 0.454291 0.829165 -0.325738 +v 1.15802 2.73307 -0.089976 +vn 0.416252 0.845869 -0.333526 +v 1.11577 2.71473 -0.180023 +vn 0.384802 0.851821 -0.355427 +v 1.12816 2.68088 -0.248078 +vn 0.363145 0.859264 -0.360266 +v 1.11454 2.69334 -0.232021 +vn 0.37365 0.854835 -0.360058 +v 1.14076 2.76884 -0.018025 +vn 0.400188 0.859501 -0.317973 +v 1.14117 2.74094 -0.090108 +vn 0.383526 0.858716 -0.339873 +v 1.1263 2.74569 -0.094024 +vn 0.364263 0.864853 -0.345459 +v 1.18136 2.63686 -0.293737 +vn 0.444911 0.825713 -0.346775 +v 1.20053 2.65018 -0.23621 +vn 0.487428 0.80695 -0.333534 +v 1.22457 2.60398 -0.31105 +vn 0.525828 0.787784 -0.320783 +v 1.22972 2.63558 -0.225916 +vn 0.537639 0.782036 -0.31522 +v 1.24928 2.61804 -0.234681 +vn 0.568946 0.761077 -0.311549 +v 1.1977 2.71197 -0.088022 +vn 0.495967 0.809698 -0.313698 +v 1.2206 2.67052 -0.155048 +vn 0.529383 0.786744 -0.317471 +v 1.22071 2.69803 -0.085978 +vn 0.538513 0.787191 -0.300555 +v 1.24624 2.67992 -0.084593 +vn 0.580619 0.762315 -0.285933 +v 1.18057 2.56712 -0.471311 +vn 0.455755 0.835601 -0.30669 +v 1.20393 2.58266 -0.396629 +vn 0.482389 0.81469 -0.321839 +v 1.21374 2.50105 -0.604019 +vn 0.543829 0.796381 -0.264628 +v 1.1914 2.53117 -0.556508 +vn 0.497293 0.822276 -0.276699 +v 1.2198 2.52501 -0.522056 +vn 0.536631 0.796437 -0.278774 +v 1.22841 2.54892 -0.442162 +vn 0.537874 0.784784 -0.307905 +v 1.22398 2.57421 -0.386843 +vn 0.521589 0.791944 -0.317441 +v 1.2461 2.56265 -0.376811 +vn 0.568298 0.763466 -0.306851 +v 1.24515 2.49573 -0.554391 +vn 0.57861 0.769038 -0.271644 +v 1.01489 1.15404 -1.01155 +vn 0.435712 -0.819272 -0.372757 +v 0.997962 1.18173 -1.08888 +vn 0.455963 -0.796636 -0.396823 +v 1.01077 1.18712 -1.08477 +vn 0.472859 -0.784986 -0.400251 +v 1.04017 1.16493 -1.00431 +vn 0.475095 -0.793631 -0.380047 +v 1.02286 1.19268 -1.08094 +vn 0.489339 -0.774139 -0.401567 +v 1.03534 1.19882 -1.07731 +vn 0.504226 -0.763555 -0.403409 +v 0.983367 1.21076 -1.16132 +vn 0.477989 -0.773419 -0.416353 +v 0.972398 1.24085 -1.22757 +vn 0.493986 -0.753769 -0.433371 +v 0.985034 1.24652 -1.22295 +vn 0.501466 -0.747313 -0.435953 +v 1.00828 1.22202 -1.1528 +vn 0.50066 -0.756488 -0.420792 +v 0.996868 1.25143 -1.21757 +vn 0.509704 -0.742069 -0.435356 +v 1.00915 1.25695 -1.21242 +vn 0.521833 -0.734464 -0.433881 +v 1.05347 1.10487 -0.845816 +vn 0.389937 -0.866127 -0.312686 +v 1.03386 1.1283 -0.930043 +vn 0.409569 -0.844388 -0.345344 +v 1.04692 1.13331 -0.926403 +vn 0.437215 -0.828309 -0.350353 +v 1.09234 1.06702 -0.67282 +vn 0.347314 -0.908067 -0.234068 +v 1.07343 1.08432 -0.759611 +vn 0.362272 -0.890322 -0.275838 +v 1.08674 1.08899 -0.756483 +vn 0.401899 -0.870983 -0.282606 +v 1.07909 1.11519 -0.839721 +vn 0.448063 -0.833324 -0.323744 +v 1.05914 1.13883 -0.923406 +vn 0.463879 -0.812106 -0.353978 +v 1.07168 1.14501 -0.92071 +vn 0.484936 -0.797869 -0.358109 +v 1.11824 1.07695 -0.667933 +vn 0.427058 -0.869551 -0.247997 +v 1.09903 1.09434 -0.754142 +vn 0.440248 -0.850367 -0.288196 +v 1.11157 1.10043 -0.752186 +vn 0.470019 -0.832284 -0.293916 +v 1.01935 1.1232 -0.934397 +vn 0.390726 -0.855579 -0.339585 +v 0.982704 1.14246 -1.02193 +vn 0.40894 -0.837721 -0.361928 +v 1.00136 1.11746 -0.940018 +vn 0.377268 -0.863599 -0.334462 +v 0.980142 1.11088 -0.946766 +vn 0.371779 -0.868559 -0.327698 +v 1.05857 1.0797 -0.763489 +vn 0.335989 -0.902836 -0.268327 +v 1.02033 1.09456 -0.855424 +vn 0.354424 -0.885343 -0.300919 +v 1.04001 1.07465 -0.768701 +vn 0.320962 -0.909623 -0.263761 +v 1.01808 1.0688 -0.775031 +vn 0.322259 -0.911231 -0.25653 +v 0.983809 1.17609 -1.09365 +vn 0.444918 -0.804902 -0.392658 +v 0.96307 1.27022 -1.28771 +vn 0.509504 -0.735633 -0.446374 +v 0.958491 1.23475 -1.23276 +vn 0.490047 -0.758279 -0.429961 +v 0.952031 1.19792 -1.17262 +vn 0.46497 -0.786133 -0.407182 +v 0.966404 1.16954 -1.09959 +vn 0.435862 -0.812563 -0.386995 +v 0.945917 1.16192 -1.10666 +vn 0.43311 -0.81757 -0.379466 +v 0.93177 1.25647 -1.30065 +vn 0.509291 -0.740404 -0.438662 +v 0.941462 1.22754 -1.23934 +vn 0.487098 -0.76276 -0.425361 +v 0.922 1.21962 -1.24753 +vn 0.490164 -0.765988 -0.415935 +v 1.15291 1.03068 -0.328045 +vn 0.310032 -0.946848 -0.0857899 +v 1.14038 1.03558 -0.41364 +vn 0.306876 -0.944612 -0.116343 +v 1.15399 1.04011 -0.411811 +vn 0.365785 -0.922491 -0.123336 +v 1.17916 1.04072 -0.325433 +vn 0.418838 -0.902565 -0.0997583 +v 1.16634 1.0454 -0.410423 +vn 0.422568 -0.8971 -0.129028 +v 1.17883 1.05152 -0.409425 +vn 0.468996 -0.872806 -0.1351 +v 1.12591 1.04299 -0.499715 +vn 0.319806 -0.935226 -0.151907 +v 1.11008 1.05334 -0.586021 +vn 0.325086 -0.926087 -0.191524 +v 1.12357 1.05784 -0.583502 +vn 0.376843 -0.904661 -0.198941 +v 1.15198 1.05282 -0.495926 +vn 0.417354 -0.893226 -0.167224 +v 1.13592 1.06314 -0.581793 +vn 0.426514 -0.880826 -0.205504 +v 1.14846 1.06923 -0.580495 +vn 0.465278 -0.859324 -0.212318 +v 1.17356 1.0267 -0.158121 +vn 0.313535 -0.948782 -0.0388409 +v 1.16421 1.02786 -0.242951 +vn 0.304527 -0.950596 -0.0602511 +v 1.17778 1.03248 -0.24161 +vn 0.366579 -0.928087 -0.0653743 +v 1.19044 1.02834 0.011308 +vn 0.320989 -0.947028 -0.0101906 +v 1.18148 1.02669 -0.073163 +vn 0.306428 -0.951631 -0.0223495 +v 1.19506 1.03135 -0.071648 +vn 0.363612 -0.931059 -0.03026 +v 1.20074 1.03712 -0.151302 +vn 0.424366 -0.904226 -0.0478382 +v 1.19026 1.03793 -0.24042 +vn 0.426221 -0.901861 -0.07058 +v 1.20265 1.04403 -0.238691 +vn 0.47283 -0.877646 -0.0785381 +v 1.21493 1.03829 0.01787 +vn 0.434802 -0.900376 -0.0164533 +v 1.20518 1.03542 -0.061067 +vn 0.421447 -0.906545 -0.0236217 +v 1.21982 1.04327 -0.071768 +vn 0.477088 -0.878156 -0.0350646 +v 1.14889 1.02348 -0.244712 +vn 0.256143 -0.965095 -0.054611 +v 1.11797 1.02183 -0.332945 +vn 0.236083 -0.968758 -0.0759776 +v 1.12959 1.019 -0.246692 +vn 0.224213 -0.973105 -0.0528701 +v 1.10668 1.01409 -0.249248 +vn 0.212091 -0.976008 -0.0492469 +v 1.16635 1.02224 -0.074897 +vn 0.261422 -0.965106 -0.015168 +v 1.14152 1.01848 -0.167481 +vn 0.234952 -0.971443 -0.0330958 +v 1.15179 1.01886 -0.086343 +vn 0.230565 -0.97284 -0.0205688 +v 1.12442 1.01268 -0.076896 +vn 0.211943 -0.97718 -0.0141006 +v 1.12506 1.03127 -0.416081 +vn 0.263023 -0.958613 -0.108996 +v 1.09495 1.049 -0.589261 +vn 0.28808 -0.939861 -0.1835 +v 1.09133 1.0342 -0.506632 +vn 0.255141 -0.956757 -0.139708 +v 1.10577 1.02687 -0.419566 +vn 0.234239 -0.966288 -0.106863 +v 1.08292 1.02201 -0.423905 +vn 0.225011 -0.968991 -0.102115 +v 1.05836 1.05775 -0.68134 +vn 0.299927 -0.928245 -0.22001 +v 1.07594 1.04448 -0.593767 +vn 0.265011 -0.947416 -0.179365 +v 1.05346 1.03936 -0.599309 +vn 0.261898 -0.949539 -0.172585 +v 1.19746 1.03327 0.260918 +vn 0.310002 -0.950094 0.0349428 +v 1.19714 1.03111 0.177975 +vn 0.321045 -0.946906 0.01732 +v 1.21047 1.03803 0.259654 +vn 0.374151 -0.926788 0.0327776 +v 1.22264 1.04333 0.258573 +vn 0.436766 -0.899054 0.0306082 +v 1.22266 1.0416 0.176735 +vn 0.438575 -0.898607 0.0125148 +v 1.23522 1.05005 0.258261 +vn 0.486672 -0.873101 0.02907 +v 1.19335 1.02883 0.094712 +vn 0.310922 -0.95043 0.00331157 +v 1.20637 1.03366 0.094584 +vn 0.376127 -0.926568 0.00034123 +v 1.21855 1.03903 0.094452 +vn 0.439315 -0.898328 -0.00289932 +v 1.23102 1.04575 0.093899 +vn 0.489559 -0.871952 -0.0056554 +v 1.21679 1.0571 0.492058 +vn 0.417247 -0.90329 0.0998569 +v 1.20766 1.04631 0.422229 +vn 0.36308 -0.928212 0.0812112 +v 1.21729 1.04954 0.41109 +vn 0.417797 -0.906019 0.0676459 +v 1.20743 1.0778 0.662921 +vn 0.427169 -0.888728 0.166401 +v 1.20028 1.0617 0.58571 +vn 0.374861 -0.917523 0.132781 +v 1.21301 1.06698 0.582318 +vn 0.431055 -0.892582 0.132248 +v 1.24395 1.07264 0.49964 +vn 0.502786 -0.858375 0.10197 +v 1.23266 1.05809 0.420244 +vn 0.471458 -0.878593 0.0761717 +v 1.24623 1.06584 0.420779 +vn 0.507395 -0.858576 0.0734628 +v 1.23471 1.08974 0.647723 +vn 0.494877 -0.854037 0.160366 +v 1.22799 1.07277 0.569803 +vn 0.469148 -0.874197 0.125216 +v 1.23959 1.08061 0.578277 +vn 0.500731 -0.855147 0.134132 +v 1.19423 1.04189 0.425257 +vn 0.306987 -0.948471 0.0785008 +v 1.19071 1.04852 0.507164 +vn 0.31708 -0.942722 0.103613 +v 1.1788 1.03751 0.427973 +vn 0.262617 -0.961805 0.0772299 +v 1.1593 1.03294 0.431279 +vn 0.233666 -0.969225 0.0774839 +v 1.15591 1.03958 0.514505 +vn 0.250267 -0.963108 0.0989412 +v 1.13685 1.02812 0.436058 +vn 0.221954 -0.972256 0.073852 +v 1.18646 1.05706 0.588465 +vn 0.319685 -0.938353 0.131509 +v 1.1806 1.06766 0.669031 +vn 0.336118 -0.927787 0.161976 +v 1.17094 1.0526 0.591834 +vn 0.279066 -0.951671 0.128238 +v 1.15166 1.04804 0.596528 +vn 0.253199 -0.958852 0.128427 +v 1.14542 1.05833 0.678054 +vn 0.276925 -0.948249 0.155361 +v 1.12881 1.04296 0.602192 +vn 0.244933 -0.961583 0.123958 +v 1.16352 1.02207 0.179916 +vn 0.2357 -0.971611 0.0204282 +v 1.18192 1.02889 0.262279 +vn 0.257965 -0.965482 0.0360385 +v 1.16362 1.02442 0.263962 +vn 0.22655 -0.973314 0.036544 +v 1.17775 1.02438 0.094938 +vn 0.257827 -0.966173 0.00590014 +v 1.11285 1.01109 0.182958 +vn 0.213635 -0.976684 0.0211921 +v 1.14002 1.01937 0.266405 +vn 0.212532 -0.976468 0.0366182 +v 1.11176 1.01337 0.269309 +vn 0.214097 -0.976129 0.036533 +v 1.15515 1.01879 0.005581 +vn 0.236724 -0.971565 -0.00483286 +v 1.15937 1.01984 0.095238 +vn 0.226053 -0.974085 0.00764022 +v 1.13568 1.0147 0.095963 +vn 0.211231 -0.977398 0.00859459 +v 1.15923 1.114 0.903368 +vn 0.38418 -0.884733 0.26392 +v 1.16637 1.09597 0.827114 +vn 0.367968 -0.901315 0.228541 +v 1.17334 1.11899 0.898764 +vn 0.420495 -0.867592 0.265458 +v 1.1865 1.12449 0.894505 +vn 0.454895 -0.850441 0.264237 +v 1.19362 1.10639 0.81923 +vn 0.441233 -0.866648 0.232882 +v 1.20003 1.13073 0.890411 +vn 0.483842 -0.834247 0.264441 +v 1.17392 1.08059 0.748664 +vn 0.345509 -0.917816 0.195545 +v 1.18787 1.08534 0.74499 +vn 0.392199 -0.898416 0.197556 +v 1.20073 1.09073 0.741707 +vn 0.436966 -0.877587 0.197233 +v 1.21385 1.09691 0.738672 +vn 0.474488 -0.857691 0.19806 +v 1.17042 1.19295 1.09741 +vn 0.486772 -0.793593 0.365053 +v 1.16176 1.16351 1.0414 +vn 0.455156 -0.825831 0.332921 +v 1.17522 1.1693 1.03645 +vn 0.480104 -0.812169 0.331483 +v 1.16999 1.25824 1.22218 +vn 0.521889 -0.732661 0.436851 +v 1.15809 1.22038 1.16889 +vn 0.494522 -0.769912 0.40334 +v 1.1717 1.22578 1.16208 +vn 0.508326 -0.761687 0.401793 +v 1.19908 1.20847 1.09084 +vn 0.518046 -0.77384 0.364416 +v 1.18914 1.17572 1.03155 +vn 0.499884 -0.799972 0.331905 +v 1.20506 1.18331 1.02519 +vn 0.51383 -0.791664 0.330525 +v 1.20131 1.2693 1.20235 +vn 0.537387 -0.723717 0.432954 +v 1.18742 1.22872 1.14759 +vn 0.51554 -0.760273 0.395226 +v 1.20111 1.23899 1.14904 +vn 0.527219 -0.748507 0.402215 +v 1.14758 1.15836 1.04711 +vn 0.42838 -0.83951 0.334236 +v 1.14448 1.1851 1.11346 +vn 0.455044 -0.81001 0.36989 +v 1.13189 1.15309 1.05357 +vn 0.411835 -0.848456 0.332437 +v 1.11249 1.14695 1.06136 +vn 0.403722 -0.853448 0.329599 +v 1.1092 1.17311 1.1289 +vn 0.435418 -0.824213 0.362056 +v 1.08962 1.13974 1.0706 +vn 0.408454 -0.854663 0.320492 +v 1.14367 1.21412 1.1742 +vn 0.479793 -0.781055 0.399691 +v 1.1401 1.2358 1.21871 +vn 0.49261 -0.75913 0.425508 +v 1.12782 1.20767 1.18037 +vn 0.464332 -0.792221 0.395956 +v 1.10892 1.20223 1.191 +vn 0.455058 -0.795498 0.400131 +v 1.11435 1.23964 1.25404 +vn 0.488357 -0.754621 0.438241 +v 1.08396 1.19839 1.21195 +vn 0.460705 -0.792693 0.399235 +v 1.13114 1.08594 0.838253 +vn 0.32244 -0.920723 0.219776 +v 1.14355 1.10902 0.908711 +vn 0.357943 -0.896743 0.260247 +v 1.12414 1.10357 0.915457 +vn 0.342605 -0.903491 0.257538 +v 1.15833 1.07596 0.753043 +vn 0.310961 -0.93095 0.191402 +v 1.1389 1.07105 0.758725 +vn 0.289228 -0.938299 0.189584 +v 1.07913 1.07217 0.855355 +vn 0.331232 -0.92115 0.204375 +v 1.10124 1.09727 0.923531 +vn 0.344978 -0.905097 0.248574 +v 1.07237 1.08884 0.933907 +vn 0.363508 -0.90022 0.239719 +v 1.11593 1.0655 0.765588 +vn 0.284929 -0.940923 0.182977 +v 1.08692 1.05835 0.77453 +vn 0.29601 -0.93871 0.17664 +v 1.07426 2.92719 0.757194 +vn 0.503624 0.861471 0.0650402 +v 1.07142 2.92117 0.834073 +vn 0.503187 0.85756 0.106737 +v 1.08147 2.91569 0.831437 +vn 0.490614 0.864906 0.106 +v 1.08048 2.92758 0.606254 +vn 0.501694 0.864854 -0.0181924 +v 1.07705 2.92944 0.678863 +vn 0.504695 0.863023 0.0217752 +v 1.08704 2.92374 0.677112 +vn 0.489985 0.871472 0.0212519 +v 1.09343 2.91673 0.752075 +vn 0.478237 0.876023 0.062241 +v 1.0907 2.91092 0.828471 +vn 0.477634 0.87221 0.105432 +v 1.1 2.90632 0.825135 +vn 0.468538 0.877298 0.10402 +v 1.09817 2.9175 0.596709 +vn 0.469767 0.882419 -0.0256164 +v 1.09615 2.9188 0.674673 +vn 0.473402 0.880626 0.0196832 +v 1.10532 2.91404 0.671853 +vn 0.459901 0.887794 0.0177036 +v 1.06892 2.91147 0.909139 +vn 0.501497 0.852077 0.149884 +v 1.06017 2.92753 0.8368 +vn 0.513191 0.851481 0.107775 +v 1.0433 2.92565 0.916462 +vn 0.517335 0.842172 0.152023 +v 1.04625 2.93557 0.84028 +vn 0.520721 0.846657 0.109645 +v 1.03032 2.94482 0.845006 +vn 0.522115 0.845492 0.111982 +v 1.06619 2.93584 0.681298 +vn 0.511858 0.858815 0.0209077 +v 1.04937 2.94182 0.762138 +vn 0.520695 0.851122 0.0668436 +v 1.05617 2.94161 0.691815 +vn 0.519346 0.853897 0.0337582 +v 1.039 2.95273 0.674276 +vn 0.527397 0.849455 0.0166879 +v 1.0678 2.87868 1.05382 +vn 0.502663 0.828984 0.245186 +v 1.0678 2.89753 0.981313 +vn 0.500705 0.843391 0.194898 +v 1.05613 2.90366 0.985145 +vn 0.509762 0.837774 0.195646 +v 1.07577 2.82869 1.17813 +vn 0.513676 0.785209 0.34581 +v 1.07485 2.85202 1.12153 +vn 0.505927 0.807622 0.302959 +v 1.05872 2.86299 1.11913 +vn 0.512588 0.808651 0.288681 +v 1.03838 2.89495 1.06037 +vn 0.516591 0.821435 0.241615 +v 1.04149 2.91163 0.989574 +vn 0.517001 0.833212 0.196131 +v 1.02471 2.92071 0.995448 +vn 0.518438 0.831949 0.197696 +v 1.0452 2.8447 1.1879 +vn 0.525279 0.78046 0.339062 +v 1.04369 2.8708 1.12412 +vn 0.519127 0.804301 0.289148 +v 1.02487 2.88084 1.13034 +vn 0.52563 0.800708 0.287367 +v 1.07817 2.89229 0.977719 +vn 0.491182 0.849144 0.194153 +v 1.08855 2.90136 0.902716 +vn 0.482304 0.863316 0.148552 +v 1.08764 2.88771 0.97402 +vn 0.482613 0.853997 0.194354 +v 1.09715 2.88334 0.969949 +vn 0.477566 0.857072 0.193282 +v 1.08236 2.8513 1.11079 +vn 0.493548 0.818931 0.292852 +v 1.08858 2.86993 1.04163 +vn 0.489069 0.83835 0.24079 +v 1.09191 2.84753 1.1052 +vn 0.492989 0.818687 0.29447 +v 1.10169 2.84366 1.09974 +vn 0.492271 0.820008 0.291987 +v 1.0106 2.50314 -1.16295 +vn 0.675844 0.711791 -0.191282 +v 1.00882 2.52208 -1.09251 +vn 0.708941 0.6861 -0.163308 +v 1.02062 2.51219 -1.08708 +vn 0.651735 0.739884 -0.166775 +v 0.995496 2.47354 -1.29642 +vn 0.716084 0.638998 -0.280901 +v 0.990982 2.50052 -1.23881 +vn 0.744575 0.630023 -0.220634 +v 1.00261 2.4901 -1.23267 +vn 0.689506 0.685902 -0.232637 +v 1.03601 2.48552 -1.15174 +vn 0.586529 0.785229 -0.198489 +v 1.03256 2.50353 -1.08199 +vn 0.59488 0.786214 -0.167285 +v 1.04585 2.4954 -1.07658 +vn 0.553255 0.81492 -0.172668 +v 1.0145 2.48093 -1.22696 +vn 0.633747 0.735407 -0.239878 +v 1.02788 2.47226 -1.22088 +vn 0.592897 0.766101 -0.248117 +v 0.99598 2.535 -1.09898 +vn 0.752574 0.639726 -0.156153 +v 0.986058 2.52685 -1.17568 +vn 0.766377 0.61714 -0.178336 +v 0.98156 2.55093 -1.10673 +vn 0.780524 0.606647 -0.150867 +v 0.963796 2.57215 -1.11702 +vn 0.795183 0.589954 -0.140138 +v 0.954371 2.5652 -1.19487 +vn 0.81033 0.563842 -0.159524 +v 0.943008 2.59783 -1.12936 +vn 0.80384 0.580352 -0.130512 +v 0.97848 2.51408 -1.24617 +vn 0.787173 0.581499 -0.205467 +v 0.971405 2.49849 -1.31148 +vn 0.801444 0.546873 -0.242109 +v 0.964543 2.53078 -1.25503 +vn 0.813299 0.548098 -0.195279 +v 0.947424 2.55288 -1.26735 +vn 0.828592 0.529509 -0.181812 +v 0.941909 2.53466 -1.33793 +vn 0.839111 0.498438 -0.217836 +v 0.924152 2.58195 -1.29179 +vn 0.838389 0.516773 -0.173347 +v 0.995929 2.58597 -0.862232 +vn 0.727103 0.673445 -0.133391 +v 1.00398 2.56111 -0.940179 +vn 0.737454 0.661346 -0.137052 +v 0.985343 2.58077 -0.949454 +vn 0.752734 0.64612 -0.126174 +v 1.01638 2.60248 -0.690639 +vn 0.684048 0.707188 -0.178783 +v 1.02594 2.57489 -0.766037 +vn 0.691385 0.704364 -0.160805 +v 1.00647 2.59289 -0.774097 +vn 0.707575 0.690612 -0.149641 +v 0.951384 2.63069 -0.88974 +vn 0.741089 0.662528 -0.108829 +v 0.963477 2.60457 -0.960548 +vn 0.761634 0.637621 -0.115557 +v 0.938668 2.63229 -0.973125 +vn 0.763588 0.637688 -0.101424 +v 0.969399 2.64538 -0.70712 +vn 0.697799 0.699085 -0.156065 +v 0.983565 2.61464 -0.783827 +vn 0.716598 0.683456 -0.139195 +v 0.957495 2.63989 -0.795702 +vn 0.719163 0.683424 -0.125444 +v 1.01896 2.54643 -0.933241 +vn 0.70886 0.690958 -0.141756 +v 1.0304 2.55308 -0.846757 +vn 0.679299 0.718358 -0.150048 +v 1.03219 2.53457 -0.927427 +vn 0.66321 0.733685 -0.147849 +v 1.04409 2.52567 -0.922567 +vn 0.604258 0.78259 -0.149751 +v 1.05591 2.53334 -0.836535 +vn 0.581572 0.798023 -0.157903 +v 1.05601 2.51797 -0.917981 +vn 0.544369 0.825357 -0.149828 +v 1.0413 2.56182 -0.759528 +vn 0.662266 0.730424 -0.166984 +v 1.05006 2.57546 -0.672985 +vn 0.634398 0.747206 -0.198047 +v 1.05473 2.55135 -0.754031 +vn 0.614896 0.768771 -0.175768 +v 1.06669 2.54355 -0.749676 +vn 0.554889 0.812058 -0.180717 +v 1.07564 2.5583 -0.663412 +vn 0.535099 0.817238 -0.21399 +v 1.07854 2.53693 -0.745562 +vn 0.492701 0.850457 -0.184303 +v 1.08841 2.59984 -0.502054 +vn 0.491732 0.82291 -0.284638 +v 1.07813 2.63754 -0.417194 +vn 0.533176 0.789851 -0.30308 +v 1.09262 2.62572 -0.42425 +vn 0.471033 0.826235 -0.308972 +v 1.07046 2.58501 -0.582454 +vn 0.57409 0.782081 -0.242423 +v 1.08237 2.5781 -0.578881 +vn 0.513628 0.820045 -0.252413 +v 1.1109 2.59288 -0.489193 +vn 0.404324 0.863101 -0.302619 +v 1.10157 2.6257 -0.411963 +vn 0.419554 0.846365 -0.328088 +v 1.1137 2.62139 -0.408779 +vn 0.380687 0.862593 -0.333182 +v 1.09405 2.57232 -0.575546 +vn 0.452343 0.852896 -0.260679 +v 1.10653 2.5675 -0.571692 +vn 0.407655 0.872099 -0.270667 +v 1.06483 2.64619 -0.419845 +vn 0.586294 0.757232 -0.287852 +v 1.06409 2.61654 -0.502889 +vn 0.592358 0.760847 -0.264997 +v 1.04854 2.65726 -0.426043 +vn 0.618473 0.736437 -0.274137 +v 1.0292 2.67105 -0.433683 +vn 0.633358 0.72734 -0.264263 +v 1.02694 2.64307 -0.519241 +vn 0.646856 0.72382 -0.240129 +v 1.00549 2.69007 -0.439131 +vn 0.640644 0.722936 -0.258724 +v 1.05675 2.59446 -0.587409 +vn 0.621522 0.748725 -0.230483 +v 1.0414 2.60569 -0.594023 +vn 0.65256 0.724436 -0.222164 +v 1.02662 2.6147 -0.610151 +vn 0.671244 0.711715 -0.207105 +v 0.99921 2.64179 -0.607042 +vn 0.674594 0.709182 -0.204898 +v 1.03342 2.76146 -0.19331 +vn 0.586724 0.752224 -0.299857 +v 1.04808 2.71769 -0.272823 +vn 0.588327 0.750013 -0.302246 +v 1.03136 2.73145 -0.272101 +vn 0.606207 0.73904 -0.293823 +v 1.03564 2.82122 -0.034909 +vn 0.564656 0.775059 -0.28363 +v 1.04891 2.78186 -0.112201 +vn 0.56101 0.770482 -0.302698 +v 1.03301 2.79349 -0.112867 +vn 0.580241 0.759442 -0.294223 +v 0.983922 2.79832 -0.201045 +vn 0.602739 0.745093 -0.285557 +v 1.00714 2.74893 -0.278988 +vn 0.614164 0.73563 -0.285747 +v 0.973941 2.77618 -0.280302 +vn 0.615582 0.737281 -0.278344 +v 1.00961 2.80918 -0.119439 +vn 0.590466 0.754142 -0.287435 +v 0.980103 2.83016 -0.12549 +vn 0.594804 0.753095 -0.281169 +v 1.06612 2.67846 -0.335644 +vn 0.562086 0.768448 -0.305856 +v 1.06625 2.70075 -0.280302 +vn 0.555039 0.770317 -0.313916 +v 1.08102 2.69742 -0.263876 +vn 0.51451 0.792667 -0.327046 +v 1.09434 2.66027 -0.334778 +vn 0.460709 0.822457 -0.333636 +v 1.09119 2.6948 -0.25505 +vn 0.459793 0.819886 -0.341142 +v 1.10099 2.69336 -0.246607 +vn 0.406014 0.842709 -0.353545 +v 1.06549 2.75319 -0.154358 +vn 0.540002 0.781433 -0.312667 +v 1.06575 2.7844 -0.075763 +vn 0.529885 0.789658 -0.309292 +v 1.08023 2.76368 -0.104265 +vn 0.49255 0.807705 -0.324048 +v 1.08924 2.72777 -0.179347 +vn 0.460111 0.820719 -0.3387 +v 1.093 2.76244 -0.089356 +vn 0.436775 0.836408 -0.331135 +v 1.10289 2.74994 -0.108419 +vn 0.397643 0.85055 -0.34416 +v 1.07088 2.86132 0.158394 +vn 0.50614 0.830108 -0.233973 +v 1.07383 2.8804 0.236408 +vn 0.503048 0.838794 -0.208249 +v 1.08546 2.86578 0.206101 +vn 0.475657 0.849991 -0.226419 +v 1.06669 2.81316 0.002312 +vn 0.521502 0.804263 -0.284949 +v 1.06858 2.83878 0.080454 +vn 0.514699 0.814751 -0.266958 +v 1.08163 2.82102 0.051379 +vn 0.481303 0.829003 -0.284784 +v 1.09224 2.84357 0.139636 +vn 0.447556 0.85724 -0.254624 +v 1.09733 2.86304 0.21989 +vn 0.436796 0.872949 -0.217186 +v 1.10466 2.85713 0.210488 +vn 0.406847 0.884329 -0.228992 +v 1.0882 2.79234 -0.018959 +vn 0.45355 0.835804 -0.309392 +v 1.09416 2.81902 0.065594 +vn 0.434649 0.855475 -0.281502 +v 1.10323 2.80842 0.047038 +vn 0.399794 0.866018 -0.300295 +v 1.05795 2.88168 0.20322 +vn 0.52606 0.822297 -0.216999 +v 1.04433 2.89107 0.205248 +vn 0.541623 0.813894 -0.210288 +v 1.04137 2.87025 0.123426 +vn 0.546187 0.802375 -0.240571 +v 1.02382 2.90397 0.201272 +vn 0.552446 0.807278 -0.207621 +v 1.05197 2.83785 0.045104 +vn 0.541477 0.79622 -0.269882 +v 1.0371 2.84829 0.045473 +vn 0.558545 0.78674 -0.262806 +v 1.01495 2.86256 0.040115 +vn 0.569545 0.780559 -0.257577 +v 1.07831 2.91744 0.449499 +vn 0.503193 0.857825 -0.104557 +v 1.08089 2.90543 0.37727 +vn 0.493 0.859364 -0.135808 +v 1.06729 2.91072 0.360616 +vn 0.510311 0.846524 -0.151593 +v 1.0824 2.92294 0.531798 +vn 0.502129 0.862944 -0.0565209 +v 1.06851 2.93069 0.524565 +vn 0.520908 0.851259 -0.0633433 +v 1.01893 2.95334 0.438779 +vn 0.540305 0.834821 -0.10557 +v 1.03011 2.93323 0.354356 +vn 0.542709 0.826766 -0.148068 +v 1.01097 2.94649 0.35864 +vn 0.544538 0.826914 -0.140327 +v 1.05556 2.94261 0.606632 +vn 0.524232 0.851376 -0.0184261 +v 1.05504 2.93917 0.525806 +vn 0.527918 0.847374 -0.0570993 +v 1.03783 2.94977 0.52411 +vn 0.529865 0.845938 -0.0602656 +v 1.07869 2.8951 0.313743 +vn 0.498265 0.850177 -0.170093 +v 1.08855 2.89965 0.3686 +vn 0.476095 0.867173 -0.146098 +v 1.09635 2.88006 0.28928 +vn 0.450629 0.872413 -0.189285 +v 1.09785 2.89413 0.365572 +vn 0.457739 0.876506 -0.149038 +v 1.10735 2.88889 0.362807 +vn 0.431717 0.888796 -0.153826 +v 1.08967 2.91803 0.521095 +vn 0.477205 0.876097 -0.0687699 +v 1.09868 2.90507 0.441369 +vn 0.461418 0.88015 -0.111488 +v 1.09882 2.91292 0.518659 +vn 0.464426 0.882984 -0.0681732 +v 1.10823 2.90795 0.51663 +vn 0.446503 0.892025 -0.0701938 +v 1.19158 1.41214 1.40206 +vn 0.591461 -0.588158 0.551583 +v 1.18115 1.36344 1.35817 +vn 0.569332 -0.634049 0.5233 +v 1.19709 1.37962 1.36002 +vn 0.577488 -0.615353 0.536515 +v 1.2193 1.42307 1.38382 +vn 0.595046 -0.578945 0.557442 +v 1.20879 1.3753 1.34228 +vn 0.573055 -0.626908 0.52782 +v 1.22401 1.39054 1.34343 +vn 0.578535 -0.609749 0.541759 +v 1.16219 1.31847 1.32138 +vn 0.544798 -0.674755 0.497897 +v 1.15138 1.27258 1.26684 +vn 0.516081 -0.721539 0.461564 +v 1.17118 1.2944 1.27758 +vn 0.532708 -0.698023 0.478524 +v 1.19101 1.335 1.31168 +vn 0.557575 -0.660913 0.502299 +v 1.18219 1.2964 1.26787 +vn 0.543856 -0.696955 0.467413 +v 1.19605 1.30209 1.26007 +vn 0.548312 -0.692484 0.468849 +v 1.22734 1.51016 1.45655 +vn 0.629208 -0.497041 0.597535 +v 1.21057 1.46077 1.43051 +vn 0.613029 -0.54232 0.574529 +v 1.22477 1.46626 1.42054 +vn 0.61418 -0.538454 0.576932 +v 1.25979 1.60954 1.49519 +vn 0.659105 -0.400801 0.636348 +v 1.24376 1.56121 1.47908 +vn 0.644623 -0.448621 0.619032 +v 1.25767 1.566 1.46802 +vn 0.648933 -0.444609 0.617421 +v 1.25356 1.52336 1.43968 +vn 0.633957 -0.486234 0.601394 +v 1.23788 1.47135 1.41132 +vn 0.615534 -0.534698 0.578979 +v 1.25474 1.48238 1.40351 +vn 0.618409 -0.521274 0.588084 +v 1.28405 1.62514 1.47949 +vn 0.669523 -0.38602 0.634608 +v 1.27026 1.57053 1.45795 +vn 0.653536 -0.439593 0.616157 +v 1.28602 1.58133 1.44879 +vn 0.658823 -0.424828 0.620866 +v 1.19494 1.45422 1.441 +vn 0.608487 -0.547581 0.574368 +v 1.15612 1.39526 1.42185 +vn 0.584175 -0.600793 0.545699 +v 1.17877 1.44283 1.44709 +vn 0.601855 -0.558558 0.570775 +v 1.15232 1.43868 1.47091 +vn 0.602164 -0.559317 0.569704 +v 1.22827 1.55525 1.49087 +vn 0.640258 -0.451694 0.621323 +v 1.19139 1.49095 1.47802 +vn 0.620387 -0.511451 0.59459 +v 1.21209 1.54355 1.49886 +vn 0.634593 -0.46372 0.618268 +v 1.18527 1.54055 1.52411 +vn 0.635444 -0.461273 0.619223 +v 1.16285 1.36097 1.37493 +vn 0.568879 -0.634024 0.523822 +v 1.13734 1.28142 1.29569 +vn 0.523738 -0.708863 0.472453 +v 1.12034 1.27259 1.30095 +vn 0.514013 -0.719728 0.466671 +v 1.12786 1.31048 1.34788 +vn 0.539233 -0.681052 0.495374 +v 1.14391 1.35416 1.38728 +vn 0.565428 -0.640108 0.520147 +v 1.11978 1.3451 1.40219 +vn 0.560163 -0.647656 0.516488 +v 1.09648 1.26352 1.31301 +vn 0.508238 -0.727556 0.460821 +v 1.068 1.25301 1.3278 +vn 0.503159 -0.735716 0.45338 +v 1.29978 1.82844 1.54916 +vn 0.693415 -0.169889 0.700224 +v 1.29566 1.76814 1.53558 +vn 0.689382 -0.238279 0.684088 +v 1.30871 1.78464 1.52778 +vn 0.699933 -0.214192 0.681334 +v 1.32429 1.83386 1.5253 +vn 0.721396 -0.163727 0.67289 +v 1.31776 1.78089 1.51699 +vn 0.714144 -0.22467 0.662964 +v 1.32871 1.7825 1.50546 +vn 0.724862 -0.218927 0.653182 +v 1.28479 1.71584 1.52611 +vn 0.681548 -0.291666 0.671136 +v 1.27193 1.66562 1.5151 +vn 0.668684 -0.344398 0.658978 +v 1.28571 1.67017 1.50336 +vn 0.67871 -0.340004 0.650961 +v 1.30937 1.7334 1.50805 +vn 0.701845 -0.273625 0.65768 +v 1.29787 1.67418 1.49256 +vn 0.688337 -0.334492 0.643668 +v 1.3126 1.68431 1.48188 +vn 0.696127 -0.319431 0.642939 +v 1.30699 1.93868 1.55911 +vn 0.697132 -0.0483393 0.715311 +v 1.30492 1.8835 1.55513 +vn 0.696099 -0.109492 0.709547 +v 1.31753 1.88583 1.54281 +vn 0.710718 -0.107586 0.695201 +v 1.30581 2.03998 1.55897 +vn 0.691108 0.0683967 0.719508 +v 1.30807 1.99242 1.55957 +vn 0.69503 0.00990343 0.718913 +v 1.32024 1.99475 1.54741 +vn 0.712285 0.0136858 0.701756 +v 1.33104 1.94251 1.53498 +vn 0.727843 -0.0452041 0.684253 +v 1.32883 1.888 1.53139 +vn 0.727195 -0.10558 0.678263 +v 1.33951 1.89007 1.51991 +vn 0.741151 -0.103021 0.663387 +v 1.32751 2.05365 1.53588 +vn 0.719746 0.0794005 0.689682 +v 1.33106 1.99725 1.53618 +vn 0.727777 0.0175127 0.685591 +v 1.34139 1.99892 1.52486 +vn 0.741086 0.0178821 0.671172 +v 1.28901 1.88075 1.56994 +vn 0.684027 -0.110605 0.721022 +v 1.26439 1.82115 1.58138 +vn 0.676427 -0.173937 0.715676 +v 1.26996 1.87756 1.58736 +vn 0.677064 -0.111885 0.72737 +v 1.24529 1.87429 1.60958 +vn 0.672218 -0.111453 0.731916 +v 1.29255 1.99178 1.57412 +vn 0.680084 0.0124358 0.733029 +v 1.27193 1.93436 1.59173 +vn 0.677297 -0.0492692 0.734058 +v 1.27385 1.99117 1.59134 +vn 0.674119 0.0144659 0.738481 +v 1.24971 1.99 1.61323 +vn 0.670589 0.0141985 0.741693 +v 1.27732 1.76947 1.5541 +vn 0.679382 -0.232098 0.696111 +v 1.25276 1.65311 1.52784 +vn 0.662805 -0.356927 0.65825 +v 1.24978 1.7072 1.55706 +vn 0.66786 -0.295306 0.683196 +v 1.25816 1.7651 1.57118 +vn 0.672625 -0.235181 0.701616 +v 1.23351 1.7599 1.59284 +vn 0.66845 -0.235423 0.705514 +v 1.22512 1.59901 1.52396 +vn 0.649154 -0.407647 0.642201 +v 1.23752 1.65451 1.54381 +vn 0.659809 -0.349822 0.665038 +v 1.2133 1.64836 1.56444 +vn 0.656556 -0.352921 0.666619 +v 1.28495 2.21518 1.53872 +vn 0.665656 0.248648 0.703616 +v 1.2959 2.15878 1.54624 +vn 0.674601 0.196111 0.711656 +v 1.29489 2.21906 1.52779 +vn 0.679021 0.25903 0.686902 +v 1.29769 2.26548 1.50607 +vn 0.677263 0.298986 0.672251 +v 1.31117 2.19713 1.51949 +vn 0.692935 0.23218 0.682593 +v 1.31861 2.21998 1.50344 +vn 0.693757 0.258471 0.67223 +v 1.30589 2.09177 1.55186 +vn 0.68646 0.121165 0.717002 +v 1.31482 2.10927 1.53995 +vn 0.687739 0.145379 0.711253 +v 1.32011 2.14455 1.52645 +vn 0.706127 0.180637 0.684657 +v 1.32459 2.10463 1.53107 +vn 0.713563 0.128838 0.688643 +v 1.33432 2.10639 1.52024 +vn 0.730969 0.134811 0.668962 +v 1.27061 2.37023 1.4785 +vn 0.652219 0.389875 0.650084 +v 1.27294 2.32257 1.50296 +vn 0.654695 0.349106 0.670447 +v 1.28383 2.32077 1.49317 +vn 0.663993 0.34627 0.66273 +v 1.23391 2.47858 1.44119 +vn 0.625994 0.476355 0.617429 +v 1.24129 2.42923 1.4697 +vn 0.631147 0.437769 0.640321 +v 1.25218 2.42639 1.46078 +vn 0.638629 0.436426 0.633787 +v 1.28931 2.37206 1.4581 +vn 0.673664 0.392441 0.626233 +v 1.29386 2.32059 1.48302 +vn 0.672542 0.347012 0.653659 +v 1.30402 2.32104 1.47227 +vn 0.682048 0.346311 0.644112 +v 1.26584 2.41776 1.45284 +vn 0.647391 0.425991 0.631995 +v 1.27288 2.4228 1.44204 +vn 0.654617 0.435358 0.618013 +v 1.26071 2.32491 1.51359 +vn 0.646264 0.351656 0.677259 +v 1.24781 2.37842 1.49594 +vn 0.637509 0.396502 0.660582 +v 1.24534 2.32771 1.52659 +vn 0.6398 0.353059 0.682646 +v 1.22692 2.3312 1.542 +vn 0.636986 0.354704 0.684422 +v 1.21306 2.38905 1.52257 +vn 0.628747 0.401452 0.665969 +v 1.20315 2.33501 1.56205 +vn 0.635512 0.354337 0.685981 +v 1.22865 2.43226 1.47994 +vn 0.625754 0.439172 0.64464 +v 1.21059 2.48505 1.4594 +vn 0.6157 0.478947 0.625718 +v 1.21421 2.43647 1.49104 +vn 0.621309 0.439555 0.648665 +v 1.19866 2.44697 1.49869 +vn 0.617466 0.448909 0.645923 +v 1.17672 2.50148 1.47976 +vn 0.608802 0.487429 0.625918 +v 1.173 2.44718 1.52303 +vn 0.618602 0.444375 0.647968 +v 1.25898 2.16141 1.57963 +vn 0.660663 0.197837 0.724144 +v 1.26941 2.21642 1.55275 +vn 0.657612 0.251827 0.710021 +v 1.25054 2.21857 1.56938 +vn 0.652931 0.253405 0.71377 +v 1.2734 2.04742 1.58821 +vn 0.672415 0.0784307 0.736007 +v 1.28631 2.10206 1.56829 +vn 0.674412 0.138317 0.725284 +v 1.26726 2.10457 1.58534 +vn 0.666763 0.140386 0.731928 +v 1.21066 2.15933 1.62376 +vn 0.655128 0.19342 0.73034 +v 1.22637 2.22046 1.59064 +vn 0.649761 0.252773 0.71688 +v 1.19417 2.21619 1.62128 +vn 0.648598 0.246335 0.720166 +v 1.23046 2.04687 1.62702 +vn 0.666921 0.0779161 0.741044 +v 1.24328 2.10464 1.60694 +vn 0.662517 0.139659 0.735912 +v 1.21164 2.09745 1.63667 +vn 0.660047 0.132675 0.739416 +v 1.15253 2.63447 1.38222 +vn 0.576924 0.599019 0.555279 +v 1.17204 2.58656 1.41087 +vn 0.59118 0.557992 0.582367 +v 1.1647 2.62983 1.37461 +vn 0.579269 0.595626 0.556486 +v 1.17521 2.6265 1.36715 +vn 0.583465 0.594758 0.553021 +v 1.19504 2.57889 1.39475 +vn 0.59864 0.554205 0.578349 +v 1.18549 2.62342 1.35959 +vn 0.587381 0.594463 0.549178 +v 1.19172 2.53638 1.4365 +vn 0.603666 0.518803 0.605335 +v 1.20416 2.53239 1.42751 +vn 0.60704 0.516284 0.604113 +v 1.21482 2.5294 1.41926 +vn 0.611828 0.514924 0.600433 +v 1.22515 2.52671 1.411 +vn 0.618182 0.513529 0.595096 +v 1.12241 2.74439 1.27492 +vn 0.539262 0.705505 0.459847 +v 1.1279 2.71702 1.30847 +vn 0.54996 0.67384 0.493441 +v 1.13808 2.71352 1.30171 +vn 0.557368 0.674231 0.484513 +v 1.09661 2.82012 1.16698 +vn 0.507739 0.788711 0.346606 +v 1.09574 2.79728 1.21614 +vn 0.526454 0.759674 0.38176 +v 1.11196 2.77895 1.22974 +vn 0.525419 0.744894 0.411179 +v 1.13964 2.74683 1.25006 +vn 0.549368 0.713774 0.434421 +v 1.15148 2.70513 1.29801 +vn 0.55942 0.667256 0.49175 +v 1.15827 2.70768 1.28669 +vn 0.559588 0.676091 0.479334 +v 1.11838 2.78835 1.20361 +vn 0.507362 0.767495 0.391836 +v 1.11598 2.72259 1.31392 +vn 0.544435 0.681273 0.489343 +v 1.09892 2.76454 1.27045 +vn 0.532702 0.722732 0.440327 +v 1.10255 2.7294 1.31946 +vn 0.545763 0.683972 0.484072 +v 1.08837 2.73977 1.32082 +vn 0.547551 0.689704 0.473811 +v 1.06794 2.77993 1.28294 +vn 0.538905 0.722215 0.433575 +v 1.06517 2.74554 1.33928 +vn 0.552691 0.684359 0.475589 +v 1.0871 2.79875 1.22464 +vn 0.522265 0.754515 0.397424 +v 1.07387 2.80466 1.23085 +vn 0.525752 0.755181 0.391518 +v 1.05838 2.81175 1.23812 +vn 0.529697 0.754861 0.386789 +v 1.04201 2.817 1.25043 +vn 0.532675 0.749198 0.39365 +v 1.13887 2.6041 1.42747 +vn 0.586892 0.56717 0.577819 +v 1.13874 2.64031 1.39025 +vn 0.574405 0.601435 0.555279 +v 1.12379 2.65112 1.39392 +vn 0.572938 0.609827 0.547588 +v 1.17756 2.54156 1.44614 +vn 0.600035 0.520689 0.607323 +v 1.16216 2.55241 1.45196 +vn 0.597057 0.529343 0.602759 +v 1.09095 2.6156 1.46504 +vn 0.588019 0.566807 0.57703 +v 1.10006 2.65513 1.41436 +vn 0.577354 0.605419 0.547842 +v 1.07371 2.6648 1.43161 +vn 0.578589 0.60625 0.545615 +v 1.12675 2.51002 1.52171 +vn 0.607765 0.486196 0.627882 +v 1.13745 2.55489 1.47427 +vn 0.599497 0.525518 0.603684 +v 1.11006 2.56346 1.49412 +vn 0.599659 0.526583 0.602594 +v 0.98458 2.36111 -1.48979 +vn 0.809079 0.435859 -0.394232 +v 0.982106 2.40185 -1.44608 +vn 0.803114 0.471225 -0.364629 +v 0.994335 2.38162 -1.44648 +vn 0.762294 0.496744 -0.414914 +v 1.00863 2.33935 -1.46965 +vn 0.729627 0.486239 -0.48085 +v 1.00544 2.38071 -1.4291 +vn 0.697214 0.551182 -0.458357 +v 1.01732 2.36446 -1.43138 +vn 0.65443 0.558589 -0.509608 +v 0.972773 2.46983 -1.36472 +vn 0.807022 0.519305 -0.281138 +v 0.984616 2.45701 -1.35658 +vn 0.768716 0.560636 -0.307836 +v 0.99592 2.44644 -1.3496 +vn 0.710428 0.615424 -0.341387 +v 1.00764 2.43775 -1.34325 +vn 0.654159 0.660792 -0.368008 +v 1.00486 2.26586 -1.54207 +vn 0.800517 0.378862 -0.464366 +v 0.995544 2.31402 -1.51626 +vn 0.805476 0.407369 -0.430417 +v 1.00792 2.30285 -1.50473 +vn 0.765921 0.431018 -0.477063 +v 1.02928 2.24404 -1.5214 +vn 0.729875 0.401068 -0.553558 +v 1.01523 2.22072 -1.55954 +vn 0.799317 0.352281 -0.486816 +v 1.01806 2.29526 -1.49657 +vn 0.732343 0.439774 -0.519877 +v 1.04972 2.16168 -1.54955 +vn 0.709256 0.352658 -0.610401 +v 0.98186 2.32821 -1.52958 +vn 0.827402 0.39696 -0.397277 +v 0.954288 2.39861 -1.51713 +vn 0.846291 0.404022 -0.347215 +v 0.968339 2.34776 -1.53942 +vn 0.84213 0.383787 -0.378846 +v 0.944489 2.36999 -1.57124 +vn 0.850395 0.371923 -0.372159 +v 0.994704 2.20496 -1.60682 +vn 0.829262 0.313489 -0.462655 +v 0.974046 2.30362 -1.56944 +vn 0.83755 0.362747 -0.408563 +v 0.985588 2.25518 -1.58676 +vn 0.836559 0.33648 -0.432378 +v 0.963407 2.26947 -1.61934 +vn 0.842357 0.327902 -0.427686 +v 0.972169 2.44357 -1.4112 +vn 0.812576 0.489869 -0.31583 +v 0.965852 2.41652 -1.46565 +vn 0.834682 0.439008 -0.332532 +v 0.958882 2.48691 -1.37582 +vn 0.833489 0.486859 -0.261275 +v 0.94274 2.50816 -1.38934 +vn 0.846308 0.470157 -0.250429 +v 0.942362 2.47879 -1.44126 +vn 0.848273 0.446771 -0.284306 +v 0.949444 2.43671 -1.48178 +vn 0.849258 0.423414 -0.315407 +v 0.928636 2.46341 -1.50319 +vn 0.855658 0.414908 -0.309355 +v 0.903011 2.5932 -1.35805 +vn 0.846264 0.49556 -0.195597 +v 0.922125 2.53707 -1.4062 +vn 0.852191 0.464388 -0.241068 +v 0.894317 2.58019 -1.42223 +vn 0.85439 0.466247 -0.229418 +v 1.05882 2.00271 -1.61178 +vn 0.752483 0.185909 -0.631829 +v 1.04345 2.08727 -1.59795 +vn 0.773617 0.269184 -0.573635 +v 1.06853 2.0765 -1.57237 +vn 0.699053 0.284532 -0.656023 +v 1.08704 1.98737 -1.5855 +vn 0.686739 0.183273 -0.70342 +v 1.02601 2.17107 -1.57605 +vn 0.789407 0.323858 -0.52149 +v 1.06924 1.92033 -1.61701 +vn 0.729808 0.0746609 -0.679563 +v 1.095 1.89894 -1.59333 +vn 0.682765 0.0485079 -0.729026 +v 1.12101 1.84591 -1.57098 +vn 0.668576 -0.0277792 -0.743124 +v 1.03666 1.93226 -1.65306 +vn 0.764466 0.0606613 -0.641804 +v 1.02497 2.02124 -1.6505 +vn 0.795604 0.16703 -0.582336 +v 0.992098 1.95673 -1.70611 +vn 0.785231 0.0514119 -0.617065 +v 0.997963 1.8647 -1.69802 +vn 0.751809 -0.0651414 -0.656156 +v 1.00994 2.11352 -1.63561 +vn 0.819169 0.256695 -0.512904 +v 0.979788 2.0489 -1.70651 +vn 0.808035 0.147638 -0.570336 +v 0.998278 2.07602 -1.67057 +vn 0.818216 0.206658 -0.536484 +v 0.969287 2.13188 -1.6927 +vn 0.824365 0.225264 -0.519305 +v 0.979251 2.1722 -1.65561 +vn 0.83531 0.273888 -0.4767 +v 1.11396 1.46636 -1.38795 +vn 0.63024 -0.589386 -0.505393 +v 1.15408 1.45902 -1.3251 +vn 0.667238 -0.578457 -0.469235 +v 1.09086 1.39835 -1.32997 +vn 0.599267 -0.642156 -0.478032 +v 1.1355 1.39927 -1.27266 +vn 0.629193 -0.628139 -0.457774 +v 1.09501 1.36977 -1.28431 +vn 0.59268 -0.665162 -0.454192 +v 1.19822 1.45582 -1.25574 +vn 0.704087 -0.549849 -0.449364 +v 1.18325 1.4037 -1.21067 +vn 0.669871 -0.597903 -0.440209 +v 1.13399 1.35106 -1.20549 +vn 0.603558 -0.658234 -0.44994 +v 1.06863 1.43741 -1.40685 +vn 0.582229 -0.619589 -0.526421 +v 1.04761 1.38076 -1.35773 +vn 0.56102 -0.664473 -0.493692 +v 1.03388 1.42007 -1.42304 +vn 0.550697 -0.634553 -0.542288 +v 1.07216 1.35372 -1.28939 +vn 0.567911 -0.683565 -0.458493 +v 1.05406 1.35498 -1.31342 +vn 0.562894 -0.682238 -0.466584 +v 1.04516 1.31447 -1.26215 +vn 0.548987 -0.705427 -0.448315 +v 1.03265 1.34104 -1.31824 +vn 0.544774 -0.695386 -0.468679 +v 1.09007 1.49975 -1.45104 +vn 0.600067 -0.548462 -0.582331 +v 1.13074 1.52357 -1.42904 +vn 0.648858 -0.521419 -0.55417 +v 1.1117 1.56481 -1.48298 +vn 0.627488 -0.44823 -0.63667 +v 1.05593 1.48375 -1.46933 +vn 0.566025 -0.562983 -0.602217 +v 1.17074 1.52105 -1.37347 +vn 0.704351 -0.517593 -0.485786 +v 1.21857 1.51703 -1.29317 +vn 0.754868 -0.483023 -0.443693 +v 1.15305 1.58297 -1.45186 +vn 0.687966 -0.417247 -0.593808 +v 1.16264 1.55104 -1.41468 +vn 0.707244 -0.468204 -0.529708 +v 1.19679 1.58731 -1.39633 +vn 0.763507 -0.401739 -0.505631 +v 1.20819 1.55081 -1.34605 +vn 0.763356 -0.447602 -0.465768 +v 0.981074 1.39706 -1.44832 +vn 0.548718 -0.638261 -0.539937 +v 0.963186 1.33419 -1.38547 +vn 0.534641 -0.685288 -0.494509 +v 0.9477 1.38144 -1.4645 +vn 0.567335 -0.635713 -0.52345 +v 0.932459 1.3185 -1.39726 +vn 0.54285 -0.689763 -0.479104 +v 0.91912 1.3422 -1.44589 +vn 0.566358 -0.664886 -0.486996 +v 0.963546 1.30218 -1.3381 +vn 0.520593 -0.714552 -0.467331 +v 0.949588 1.29589 -1.34403 +vn 0.522136 -0.716291 -0.462926 +v 0.933567 1.28868 -1.35099 +vn 0.524464 -0.71788 -0.457805 +v 0.913379 1.27974 -1.36022 +vn 0.527374 -0.719647 -0.451647 +v 0.971654 1.45292 -1.51849 +vn 0.581312 -0.571588 -0.579106 +v 1.00343 1.46341 -1.49799 +vn 0.56211 -0.573063 -0.596348 +v 0.92541 1.43224 -1.54584 +vn 0.59812 -0.575312 -0.557915 +v 0.952429 1.51138 -1.59038 +vn 0.616196 -0.49597 -0.611814 +v 1.00664 1.40727 -1.43501 +vn 0.540549 -0.640781 -0.545165 +v 1.02888 1.4725 -1.48342 +vn 0.552985 -0.570578 -0.607164 +v 0.9882 1.34528 -1.37414 +vn 0.532649 -0.683473 -0.49915 +v 0.975737 1.30773 -1.33302 +vn 0.521116 -0.713311 -0.468643 +v 1.01508 1.35712 -1.36138 +vn 0.54091 -0.680188 -0.494733 +v 0.989124 1.28335 -1.27934 +vn 0.519286 -0.726497 -0.450049 +v 0.987447 1.31343 -1.32863 +vn 0.525773 -0.710466 -0.467761 +v 0.998401 1.32127 -1.32812 +vn 0.535404 -0.701988 -0.469633 +v 1.45193 1.74813 -0.92985 +vn 0.924262 -0.222973 -0.309876 +v 1.41912 1.71576 -1.00081 +vn 0.910835 -0.255325 -0.324329 +v 1.42725 1.75775 -1.00848 +vn 0.920287 -0.207801 -0.331498 +v 1.5049 1.74132 -0.7476 +vn 0.935569 -0.255331 -0.243962 +v 1.47395 1.70565 -0.822649 +vn 0.922656 -0.28067 -0.264443 +v 1.49071 1.74821 -0.806544 +vn 0.932395 -0.24404 -0.266616 +v 1.46969 1.83997 -0.928117 +vn 0.939823 -0.104831 -0.325182 +v 1.43725 1.80358 -1.0061 +vn 0.928733 -0.160943 -0.333994 +v 1.44954 1.84372 -0.987996 +vn 0.939425 -0.090217 -0.330667 +v 1.50185 1.7694 -0.785554 +vn 0.940947 -0.216361 -0.260398 +v 1.40778 1.67162 -0.995152 +vn 0.902714 -0.291416 -0.316518 +v 1.43212 1.66054 -0.910968 +vn 0.906635 -0.304387 -0.292168 +v 1.39431 1.62731 -0.990098 +vn 0.895216 -0.320877 -0.309234 +v 1.37775 1.58012 -0.986967 +vn 0.888122 -0.343711 -0.305126 +v 1.4021 1.56911 -0.899289 +vn 0.89293 -0.351201 -0.281665 +v 1.36651 1.54276 -0.976112 +vn 0.881037 -0.364931 -0.300997 +v 1.45912 1.65556 -0.817596 +vn 0.912874 -0.313811 -0.261119 +v 1.47139 1.63722 -0.749102 +vn 0.9149 -0.326351 -0.237597 +v 1.44265 1.60567 -0.8118 +vn 0.904523 -0.340265 -0.257016 +v 1.42654 1.55927 -0.804718 +vn 0.897932 -0.359848 -0.253432 +v 1.44228 1.54101 -0.71794 +vn 0.903257 -0.364519 -0.226389 +v 1.42465 1.52725 -0.763861 +vn 0.899356 -0.36514 -0.240482 +v 1.30774 1.63143 -1.21795 +vn 0.874577 -0.304063 -0.377705 +v 1.3439 1.65603 -1.15124 +vn 0.887215 -0.285416 -0.362475 +v 1.32937 1.60845 -1.1465 +vn 0.875655 -0.325672 -0.356604 +v 1.25817 1.65132 -1.33747 +vn 0.848665 -0.288871 -0.44308 +v 1.29285 1.67671 -1.28389 +vn 0.872587 -0.260428 -0.413242 +v 1.27919 1.63123 -1.28147 +vn 0.856867 -0.308914 -0.412737 +v 1.2869 1.55715 -1.19827 +vn 0.846499 -0.381313 -0.371538 +v 1.32146 1.57553 -1.13444 +vn 0.868747 -0.354041 -0.346315 +v 1.30998 1.53921 -1.12428 +vn 0.856486 -0.38152 -0.347671 +v 1.24222 1.5841 -1.31667 +vn 0.813435 -0.381316 -0.439229 +v 1.27654 1.5962 -1.2588 +vn 0.850272 -0.345939 -0.39669 +v 1.2592 1.56026 -1.26187 +vn 0.820074 -0.397903 -0.41128 +v 1.35461 1.69498 -1.15406 +vn 0.896495 -0.250971 -0.365116 +v 1.32733 1.70607 -1.22527 +vn 0.891104 -0.230942 -0.39064 +v 1.36325 1.7362 -1.15875 +vn 0.902149 -0.213549 -0.374865 +v 1.37059 1.77728 -1.16261 +vn 0.907499 -0.168355 -0.384841 +v 1.34044 1.78544 -1.23383 +vn 0.901213 -0.143328 -0.40899 +v 1.37529 1.81722 -1.1659 +vn 0.912087 -0.115244 -0.393467 +v 1.30061 1.71512 -1.28978 +vn 0.881537 -0.215502 -0.420062 +v 1.27351 1.7223 -1.34687 +vn 0.86667 -0.202144 -0.456093 +v 1.30659 1.75382 -1.29466 +vn 0.886513 -0.172685 -0.429273 +v 1.31138 1.79249 -1.29859 +vn 0.89058 -0.124453 -0.437469 +v 1.28274 1.79748 -1.35512 +vn 0.875614 -0.108491 -0.47067 +v 1.31424 1.83062 -1.30103 +vn 0.892139 -0.0735346 -0.445737 +v 1.35724 1.23543 -0.504982 +vn 0.843529 -0.502379 -0.189931 +v 1.38592 1.25613 -0.420606 +vn 0.879511 -0.447047 -0.163124 +v 1.37187 1.229 -0.418889 +vn 0.853883 -0.494552 -0.162177 +v 1.32304 1.25394 -0.673175 +vn 0.811843 -0.522555 -0.260473 +v 1.35664 1.27238 -0.593151 +vn 0.861085 -0.458001 -0.220836 +v 1.34268 1.24536 -0.589224 +vn 0.835521 -0.501627 -0.224222 +v 1.3244 1.18471 -0.494691 +vn 0.758366 -0.623517 -0.190018 +v 1.35748 1.20776 -0.423796 +vn 0.816067 -0.553726 -0.165592 +v 1.33643 1.18238 -0.435917 +vn 0.771402 -0.612587 -0.172268 +v 1.29169 1.20709 -0.663787 +vn 0.733467 -0.624955 -0.267314 +v 1.32774 1.22189 -0.588137 +vn 0.798599 -0.554812 -0.233289 +v 1.31302 1.19825 -0.578783 +vn 0.753824 -0.616484 -0.227369 +v 1.40103 1.28698 -0.419598 +vn 0.896624 -0.411769 -0.162823 +v 1.38693 1.29412 -0.507748 +vn 0.887789 -0.420748 -0.18655 +v 1.41355 1.31872 -0.426038 +vn 0.909661 -0.382469 -0.161968 +v 1.42768 1.35468 -0.429316 +vn 0.91646 -0.366906 -0.159628 +v 1.4137 1.36151 -0.518352 +vn 0.908838 -0.375258 -0.182193 +v 1.44285 1.3947 -0.432311 +vn 0.919868 -0.359276 -0.157365 +v 1.37168 1.30253 -0.594008 +vn 0.879869 -0.423313 -0.215952 +v 1.3521 1.31019 -0.681629 +vn 0.861269 -0.442866 -0.249169 +v 1.3838 1.33363 -0.602067 +vn 0.89341 -0.395633 -0.212821 +v 1.39758 1.36835 -0.607074 +vn 0.901596 -0.379339 -0.207911 +v 1.37938 1.3773 -0.69589 +vn 0.887434 -0.395427 -0.236852 +v 1.41248 1.407 -0.611492 +vn 0.904684 -0.372604 -0.206672 +v 1.43574 1.28513 -0.161198 +vn 0.909822 -0.405124 -0.0899904 +v 1.42446 1.28123 -0.247911 +vn 0.907292 -0.404937 -0.113343 +v 1.4376 1.31356 -0.251846 +vn 0.918207 -0.378313 -0.117371 +v 1.44369 1.2848 -0.07095 +vn 0.91424 -0.399298 -0.0687525 +v 1.45723 1.31808 -0.072978 +vn 0.925898 -0.370833 -0.0720815 +v 1.46476 1.35707 -0.160536 +vn 0.929543 -0.357967 -0.0883716 +v 1.45387 1.35331 -0.248332 +vn 0.925933 -0.360149 -0.113754 +v 1.46788 1.37914 -0.211806 +vn 0.930684 -0.35183 -0.100214 +v 1.47969 1.36168 0.021296 +vn 0.936231 -0.348327 -0.0462636 +v 1.47281 1.35774 -0.069515 +vn 0.933979 -0.350802 -0.0679766 +v 1.48832 1.39972 -0.067065 +vn 0.938488 -0.339482 -0.0631869 +v 1.41132 1.27889 -0.333796 +vn 0.898284 -0.418041 -0.135375 +v 1.41037 1.25111 -0.247101 +vn 0.889677 -0.442349 -0.113149 +v 1.38109 1.22016 -0.334637 +vn 0.850066 -0.508537 -0.137035 +v 1.39603 1.22338 -0.2463 +vn 0.86374 -0.49142 -0.111625 +v 1.3811 1.19877 -0.24367 +vn 0.828324 -0.550051 -0.106406 +v 1.42943 1.25409 -0.072011 +vn 0.89685 -0.437122 -0.0677043 +v 1.40649 1.22511 -0.159742 +vn 0.865654 -0.493031 -0.0869653 +v 1.41488 1.22586 -0.073093 +vn 0.86964 -0.489328 -0.0654554 +v 1.39933 1.20068 -0.074044 +vn 0.834026 -0.548208 -0.0622022 +v 1.28715 1.22922 0.998048 +vn 0.58067 -0.749574 0.317745 +v 1.28468 1.25414 1.05725 +vn 0.584067 -0.732422 0.34989 +v 1.26449 1.21554 1.00546 +vn 0.556942 -0.765183 0.322972 +v 1.24264 1.20279 1.01216 +vn 0.53785 -0.776238 0.328895 +v 1.23857 1.22688 1.07226 +vn 0.542068 -0.759616 0.35937 +v 1.22552 1.19029 1.00984 +vn 0.521432 -0.78924 0.324359 +v 1.28471 1.28116 1.11093 +vn 0.584943 -0.714595 0.383661 +v 1.28745 1.31118 1.15935 +vn 0.597137 -0.687053 0.413987 +v 1.26245 1.26976 1.12231 +vn 0.562727 -0.728068 0.391479 +v 1.24044 1.2588 1.13297 +vn 0.547709 -0.73675 0.396502 +v 1.24342 1.29222 1.18731 +vn 0.557896 -0.708602 0.432013 +v 1.21983 1.24854 1.14181 +vn 0.537426 -0.743325 0.398299 +v 1.25814 1.14072 0.803284 +vn 0.540191 -0.810026 0.228148 +v 1.26986 1.17213 0.87985 +vn 0.561988 -0.784598 0.261869 +v 1.25165 1.15874 0.877341 +vn 0.535115 -0.803036 0.262269 +v 1.28093 1.13759 0.733055 +vn 0.567095 -0.79991 0.196337 +v 1.26366 1.12521 0.730364 +vn 0.536291 -0.820479 0.198005 +v 1.22021 1.1179 0.806659 +vn 0.495519 -0.838033 0.228389 +v 1.2356 1.14657 0.871692 +vn 0.515753 -0.817125 0.2575 +v 1.21543 1.13854 0.885681 +vn 0.504455 -0.822198 0.263658 +v 1.24834 1.11364 0.72243 +vn 0.51573 -0.835138 0.191226 +v 1.22879 1.10482 0.735167 +vn 0.501358 -0.842341 0.197742 +v 1.2918 1.20678 0.932222 +vn 0.585658 -0.759154 0.284058 +v 1.29673 1.18147 0.847641 +vn 0.591372 -0.770329 0.23848 +v 1.32048 1.20822 0.871923 +vn 0.621425 -0.742948 0.248716 +v 1.3359 1.23916 0.920713 +vn 0.653201 -0.707302 0.270281 +v 1.34569 1.22634 0.858708 +vn 0.674922 -0.703019 0.224153 +v 1.36305 1.24941 0.87609 +vn 0.708087 -0.667185 0.231252 +v 1.30165 1.16369 0.774907 +vn 0.596345 -0.772935 0.216664 +v 1.30673 1.149 0.700876 +vn 0.604063 -0.77822 0.171704 +v 1.32903 1.17392 0.730192 +vn 0.638156 -0.747063 0.186155 +v 1.34257 1.20352 0.793889 +vn 0.671037 -0.711334 0.209079 +v 1.35336 1.19335 0.718872 +vn 0.690655 -0.70399 0.165509 +v 1.36805 1.21116 0.730291 +vn 0.725361 -0.665427 0.176234 +v 1.33012 1.28466 1.03956 +vn 0.650487 -0.682352 0.333561 +v 1.31003 1.2443 0.989943 +vn 0.61389 -0.726117 0.309667 +v 1.33804 1.26297 0.975588 +vn 0.658449 -0.695227 0.288278 +v 1.32952 1.33593 1.13484 +vn 0.666799 -0.633101 0.393144 +v 1.30656 1.29358 1.09933 +vn 0.615959 -0.693752 0.373233 +v 1.32937 1.30998 1.09076 +vn 0.657699 -0.661872 0.359664 +v 1.35525 1.28688 0.991797 +vn 0.692979 -0.656827 0.29725 +v 1.32771 1.463 1.30377 +vn 0.676187 -0.529212 0.512548 +v 1.36701 1.46876 1.25088 +vn 0.757937 -0.487311 0.433658 +v 1.35687 1.50514 1.30503 +vn 0.738722 -0.468596 0.484466 +v 1.38326 1.59353 1.33936 +vn 0.782063 -0.36854 0.502549 +v 1.40021 1.58998 1.30913 +vn 0.814524 -0.356259 0.457853 +v 1.38746 1.54544 1.29323 +vn 0.788389 -0.417749 0.451585 +v 1.41453 1.58638 1.27822 +vn 0.850334 -0.341657 0.400254 +v 1.34062 1.50602 1.32873 +vn 0.697228 -0.477436 0.534722 +v 1.31986 1.49844 1.34731 +vn 0.662878 -0.498331 0.558801 +v 1.28468 1.44875 1.34028 +vn 0.619434 -0.556697 0.553525 +v 1.29997 1.49176 1.36418 +vn 0.637963 -0.514002 0.573415 +v 1.28603 1.4924 1.37971 +vn 0.623369 -0.511625 0.591313 +v 1.35351 1.5505 1.349 +vn 0.723974 -0.432788 0.537175 +v 1.36622 1.59717 1.36716 +vn 0.74862 -0.376228 0.545913 +v 1.34692 1.59157 1.38808 +vn 0.714092 -0.396741 0.576775 +v 1.31444 1.53812 1.38665 +vn 0.666124 -0.460853 0.586424 +v 1.32826 1.5864 1.40672 +vn 0.685427 -0.411088 0.600996 +v 1.31117 1.58205 1.42247 +vn 0.666811 -0.42137 0.614663 +v 1.30222 1.38105 1.24215 +vn 0.629487 -0.618287 0.470604 +v 1.3148 1.42171 1.27607 +vn 0.647667 -0.57361 0.501498 +v 1.29312 1.41319 1.29279 +vn 0.618288 -0.590175 0.519051 +v 1.27201 1.33617 1.21898 +vn 0.583342 -0.669825 0.459399 +v 1.25091 1.32949 1.23553 +vn 0.567588 -0.675544 0.470621 +v 1.25988 1.36677 1.2755 +vn 0.58329 -0.640609 0.499392 +v 1.27195 1.40503 1.30806 +vn 0.596436 -0.601306 0.531692 +v 1.25267 1.39733 1.32033 +vn 0.582613 -0.609516 0.537636 +v 1.23027 1.31834 1.24383 +vn 0.555513 -0.685402 0.470775 +v 1.33237 1.4239 1.25437 +vn 0.693097 -0.555336 0.459586 +v 1.34484 1.39545 1.19796 +vn 0.711319 -0.565514 0.417396 +v 1.31228 1.35167 1.18712 +vn 0.648367 -0.632475 0.423787 +v 1.18111 1.72517 -1.49034 +vn 0.741505 -0.202764 -0.639576 +v 1.14252 1.70779 -1.52563 +vn 0.682709 -0.232873 -0.692588 +v 1.14924 1.78263 -1.53811 +vn 0.697671 -0.122739 -0.705826 +v 1.1866 1.7992 -1.50123 +vn 0.750785 -0.097047 -0.653379 +v 1.20556 1.76269 -1.47051 +vn 0.788495 -0.148527 -0.596838 +v 1.25342 1.76588 -1.39922 +vn 0.849859 -0.149494 -0.505363 +v 1.25618 1.80133 -1.40364 +vn 0.853245 -0.0984813 -0.512128 +v 1.20844 1.83632 -1.47851 +vn 0.791612 -0.043347 -0.609484 +v 1.25742 1.83782 -1.40635 +vn 0.853772 -0.0469742 -0.518523 +v 1.2574 1.87417 -1.40821 +vn 0.852435 0.00728876 -0.522783 +v 1.2243 1.73032 -1.43416 +vn 0.814427 -0.191963 -0.547593 +v 1.19711 1.68911 -1.45692 +vn 0.774399 -0.249602 -0.581382 +v 1.16992 1.65229 -1.47376 +vn 0.719811 -0.309173 -0.621518 +v 1.2129 1.65725 -1.41869 +vn 0.794784 -0.292555 -0.531724 +v 1.18301 1.61782 -1.43797 +vn 0.747165 -0.356928 -0.560666 +v 1.2494 1.72762 -1.39296 +vn 0.846341 -0.19448 -0.495868 +v 1.24348 1.69011 -1.3864 +vn 0.837395 -0.240946 -0.490626 +v 1.23683 1.65397 -1.37834 +vn 0.82693 -0.289782 -0.481886 +v 1.22928 1.62145 -1.36967 +vn 0.808563 -0.346935 -0.475249 +v 1.12993 1.63445 -1.50711 +vn 0.658043 -0.341312 -0.671182 +v 1.1417 1.22318 -0.982259 +vn 0.559076 -0.732264 -0.388874 +v 1.15966 1.19841 -0.907975 +vn 0.557458 -0.744285 -0.367806 +v 1.14445 1.18308 -0.899043 +vn 0.537553 -0.762045 -0.361005 +v 1.09971 1.19449 -0.985274 +vn 0.526099 -0.757955 -0.385648 +v 1.12003 1.17221 -0.91162 +vn 0.525368 -0.768978 -0.364228 +v 1.10158 1.1614 -0.915017 +vn 0.511608 -0.779428 -0.361594 +v 1.18065 1.17762 -0.830304 +vn 0.570643 -0.747983 -0.338951 +v 1.1981 1.15486 -0.746879 +vn 0.569556 -0.763557 -0.30428 +v 1.17818 1.14018 -0.745681 +vn 0.543123 -0.783258 -0.302529 +v 1.14095 1.14503 -0.819856 +vn 0.523626 -0.785037 -0.330958 +v 1.15683 1.12206 -0.73571 +vn 0.521516 -0.802282 -0.290454 +v 1.1412 1.11642 -0.74735 +vn 0.504523 -0.809318 -0.300769 +v 1.10845 1.27862 -1.12506 +vn 0.558534 -0.711873 -0.425765 +v 1.12831 1.25678 -1.06173 +vn 0.558954 -0.717719 -0.415271 +v 1.1084 1.23575 -1.05113 +vn 0.541337 -0.735505 -0.407415 +v 1.09033 1.33517 -1.23807 +vn 0.573436 -0.68494 -0.449475 +v 1.10356 1.31223 -1.18591 +vn 0.565922 -0.694556 -0.444211 +v 1.08228 1.29354 -1.18299 +vn 0.550252 -0.710479 -0.438682 +v 1.06594 1.25297 -1.13593 +vn 0.535877 -0.730047 -0.424108 +v 1.08399 1.22584 -1.06503 +vn 0.531343 -0.741803 -0.409148 +v 1.06544 1.21551 -1.07013 +vn 0.522333 -0.749263 -0.407153 +v 1.06192 1.29115 -1.2044 +vn 0.546069 -0.711365 -0.442458 +v 1.04295 1.27228 -1.1969 +vn 0.535152 -0.72331 -0.436388 +v 1.14694 1.2626 -1.04619 +vn 0.577197 -0.708181 -0.4066 +v 1.17165 1.27159 -1.02565 +vn 0.605957 -0.69099 -0.394143 +v 1.15479 1.29983 -1.09746 +vn 0.59717 -0.681737 -0.422638 +v 1.18857 1.30084 -1.04945 +vn 0.629482 -0.664806 -0.402227 +v 1.12021 1.31633 -1.17088 +vn 0.576303 -0.689522 -0.438674 +v 1.13825 1.32329 -1.15766 +vn 0.596349 -0.676429 -0.432217 +v 1.17231 1.35757 -1.16171 +vn 0.638604 -0.636617 -0.432324 +v 1.17655 1.21338 -0.911563 +vn 0.587104 -0.72108 -0.367902 +v 1.21506 1.16981 -0.751056 +vn 0.604298 -0.734597 -0.308529 +v 1.25871 1.24613 -0.824701 +vn 0.71117 -0.621401 -0.328784 +v 1.22265 1.25386 -0.91089 +vn 0.655949 -0.663053 -0.360682 +v 1.24652 1.27323 -0.900002 +vn 0.708281 -0.616634 -0.343657 +v 1.26003 1.21125 -0.752263 +vn 0.684527 -0.661569 -0.306185 +v 1.28326 1.23175 -0.74028 +vn 0.740418 -0.606551 -0.289615 +v 1.52009 1.74075 1.04938 +vn 0.963798 -0.181009 0.195777 +v 1.53072 1.72749 0.979863 +vn 0.965447 -0.195091 0.172775 +v 1.54183 1.78915 0.981839 +vn 0.969929 -0.162675 0.181035 +v 1.5403 1.71425 0.906121 +vn 0.965878 -0.209364 0.152471 +v 1.54817 1.69987 0.831111 +vn 0.965062 -0.2249 0.134443 +v 1.56206 1.76239 0.829016 +vn 0.970685 -0.193798 0.142172 +v 1.49716 1.62597 1.03804 +vn 0.953448 -0.23979 0.182859 +v 1.50519 1.61045 0.970522 +vn 0.955313 -0.248827 0.159568 +v 1.51837 1.66785 0.976148 +vn 0.96068 -0.22312 0.165263 +v 1.51219 1.59502 0.898735 +vn 0.956003 -0.258662 0.138392 +v 1.51834 1.58033 0.822896 +vn 0.955821 -0.268201 0.120309 +v 1.53391 1.63966 0.826632 +vn 0.960406 -0.248404 0.126156 +v 1.56282 1.83975 0.909356 +vn 0.975108 -0.142572 0.169818 +v 1.55113 1.85207 0.982266 +vn 0.973997 -0.124283 0.189428 +v 1.55799 1.91539 0.981542 +vn 0.977249 -0.0797047 0.196547 +v 1.57635 1.96815 0.904114 +vn 0.982813 -0.0414838 0.179882 +v 1.56166 1.97734 0.98109 +vn 0.978671 -0.0280189 0.203513 +v 1.57375 1.79296 0.788327 +vn 0.974312 -0.181581 0.133212 +v 1.57436 1.83029 0.829147 +vn 0.976819 -0.155732 0.146872 +v 1.58391 1.89795 0.827018 +vn 0.983055 -0.106801 0.148983 +v 1.59967 1.93649 0.742682 +vn 0.988068 -0.0787807 0.132342 +v 1.58977 1.96246 0.823135 +vn 0.987131 -0.0484625 0.152395 +v 1.5377 1.86248 1.05374 +vn 0.971247 -0.109019 0.211647 +v 1.52332 1.8724 1.12063 +vn 0.966882 -0.0946714 0.237015 +v 1.51673 1.81242 1.11829 +vn 0.964103 -0.133513 0.229522 +v 1.50808 1.88138 1.18251 +vn 0.960425 -0.0822399 0.266122 +v 1.49213 1.88949 1.23894 +vn 0.950659 -0.0740729 0.301264 +v 1.4878 1.83219 1.23484 +vn 0.948045 -0.111508 0.297953 +v 1.54617 1.98579 1.05248 +vn 0.974187 -0.0123004 0.225409 +v 1.52955 1.99277 1.12091 +vn 0.968395 0.000235366 0.24942 +v 1.52772 1.93273 1.12147 +vn 0.968477 -0.0504743 0.243936 +v 1.51225 1.99883 1.18436 +vn 0.960775 0.0110974 0.277106 +v 1.49452 2.00427 1.24218 +vn 0.950636 0.0186911 0.309745 +v 1.49445 1.94703 1.24138 +vn 0.951209 -0.0271622 0.307348 +v 1.49561 1.7652 1.17427 +vn 0.954346 -0.157695 0.253685 +v 1.5084 1.7535 1.1143 +vn 0.960395 -0.168132 0.222202 +v 1.49871 1.6963 1.10856 +vn 0.955809 -0.199699 0.215753 +v 1.47763 1.65528 1.15871 +vn 0.943064 -0.225325 0.244659 +v 1.48803 1.64114 1.10082 +vn 0.949531 -0.231634 0.211512 +v 1.46931 1.79014 1.27353 +vn 0.930534 -0.144845 0.336342 +v 1.48176 1.77575 1.22899 +vn 0.943942 -0.152605 0.292722 +v 1.47425 1.72067 1.22138 +vn 0.938319 -0.185778 0.291622 +v 1.45466 1.6825 1.25521 +vn 0.913322 -0.226529 0.338421 +v 1.46567 1.66751 1.21149 +vn 0.929461 -0.226464 0.291232 +v 1.26128 1.41104 -1.08094 +vn 0.785485 -0.496839 -0.369004 +v 1.23951 1.42832 -1.14743 +vn 0.759276 -0.515296 -0.397454 +v 1.27337 1.43975 -1.09264 +vn 0.806649 -0.465829 -0.363759 +v 1.28566 1.47098 -1.10358 +vn 0.825379 -0.438451 -0.355682 +v 1.2646 1.48843 -1.17178 +vn 0.809715 -0.448856 -0.378007 +v 1.29793 1.50385 -1.11413 +vn 0.843514 -0.407255 -0.35018 +v 1.22218 1.44732 -1.20466 +vn 0.737509 -0.538936 -0.406976 +v 1.23162 1.4724 -1.21932 +vn 0.761599 -0.498156 -0.414497 +v 1.24276 1.50267 -1.23325 +vn 0.787086 -0.462529 -0.408122 +v 1.25353 1.53397 -1.24662 +vn 0.809899 -0.429087 -0.399936 +v 1.34411 1.41243 -0.869434 +vn 0.864116 -0.414373 -0.285654 +v 1.31285 1.39998 -0.941963 +vn 0.840681 -0.441589 -0.313455 +v 1.3258 1.4323 -0.950771 +vn 0.854291 -0.418173 -0.308736 +v 1.34963 1.36143 -0.775428 +vn 0.868224 -0.419812 -0.264472 +v 1.36177 1.39334 -0.784463 +vn 0.875604 -0.404181 -0.264492 +v 1.37061 1.48405 -0.887067 +vn 0.880477 -0.382858 -0.279608 +v 1.3389 1.46655 -0.959592 +vn 0.865824 -0.398343 -0.302772 +v 1.35103 1.50164 -0.969806 +vn 0.871105 -0.385371 -0.30441 +v 1.40979 1.45689 -0.709024 +vn 0.898014 -0.375683 -0.228983 +v 1.37711 1.43117 -0.789738 +vn 0.885898 -0.387258 -0.255374 +v 1.38917 1.46634 -0.800343 +vn 0.89003 -0.378238 -0.254525 +v 1.29967 1.37023 -0.933582 +vn 0.820623 -0.471958 -0.322233 +v 1.31826 1.35004 -0.852991 +vn 0.835502 -0.462371 -0.296902 +v 1.28613 1.34219 -0.925675 +vn 0.796385 -0.507546 -0.328889 +v 1.27166 1.31656 -0.918761 +vn 0.766185 -0.545882 -0.339077 +v 1.29021 1.29566 -0.840117 +vn 0.785101 -0.534427 -0.313057 +v 1.25681 1.29266 -0.912277 +vn 0.734216 -0.580667 -0.351786 +v 1.33615 1.33064 -0.769158 +vn 0.852381 -0.445352 -0.274059 +v 1.3225 1.3018 -0.763331 +vn 0.830806 -0.480546 -0.280778 +v 1.30809 1.27553 -0.75806 +vn 0.801871 -0.52258 -0.289679 +v 1.29342 1.2511 -0.752711 +vn 0.769975 -0.561985 -0.302177 +v 1.21998 1.37925 -1.11705 +vn 0.711868 -0.572632 -0.406615 +v 1.24898 1.3839 -1.06936 +vn 0.75999 -0.531154 -0.374553 +v 1.23603 1.3591 -1.05864 +vn 0.732238 -0.564767 -0.380611 +v 1.20178 1.39221 -1.16591 +vn 0.69603 -0.577818 -0.426227 +v 1.19711 1.33492 -1.09004 +vn 0.657064 -0.629242 -0.415117 +v 1.22249 1.3362 -1.04937 +vn 0.700867 -0.598207 -0.388503 +v 1.212 1.31782 -1.03866 +vn 0.675991 -0.628731 -0.384361 +v 0.155986 4.88749 2.16042 +vn 0.135123 -0.125021 0.98291 +v 0.078641 4.90196 2.16966 +vn 0.0651975 -0.162447 0.984561 +v 0.076717 4.87814 2.1617 +vn 0.0160262 -0.431948 0.901756 +v 0.151481 4.86317 2.15349 +vn 0.0292378 -0.405195 0.913762 +v 0.07409 4.85394 2.14571 +vn -0.0249766 -0.621917 0.782685 +v 0 4.91195 2.17353 +vn 0 -0.100494 0.994938 +v 0 4.88844 2.16713 +vn -1.3936e-18 -0.383784 0.923423 +v 0 4.86449 2.15291 +vn 2.64604e-06 -0.590991 0.806678 +v 0.230166 4.86177 2.14466 +vn 0.232028 -0.0748369 0.969826 +v 0.223493 4.83693 2.13958 +vn 0.0660233 -0.363012 0.929442 +v 0.299428 4.82143 2.12138 +vn 0.356721 -0.0376225 0.933453 +v 0.146206 4.83867 2.13791 +vn -0.0588811 -0.605559 0.793619 +v 0.215868 4.8123 2.12513 +vn -0.0835851 -0.577604 0.812027 +v 0.290959 4.79692 2.1187 +vn 0.123257 -0.32953 0.936065 +v 0.235767 4.88852 2.14088 +vn 0.365176 0.241478 0.899074 +v 0.157506 4.91172 2.15961 +vn 0.227308 0.177896 0.957436 +v 0.225892 4.91599 2.13232 +vn 0.435027 0.518476 0.736162 +v 0.302219 4.85069 2.11683 +vn 0.531601 0.246535 0.810322 +v 0.283323 4.87904 2.11877 +vn 0.55261 0.394553 0.734132 +v 0.078945 4.92525 2.17005 +vn 0.107704 0.146672 0.983304 +v 0.153629 4.93559 2.15244 +vn 0.278123 0.447473 0.84995 +v 0.0768 4.94763 2.16332 +vn 0.128772 0.438389 0.889513 +v 0 4.93475 2.17237 +vn 2.90317e-06 0.215087 0.976595 +v 0.410719 4.71952 2.05985 +vn 0.576755 -0.0436329 0.815751 +v 0.358071 4.77055 2.09395 +vn 0.434301 -0.0361419 0.900042 +v 0.353384 4.74389 2.08973 +vn 0.203708 -0.333184 0.920593 +v 0.413837 4.68201 2.05024 +vn 0.334882 -0.326193 0.883998 +v 0.344198 4.71896 2.07753 +vn -0.0516257 -0.541412 0.839171 +v 0.282089 4.77226 2.10542 +vn -0.088965 -0.553318 0.828205 +v 0.439007 4.68628 2.0359 +vn 0.645538 -0.0596091 0.761398 +v 0.472046 4.64978 2.00375 +vn 0.695474 -0.026246 0.718072 +v 0.468933 4.61853 1.99958 +vn 0.472954 -0.332728 0.815847 +v 0.500391 4.61416 1.97198 +vn 0.719928 -0.118511 0.683856 +v 0.402131 4.65783 2.04021 +vn 0.0427165 -0.547265 0.835868 +v 0.456025 4.59649 1.99223 +vn 0.183848 -0.575171 0.797106 +v 0.438931 4.71889 2.02968 +vn 0.783787 0.240012 0.572776 +v 0.48253 4.66954 1.98639 +vn 0.815907 0.213403 0.537359 +v 0.459616 4.72058 1.99195 +vn 0.828671 0.403428 0.388007 +v 0.503146 4.66639 1.95089 +vn 0.84584 0.342092 0.409303 +v 0.36794 4.7956 2.08293 +vn 0.665854 0.268308 0.696168 +v 0.393216 4.7542 2.07243 +vn 0.62709 0.102623 0.772157 +v 0.407057 4.7533 2.0577 +vn 0.765446 0.267246 0.585381 +v 0.430785 4.75543 2.01629 +vn 0.812683 0.433689 0.389179 +v 0.344332 4.83469 2.08887 +vn 0.677613 0.397465 0.618758 +v 0.36413 4.82805 2.06487 +vn 0.763727 0.512211 0.392888 +v 0.132957 4.97564 2.12127 +vn 0.244148 0.856641 0.454487 +v 0.067178 4.98424 2.12943 +vn 0.113323 0.877617 0.465774 +v 0.072414 4.96805 2.14976 +vn 0.12761 0.686334 0.716004 +v 0.144413 4.95784 2.1397 +vn 0.279854 0.671451 0.686175 +v 0 4.98997 2.12569 +vn -1.12354e-18 0.915309 0.402752 +v 0 4.97552 2.14824 +vn 2.60763e-06 0.744903 0.667173 +v 0 4.95634 2.16387 +vn 5.18083e-06 0.505165 0.863023 +v 0.193173 4.9617 2.10311 +vn 0.405911 0.833338 0.375211 +v 0.212739 4.94075 2.1186 +vn 0.458388 0.687763 0.562906 +v 0.174905 4.97455 2.08362 +vn 0.314226 0.939831 0.134084 +v 0.12152 4.98639 2.09677 +vn 0.191074 0.967915 0.163188 +v 0.15499 4.97934 2.05819 +vn 0.213111 0.970007 -0.116917 +v 0.192143 4.96797 2.04851 +vn 0.312074 0.940995 -0.130916 +v 0.060866 4.99385 2.10256 +vn 0.0937696 0.981114 0.169183 +v 0.102534 4.98954 2.06642 +vn 0.130533 0.9857 -0.106572 +v 0.044655 4.99557 2.07097 +vn 0.0639225 0.992644 -0.10282 +v 0 4.99739 2.09725 +vn -4.0255e-06 0.992454 0.122617 +v 0.1347 4.30196 2.04795 +vn 0.127983 -0.927431 0.351414 +v 0.066545 4.30011 2.06171 +vn 0.0655937 -0.942155 0.328697 +v 0.073048 4.28381 2.00911 +vn 0.0526796 -0.950344 0.306711 +v 0.147906 4.28554 1.99557 +vn 0.112727 -0.938767 0.32559 +v 0.081568 4.26637 1.95463 +vn 0.0508642 -0.940327 0.33645 +v 0 4.30336 2.07836 +vn 3.87273e-18 -0.942646 0.333795 +v 0 4.28718 2.02646 +vn 2.20955e-18 -0.954786 0.297294 +v 0 4.27025 1.97184 +vn -2.76156e-18 -0.947003 0.321225 +v 0.20276 4.30563 2.0272 +vn 0.200361 -0.903793 0.378172 +v 0.222037 4.28963 1.97446 +vn 0.188844 -0.919779 0.344012 +v 0.164743 4.26838 1.94078 +vn 0.118294 -0.928865 0.351021 +v 0.246082 4.2736 1.91797 +vn 0.208668 -0.908562 0.361901 +v 0.188134 4.32315 2.07299 +vn 0.24742 -0.843249 0.477195 +v 0.124828 4.31946 2.09418 +vn 0.167272 -0.879173 0.446179 +v 0.177717 4.34353 2.10833 +vn 0.328404 -0.686061 0.649208 +v 0.237627 4.34749 2.07809 +vn 0.421189 -0.616972 0.664789 +v 0.061769 4.31741 2.10846 +vn 0.0911779 -0.900889 0.424365 +v 0.117938 4.33978 2.13034 +vn 0.232017 -0.742087 0.628869 +v 0.058473 4.33768 2.14511 +vn 0.131298 -0.773583 0.619944 +v 0 4.32108 2.12343 +vn 1.11279e-18 -0.891373 0.45327 +v 0.513122 4.69927 1.87108 +vn 0.80005 0.559851 0.215605 +v 0.559773 4.6423 1.83542 +vn 0.8358 0.463818 0.293786 +v 0.544528 4.68323 1.79607 +vn 0.766444 0.608926 0.204384 +v 0.594829 4.62867 1.75888 +vn 0.812485 0.501919 0.296558 +v 0.57418 4.67325 1.72046 +vn 0.725406 0.648788 0.229911 +v 0.628595 4.6234 1.67979 +vn 0.782706 0.532519 0.322173 +v 0.487956 4.73884 1.83469 +vn 0.717397 0.689498 0.0996756 +v 0.45957 4.75856 1.90884 +vn 0.760929 0.634854 0.133966 +v 0.513193 4.72399 1.76225 +vn 0.669824 0.733791 0.113516 +v 0.452965 4.77178 1.79888 +vn 0.619463 0.78501 0.0050126 +v 0.482819 4.71511 1.93928 +vn 0.822098 0.500145 0.272047 +v 0.429421 4.7768 1.98277 +vn 0.791065 0.569984 0.222115 +v 0.401101 4.78776 2.04025 +vn 0.788011 0.471164 0.396286 +v 0.527394 4.65868 1.90166 +vn 0.845605 0.428736 0.318023 +v 0.530963 4.63398 1.91871 +vn 0.86262 0.289394 0.414894 +v 0.121065 4.9623 1.98133 +vn 0.128465 0.937507 -0.323385 +v 0.176428 4.95095 1.9769 +vn 0.210884 0.927491 -0.308689 +v 0.125981 4.94461 1.93186 +vn 0.133392 0.947997 -0.288978 +v 0.184875 4.9325 1.92692 +vn 0.21479 0.937001 -0.275488 +v 0.130068 4.92983 1.87845 +vn 0.145049 0.969471 -0.197702 +v 0.191207 4.91692 1.8725 +vn 0.229946 0.954172 -0.191523 +v 0.063614 4.95262 1.93735 +vn 0.0618284 0.952456 -0.298335 +v 0.061417 4.97006 1.98675 +vn 0.060611 0.94253 -0.328578 +v 0 4.95939 1.95164 +vn -2.76173e-18 0.948861 -0.315693 +v 0.065662 4.93803 1.88446 +vn 0.0671983 0.976316 -0.205647 +v 0 4.9437 1.8996 +vn -4.48326e-06 0.971729 -0.236098 +v 0.115979 4.97831 2.02586 +vn 0.130158 0.95244 -0.275531 +v 0.058332 4.98572 2.03176 +vn 0.0644478 0.959309 -0.274906 +v 0 4.97677 2.00006 +vn 3.30925e-06 0.945019 -0.327015 +v 0 4.99105 2.04329 +vn 8.59403e-07 0.965701 -0.259658 +v 0.167316 4.96744 2.01982 +vn 0.210243 0.938363 -0.27436 +v 0.370805 4.90121 1.38811 +vn 0.387162 0.684287 0.617946 +v 0.448062 4.85661 1.3855 +vn 0.439943 0.67035 0.597563 +v 0.460487 4.8673 1.3665 +vn 0.440186 0.615467 0.653787 +v 0.527328 4.8232 1.35975 +vn 0.503806 0.623994 0.597336 +v 0.374492 4.91688 1.37053 +vn 0.362905 0.63876 0.678444 +v 0.294548 4.9445 1.3837 +vn 0.334346 0.705495 0.624891 +v 0.298287 4.96034 1.36593 +vn 0.30345 0.656901 0.690216 +v 0.224082 4.98125 1.37648 +vn 0.280287 0.723778 0.630543 +v 0.292386 4.93446 1.39769 +vn 0.37318 0.763411 0.527201 +v 0.367727 4.89238 1.4011 +vn 0.416835 0.742823 0.523892 +v 0.291728 4.92775 1.40946 +vn 0.405485 0.810372 0.422942 +v 0.22227 4.97045 1.39141 +vn 0.317079 0.784933 0.532297 +v 0.221961 4.96305 1.40423 +vn 0.347345 0.833028 0.4306 +v 0.444938 4.84971 1.39658 +vn 0.456639 0.73229 0.505205 +v 0.522627 4.81661 1.37105 +vn 0.496718 0.684365 0.533774 +v 0.366654 4.88654 1.41162 +vn 0.442135 0.791853 0.421291 +v 0.44366 4.84505 1.40567 +vn 0.465125 0.785902 0.407453 +v 0.520715 4.81215 1.37949 +vn 0.485593 0.754998 0.440655 +v 0.821584 4.60686 1.12651 +vn 0.797471 0.135953 0.587841 +v 0.826735 4.53128 1.13661 +vn 0.775988 0.144024 0.614085 +v 0.836615 4.60491 1.10736 +vn 0.782509 0.147575 0.604898 +v 0.844962 4.52549 1.11568 +vn 0.764234 0.154522 0.626155 +v 0.862295 4.59927 1.07598 +vn 0.784026 0.169851 0.597037 +v 0.812128 4.45449 1.1736 +vn 0.77955 0.149208 0.608308 +v 0.828351 4.44656 1.1556 +vn 0.763582 0.158733 0.625897 +v 0.855211 4.43696 1.12575 +vn 0.766297 0.152814 0.624049 +v 0.81719 4.67167 1.1167 +vn 0.80035 0.173601 0.573849 +v 0.804205 4.6702 1.13541 +vn 0.813485 0.171521 0.555718 +v 0.783362 4.72337 1.14664 +vn 0.793066 0.251001 0.555018 +v 0.837971 4.67423 1.08713 +vn 0.801235 0.195833 0.565395 +v 0.801001 4.7307 1.11821 +vn 0.793356 0.260676 0.550122 +v 0.813073 4.60944 1.13801 +vn 0.833538 0.128312 0.537355 +v 0.796867 4.67021 1.14674 +vn 0.845952 0.202497 0.493315 +v 0.808026 4.62021 1.14413 +vn 0.892048 0.163961 0.42115 +v 0.772208 4.71898 1.16478 +vn 0.800164 0.269414 0.535868 +v 0.765986 4.71644 1.17591 +vn 0.814161 0.334968 0.474277 +v 0.793295 4.66971 1.15407 +vn 0.892182 0.265081 0.365709 +v 0.816127 4.53565 1.14947 +vn 0.811827 0.123238 0.570744 +v 0.810649 4.54596 1.15604 +vn 0.880048 0.0932441 0.465641 +v 0.802876 4.45994 1.18465 +vn 0.815611 0.120678 0.565875 +v 0.731959 4.28562 1.3104 +vn 0.803248 -0.0178635 0.595377 +v 0.699635 4.24727 1.34977 +vn 0.790649 -0.116993 0.600989 +v 0.703686 4.24321 1.3438 +vn 0.785278 -0.111276 0.609061 +v 0.743003 4.27612 1.29574 +vn 0.791682 -0.0138116 0.610777 +v 0.709092 4.23779 1.33585 +vn 0.780227 -0.115014 0.614831 +v 0.715746 4.23123 1.32632 +vn 0.77547 -0.118387 0.620187 +v 0.66195 4.21131 1.38839 +vn 0.75877 -0.236872 0.606762 +v 0.61808 4.17879 1.42528 +vn 0.699258 -0.366786 0.613601 +v 0.620872 4.17481 1.41985 +vn 0.695942 -0.362347 0.619975 +v 0.669904 4.20185 1.37506 +vn 0.749658 -0.236024 0.618308 +v 0.624539 4.16945 1.41256 +vn 0.6913 -0.36526 0.623449 +v 0.62908 4.16291 1.40381 +vn 0.686701 -0.367299 0.627322 +v 0.780874 4.36753 1.23566 +vn 0.796656 0.11305 0.593767 +v 0.758738 4.32604 1.27207 +vn 0.802335 0.0604472 0.593806 +v 0.764045 4.32203 1.26547 +vn 0.794301 0.0681603 0.603688 +v 0.798151 4.40994 1.20297 +vn 0.786761 0.143936 0.600241 +v 0.804454 4.40622 1.19576 +vn 0.776528 0.151836 0.611515 +v 0.794686 4.35845 1.21959 +vn 0.781795 0.121064 0.61167 +v 0.771195 4.3167 1.25676 +vn 0.788755 0.0665862 0.611091 +v 0.779955 4.31032 1.2463 +vn 0.784325 0.0641239 0.617028 +v 0.813002 4.40135 1.18628 +vn 0.77012 0.15271 0.619351 +v 0.823428 4.39555 1.1749 +vn 0.765998 0.151682 0.624692 +v 0.754569 4.3293 1.27748 +vn 0.812549 0.0496073 0.580779 +v 0.725528 4.29135 1.31954 +vn 0.820983 -0.0450773 0.56917 +v 0.751562 4.3317 1.28159 +vn 0.825742 0.0290916 0.563298 +v 0.749218 4.33366 1.28506 +vn 0.840647 0.00432326 0.541567 +v 0.793193 4.413 1.20885 +vn 0.801075 0.131665 0.583904 +v 0.772948 4.3731 1.24565 +vn 0.824683 0.0802469 0.559873 +v 0.789697 4.41525 1.21332 +vn 0.819857 0.111335 0.56164 +v 0.787005 4.41708 1.21704 +vn 0.843019 0.0839784 0.531288 +v 0.696454 4.25053 1.35469 +vn 0.796832 -0.12389 0.591363 +v 0.568144 4.14998 1.45877 +vn 0.611548 -0.49235 0.619355 +v 0.615889 4.18197 1.42977 +vn 0.702849 -0.370535 0.607213 +v 0.657206 4.21694 1.39669 +vn 0.767985 -0.255356 0.587361 +v 0.694085 4.25293 1.35843 +vn 0.803957 -0.140513 0.577849 +v 0.692206 4.25488 1.36163 +vn 0.811425 -0.158546 0.562541 +v 0.564938 4.15547 1.46643 +vn 0.615554 -0.507394 0.60303 +v 0.614175 4.18431 1.43317 +vn 0.705587 -0.383209 0.596069 +v 0.612787 4.18621 1.43615 +vn 0.708397 -0.394682 0.585149 +v 0.310704 4.0771 1.54992 +vn 0.234528 -0.743345 0.626446 +v 0.236128 4.06814 1.56252 +vn 0.165171 -0.758984 0.629811 +v 0.236889 4.06418 1.55765 +vn 0.166624 -0.753505 0.635977 +v 0.312696 4.06776 1.53837 +vn 0.235668 -0.732584 0.638577 +v 0.237489 4.05874 1.55103 +vn 0.16524 -0.751556 0.638638 +v 0.239002 4.05234 1.54318 +vn 0.160422 -0.753012 0.638152 +v 0.159045 4.06203 1.57131 +vn 0.101724 -0.773253 0.625885 +v 0.089644 4.06009 1.57751 +vn 0.0680546 -0.78483 0.615964 +v 0.070383 4.05543 1.57326 +vn 0.0322153 -0.770212 0.636974 +v 0.166155 4.0539 1.56037 +vn 0.110584 -0.75991 0.640552 +v 0.090342 4.05139 1.56686 +vn 0.0643539 -0.757565 0.64958 +v 0.081161 4.04302 1.55757 +vn 0.0463681 -0.762213 0.645664 +v 0.449426 4.10561 1.51289 +vn 0.406473 -0.666868 0.624554 +v 0.382102 4.08963 1.53352 +vn 0.314634 -0.713445 0.6261 +v 0.383151 4.08567 1.52859 +vn 0.314824 -0.707335 0.6329 +v 0.511617 4.12576 1.4881 +vn 0.50739 -0.594893 0.623424 +v 0.513392 4.12182 1.48302 +vn 0.506181 -0.589501 0.629499 +v 0.452572 4.09629 1.50111 +vn 0.404187 -0.658611 0.634716 +v 0.384467 4.0803 1.52191 +vn 0.31394 -0.704951 0.635992 +v 0.386113 4.07371 1.51387 +vn 0.312804 -0.701638 0.640201 +v 0.573325 4.14066 1.44645 +vn 0.605426 -0.488871 0.628065 +v 0.515671 4.1165 1.47615 +vn 0.503642 -0.589099 0.631908 +v 0.51851 4.10997 1.46791 +vn 0.501265 -0.587851 0.634953 +v 0.381267 4.09277 1.5376 +vn 0.314934 -0.720801 0.617464 +v 0.309516 4.08263 1.5571 +vn 0.233583 -0.763902 0.601575 +v 0.380529 4.09509 1.54069 +vn 0.313755 -0.733652 0.602753 +v 0.37989 4.09699 1.54344 +vn 0.313159 -0.746172 0.587502 +v 0.51022 4.12888 1.49231 +vn 0.509195 -0.599843 0.617178 +v 0.447383 4.11108 1.52019 +vn 0.406897 -0.684746 0.604614 +v 0.509057 4.13119 1.49549 +vn 0.509164 -0.612037 0.605114 +v 0.508087 4.13306 1.49832 +vn 0.50983 -0.62267 0.593595 +v 0.235458 4.07127 1.56655 +vn 0.163813 -0.768779 0.618178 +v 0.158358 4.06754 1.57839 +vn 0.103434 -0.792115 0.601543 +v 0.079418 4.06433 1.58376 +vn 0.0469819 -0.799409 0.598947 +v 0.080356 4.06208 1.58076 +vn 0.0425865 -0.799601 0.59902 +v 0.308442 4.08629 1.56238 +vn 0.23113 -0.788102 0.570504 +v 0.234257 4.07729 1.57485 +vn 0.160977 -0.808544 0.565989 +v 0.234689 4.07557 1.57235 +vn 0.162417 -0.795996 0.583105 +v 0.157554 4.07126 1.58365 +vn 0.100444 -0.816871 0.568007 +v 0.079142 4.06804 1.58896 +vn 0.0476041 -0.825044 0.563059 +v 0.079298 4.06629 1.58646 +vn 0.0480466 -0.812709 0.580685 +v 0.667462 4.77761 1.26494 +vn 0.655313 0.519223 0.548609 +v 0.726022 4.75296 1.2109 +vn 0.740359 0.402372 0.538484 +v 0.676079 4.78826 1.24567 +vn 0.66341 0.470684 0.581673 +v 0.735818 4.75974 1.19324 +vn 0.744247 0.360041 0.562554 +v 0.693301 4.79962 1.21795 +vn 0.677695 0.424569 0.600392 +v 0.751379 4.7701 1.1663 +vn 0.750441 0.343009 0.564963 +v 0.603638 4.81588 1.29769 +vn 0.586711 0.545111 0.598852 +v 0.600647 4.79829 1.31791 +vn 0.582525 0.578407 0.57106 +v 0.542175 4.82989 1.34099 +vn 0.52819 0.576278 0.623634 +v 0.625683 4.8359 1.25923 +vn 0.602184 0.49802 0.62398 +v 0.663232 4.77128 1.27661 +vn 0.637504 0.585994 0.500199 +v 0.596304 4.79149 1.32961 +vn 0.559737 0.641637 0.524402 +v 0.660937 4.76786 1.28424 +vn 0.594187 0.686993 0.418309 +v 0.594135 4.78752 1.33754 +vn 0.526819 0.726897 0.440548 +v 0.72072 4.74871 1.22195 +vn 0.730896 0.484482 0.480695 +v 0.718165 4.74609 1.22937 +vn 0.69431 0.611067 0.380173 +v 0.762986 4.71481 1.18328 +vn 0.818355 0.461578 0.342403 +v 0.103312 5.02415 1.36849 +vn 0.143595 0.746136 0.650124 +v 0.160747 5.00769 1.37118 +vn 0.217179 0.737321 0.63968 +v 0.164127 5.02473 1.35274 +vn 0.194669 0.668193 0.718068 +v 0.10545 5.04263 1.34943 +vn 0.130507 0.663002 0.737155 +v 0.168613 5.05229 1.32832 +vn 0.189861 0.612485 0.767343 +v 0.227867 4.9974 1.35846 +vn 0.25013 0.667573 0.701271 +v 0.045517 5.0344 1.36593 +vn 0.0614186 0.742579 0.666936 +v 0.050935 5.05561 1.34489 +vn 0.0630255 0.650924 0.756522 +v 0 5.04778 1.35401 +vn 0 0.685207 0.728348 +v 0.103225 5.07346 1.3251 +vn 0.125111 0.588692 0.798617 +v 0.044668 5.08036 1.32626 +vn 0.049685 0.581128 0.812294 +v 0 5.07099 1.33448 +vn -2.20996e-18 0.606485 0.795095 +v 0.049876 5.02027 1.38354 +vn 0.0776001 0.821601 0.564757 +v 0.102581 5.01198 1.38466 +vn 0.16086 0.818103 0.552116 +v 0.050159 5.01154 1.39802 +vn 0.0807789 0.877773 0.472218 +v 0 5.03473 1.36759 +vn 0 0.754117 0.656741 +v 0 5.02504 1.37985 +vn -2.21036e-18 0.812045 0.583595 +v 0 5.01556 1.39465 +vn 0 0.867872 0.496787 +v 0.159285 4.99622 1.38679 +vn 0.244609 0.804118 0.541812 +v 0.10253 5.00368 1.39875 +vn 0.17283 0.871215 0.459471 +v 0.159157 4.9883 1.40038 +vn 0.266385 0.855019 0.44495 +v 0.364271 4.82827 1.73101 +vn 0.516587 0.856196 -0.0081481 +v 0.420496 4.79343 1.70989 +vn 0.53488 0.844514 0.0264419 +v 0.368539 4.82696 1.68015 +vn 0.519116 0.853108 0.0522094 +v 0.427732 4.79212 1.65925 +vn 0.52048 0.849464 0.0866691 +v 0.378745 4.8247 1.63718 +vn 0.517903 0.84881 0.10629 +v 0.483172 4.75589 1.67818 +vn 0.546209 0.831675 0.0998631 +v 0.493295 4.7572 1.62622 +vn 0.515469 0.843076 0.153345 +v 0.432388 4.79562 1.61222 +vn 0.50723 0.850018 0.142081 +v 0.321017 4.8544 1.69797 +vn 0.489891 0.870839 0.0405733 +v 0.310924 4.8592 1.74391 +vn 0.467482 0.883891 -0.0140308 +v 0.269649 4.88135 1.69744 +vn 0.422264 0.904678 0.0570241 +v 0.317096 4.86081 1.64607 +vn 0.487321 0.867627 0.0987009 +v 0.35771 4.83501 1.78552 +vn 0.510903 0.856629 -0.0718726 +v 0.306047 4.86479 1.79889 +vn 0.444312 0.891636 -0.0870161 +v 0.255927 4.88541 1.75228 +vn 0.379713 0.925103 -0.00129612 +v 0.252499 4.88915 1.80845 +vn 0.351119 0.932247 -0.0873493 +v 0.411166 4.80004 1.76531 +vn 0.550304 0.834375 -0.0313703 +v 0.469876 4.76032 1.73544 +vn 0.580691 0.812866 0.0452389 +v 0.764837 4.54012 1.42198 +vn 0.948469 -0.187643 0.255337 +v 0.745451 4.49948 1.43885 +vn 0.862625 -0.466203 0.196299 +v 0.765218 4.51076 1.37162 +vn 0.89069 -0.409191 0.198073 +v 0.785431 4.55969 1.35299 +vn 0.963294 -0.149178 0.223184 +v 0.781079 4.52087 1.31595 +vn 0.924586 -0.315769 0.213146 +v 0.721044 4.46896 1.44827 +vn 0.731499 -0.666821 0.142336 +v 0.736925 4.47406 1.38926 +vn 0.75853 -0.609899 0.229469 +v 0.743325 4.46021 1.34842 +vn 0.858708 -0.345657 0.378342 +v 0.777094 4.59513 1.38542 +vn 0.938524 0.15084 0.310515 +v 0.754912 4.57177 1.4569 +vn 0.929839 0.123421 0.34665 +v 0.751018 4.62954 1.4207 +vn 0.822961 0.42597 0.375878 +v 0.799608 4.57593 1.29593 +vn 0.97705 -0.091488 0.192364 +v 0.792104 4.61681 1.32411 +vn 0.944647 0.203102 0.257666 +v 0.765272 4.65204 1.36112 +vn 0.813232 0.476809 0.333628 +v 0.737781 4.52136 1.50113 +vn 0.933333 -0.205253 0.294552 +v 0.726161 4.5515 1.53667 +vn 0.921114 0.115309 0.371825 +v 0.703559 4.50592 1.59151 +vn 0.920618 -0.209135 0.329736 +v 0.729652 4.60668 1.48948 +vn 0.83008 0.396012 0.392609 +v 0.702021 4.58802 1.56545 +vn 0.838451 0.379352 0.39127 +v 0.718676 4.4865 1.51816 +vn 0.842426 -0.486243 0.232134 +v 0.687576 4.47673 1.60091 +vn 0.812556 -0.515042 0.272919 +v 0.696949 4.4602 1.52341 +vn 0.718333 -0.672472 0.178265 +v 0.551872 4.31808 1.62958 +vn 0.771899 -0.463098 0.43556 +v 0.516836 4.30016 1.66891 +vn 0.717239 -0.533586 0.448167 +v 0.522279 4.28001 1.63889 +vn 0.706645 -0.506332 0.494248 +v 0.593597 4.32254 1.56171 +vn 0.811207 -0.323406 0.487189 +v 0.559674 4.3011 1.60164 +vn 0.774501 -0.408948 0.482607 +v 0.559167 4.27488 1.58118 +vn 0.744991 -0.421096 0.517366 +v 0.480876 4.28256 1.70025 +vn 0.638444 -0.609077 0.470546 +v 0.441325 4.26924 1.73402 +vn 0.568938 -0.67745 0.466231 +v 0.436919 4.24456 1.70477 +vn 0.532857 -0.684279 0.497821 +v 0.481338 4.26091 1.67348 +vn 0.634786 -0.595971 0.491798 +v 0.470735 4.23176 1.6517 +vn 0.57504 -0.627256 0.525243 +v 0.602676 4.35455 1.5666 +vn 0.855085 -0.274234 0.440029 +v 0.650721 4.37421 1.4852 +vn 0.86637 -0.0947188 0.490337 +v 0.630943 4.38341 1.52183 +vn 0.874898 0.062458 0.480263 +v 0.631803 4.32872 1.50075 +vn 0.835758 -0.239152 0.494282 +v 0.622709 4.34771 1.52598 +vn 0.850453 -0.232311 0.471977 +v 0.691879 4.39046 1.41649 +vn 0.855172 -0.0691664 0.513708 +v 0.681072 4.4132 1.43253 +vn 0.761899 0.282488 0.582847 +v 0.554124 4.33952 1.65205 +vn 0.787152 -0.490003 0.374552 +v 0.504425 4.31227 1.70596 +vn 0.670241 -0.636473 0.38168 +v 0.60854 4.37287 1.56436 +vn 0.891444 -0.100308 0.441889 +v 0.546623 4.35344 1.68829 +vn 0.853561 -0.347792 0.38791 +v 0.437645 4.28757 1.76636 +vn 0.541434 -0.732584 0.412516 +v 0.359681 4.26798 1.81924 +vn 0.394709 -0.814214 0.425747 +v 0.209075 4.22717 1.83372 +vn 0.167642 -0.873157 0.457703 +v 0.157301 4.22361 1.84208 +vn 0.104945 -0.884938 0.453731 +v 0.165509 4.21362 1.82079 +vn 0.114306 -0.878191 0.464452 +v 0.233507 4.20733 1.78756 +vn 0.191903 -0.857561 0.477244 +v 0.174108 4.20224 1.79754 +vn 0.123744 -0.870283 0.476754 +v 0.182498 4.19069 1.77469 +vn 0.131878 -0.861965 0.489514 +v 0.103457 4.22523 1.85514 +vn 0.0654497 -0.892953 0.445366 +v 0.052386 4.22311 1.85588 +vn 0.0298656 -0.895297 0.444467 +v 0.05524 4.21128 1.83256 +vn 0.0309862 -0.886347 0.461983 +v 0.112582 4.20047 1.80659 +vn 0.0699829 -0.876432 0.476413 +v 0.057417 4.19927 1.80987 +vn 0.0338137 -0.877657 0.478096 +v 0.052496 4.18881 1.79142 +vn 0.0281497 -0.871965 0.488758 +v 0.2581 4.23233 1.82292 +vn 0.224876 -0.863669 0.451118 +v 0.305599 4.23668 1.80401 +vn 0.298009 -0.832345 0.467325 +v 0.338401 4.22042 1.75403 +vn 0.337131 -0.804907 0.488332 +v 0.353941 4.24642 1.7865 +vn 0.381216 -0.801646 0.460476 +v 0.254189 4.18553 1.74135 +vn 0.210942 -0.839291 0.501094 +v 0.285345 4.21235 1.77234 +vn 0.257849 -0.841666 0.474461 +v 0.370151 4.20336 1.70523 +vn 0.382655 -0.769419 0.511438 +v 0.38918 4.23113 1.73156 +vn 0.434318 -0.756028 0.489683 +v 0.273944 4.25484 1.85823 +vn 0.252467 -0.871998 0.41938 +v 0.183048 4.24737 1.88352 +vn 0.138112 -0.901847 0.409386 +v 0 4.22396 1.8595 +vn 1.65681e-18 -0.898462 0.439051 +v 0.050035 4.23346 1.87757 +vn 0.0294534 -0.903836 0.426863 +v 0.096468 4.24724 1.90324 +vn 0.0614426 -0.917495 0.392973 +v 0 4.248 1.91191 +vn 0 -0.923225 0.384259 +v 0.62094 4.68229 1.58036 +vn 0.639341 0.69975 0.318736 +v 0.68383 4.64294 1.53226 +vn 0.724016 0.575173 0.380759 +v 0.640567 4.6937 1.51934 +vn 0.605898 0.719222 0.340012 +v 0.703445 4.66173 1.46788 +vn 0.697983 0.604834 0.383401 +v 0.652375 4.70849 1.46683 +vn 0.568011 0.7523 0.333778 +v 0.71673 4.68141 1.4114 +vn 0.669093 0.649755 0.36074 +v 0.603098 4.70816 1.55263 +vn 0.554031 0.778038 0.296153 +v 0.55203 4.71783 1.63442 +vn 0.579261 0.787872 0.209079 +v 0.562265 4.72543 1.58239 +vn 0.533362 0.809742 0.244629 +v 0.614887 4.71988 1.50131 +vn 0.516698 0.799222 0.30703 +v 0.57574 4.73227 1.53391 +vn 0.499579 0.824046 0.267149 +v 0.501081 4.76252 1.57834 +vn 0.489982 0.849283 0.196562 +v 0.600193 4.67256 1.64889 +vn 0.683182 0.676131 0.275879 +v 0.534655 4.71706 1.69522 +vn 0.623928 0.765213 0.158629 +v 0.658614 4.62888 1.60342 +vn 0.751763 0.555157 0.355883 +v 0.133686 4.92007 1.76568 +vn 0.174141 0.984435 0.0237131 +v 0.196982 4.90573 1.75971 +vn 0.27524 0.961274 0.0139424 +v 0.147583 4.92139 1.708 +vn 0.207911 0.973323 0.0970328 +v 0.210307 4.90483 1.70276 +vn 0.318914 0.944504 0.0787817 +v 0.190615 4.91756 1.64988 +vn 0.299133 0.94432 0.137034 +v 0.252031 4.89452 1.64594 +vn 0.406412 0.906328 0.115752 +v 0.073538 4.93272 1.70766 +vn 0.0958818 0.989003 0.112601 +v 0.067291 4.92838 1.77212 +vn 0.0801856 0.996474 0.0246891 +v 0 4.93376 1.72965 +vn -7.02334e-06 0.995809 0.0914576 +v 0.12832 4.93285 1.65308 +vn 0.190949 0.96876 0.158246 +v 0.073526 4.94192 1.64741 +vn 0.0992139 0.979714 0.174116 +v 0 4.94379 1.65722 +vn -2.29514e-06 0.985342 0.17059 +v 0.132176 4.92161 1.8228 +vn 0.159809 0.983777 -0.0815068 +v 0.066802 4.92983 1.82919 +vn 0.0744943 0.99353 -0.0857241 +v 0 4.93078 1.78858 +vn -4.47177e-06 0.999997 -0.00248341 +v 0 4.93382 1.84494 +vn -2.99169e-06 0.993072 -0.11751 +v 0.194511 4.90806 1.81632 +vn 0.25178 0.964172 -0.08354 +v 0.369395 4.84549 1.55184 +vn 0.500099 0.845936 0.185184 +v 0.43898 4.81054 1.5255 +vn 0.486171 0.846504 0.216952 +v 0.376198 4.85235 1.50655 +vn 0.489133 0.845181 0.215447 +v 0.451985 4.81246 1.49136 +vn 0.475793 0.845761 0.241472 +v 0.442221 4.8253 1.46679 +vn 0.475962 0.843266 0.249726 +v 0.512298 4.77856 1.49386 +vn 0.458566 0.853519 0.247432 +v 0.515383 4.78716 1.45981 +vn 0.453283 0.851983 0.26203 +v 0.303697 4.88476 1.54731 +vn 0.469944 0.86425 0.17951 +v 0.300262 4.8956 1.50675 +vn 0.461353 0.864267 0.200489 +v 0.239228 4.91749 1.54749 +vn 0.399172 0.897433 0.187817 +v 0.368202 4.86584 1.47311 +vn 0.478691 0.848008 0.227457 +v 0.296672 4.90533 1.47419 +vn 0.453528 0.865652 0.212034 +v 0.233984 4.92899 1.50598 +vn 0.394846 0.895352 0.206014 +v 0.307055 4.87408 1.59362 +vn 0.47679 0.866599 0.147231 +v 0.370251 4.8361 1.59664 +vn 0.510062 0.847257 0.148296 +v 0.244678 4.90581 1.59485 +vn 0.402217 0.90161 0.159124 +v 0.435161 4.80272 1.56737 +vn 0.495889 0.848462 0.184949 +v 0.507148 4.77022 1.53385 +vn 0.471302 0.852283 0.226912 +v 0.810237 4.59407 1.22714 +vn 0.998602 0.00565165 0.0525559 +v 0.800461 4.53441 1.23892 +vn 0.969886 -0.205622 0.130539 +v 0.803724 4.53756 1.21403 +vn 0.98348 -0.166113 0.0719331 +v 0.810244 4.60078 1.20104 +vn 0.998138 0.0508473 -0.0336911 +v 0.804789 4.53871 1.19539 +vn 0.990402 -0.134295 0.0326967 +v 0.776596 4.46829 1.2713 +vn 0.932371 -0.224723 0.283169 +v 0.783108 4.46727 1.24718 +vn 0.949884 -0.198697 0.24133 +v 0.788153 4.46876 1.22711 +vn 0.962057 -0.172329 0.211541 +v 0.801494 4.64799 1.23143 +vn 0.935452 0.345249 0.0757139 +v 0.79887 4.65611 1.20569 +vn 0.921335 0.388446 -0.0158553 +v 0.770922 4.69552 1.24354 +vn 0.753408 0.645337 0.126164 +v 0.808642 4.60439 1.18202 +vn 0.99333 0.078269 -0.0846757 +v 0.795551 4.66128 1.18741 +vn 0.914228 0.401838 -0.0520839 +v 0.767202 4.70271 1.22236 +vn 0.742075 0.665345 0.08149 +v 0.801839 4.63049 1.2692 +vn 0.953163 0.246588 0.175144 +v 0.806683 4.57896 1.25554 +vn 0.988134 -0.0806686 0.130706 +v 0.773529 4.68487 1.27275 +vn 0.779149 0.594795 0.197855 +v 0.772377 4.67052 1.31176 +vn 0.800498 0.536904 0.26634 +v 0.793486 4.52931 1.27169 +vn 0.949704 -0.247758 0.191518 +v 0.765423 4.46706 1.30297 +vn 0.904822 -0.26167 0.335896 +v 0.683571 4.32632 1.41056 +vn 0.855923 -0.203588 0.475339 +v 0.648977 4.28974 1.45322 +vn 0.824233 -0.274252 0.495404 +v 0.65696 4.28542 1.43749 +vn 0.827478 -0.273266 0.490515 +v 0.695826 4.31668 1.38396 +vn 0.861563 -0.214497 0.460109 +v 0.663218 4.28095 1.42429 +vn 0.829295 -0.274986 0.486469 +v 0.668611 4.27663 1.41264 +vn 0.831032 -0.277704 0.48194 +v 0.610748 4.25769 1.49409 +vn 0.775215 -0.361145 0.518282 +v 0.567855 4.2289 1.53251 +vn 0.706892 -0.466157 0.531979 +v 0.57611 4.22283 1.51622 +vn 0.70866 -0.465998 0.529762 +v 0.625552 4.24747 1.46442 +vn 0.780201 -0.361376 0.510581 +v 0.582784 4.21716 1.50221 +vn 0.70987 -0.465486 0.52859 +v 0.588615 4.21182 1.48974 +vn 0.711107 -0.463924 0.5283 +v 0.738143 4.3989 1.33209 +vn 0.893377 -0.17049 0.415704 +v 0.71265 4.35958 1.36926 +vn 0.870936 -0.164571 0.46302 +v 0.718824 4.35721 1.35634 +vn 0.881369 -0.17701 0.438014 +v 0.7486 4.39486 1.30633 +vn 0.909883 -0.175939 0.375709 +v 0.758603 4.43309 1.29992 +vn 0.914915 -0.196222 0.352742 +v 0.72399 4.3542 1.3443 +vn 0.888432 -0.18315 0.420885 +v 0.728432 4.35116 1.33349 +vn 0.892785 -0.183921 0.411227 +v 0.755324 4.39033 1.2871 +vn 0.9194 -0.165915 0.356616 +v 0.767141 4.43041 1.27518 +vn 0.933015 -0.194521 0.302728 +v 0.719674 4.39736 1.36857 +vn 0.871615 -0.150972 0.466363 +v 0.663204 4.33102 1.44861 +vn 0.848955 -0.203782 0.487595 +v 0.692222 4.36249 1.40835 +vn 0.86516 -0.158075 0.475931 +v 0.744024 4.43294 1.33303 +vn 0.887167 -0.184575 0.422925 +v 0.639847 4.29381 1.47057 +vn 0.819191 -0.270636 0.50565 +v 0.519726 4.20378 1.56764 +vn 0.610282 -0.57707 0.542721 +v 0.558543 4.23496 1.55024 +vn 0.703638 -0.461852 0.539988 +v 0.629341 4.29673 1.4888 +vn 0.809057 -0.274931 0.519461 +v 0.590779 4.26942 1.53153 +vn 0.771719 -0.362642 0.522437 +v 0.548005 4.24026 1.56814 +vn 0.687205 -0.464703 0.558391 +v 0.280701 4.14322 1.66202 +vn 0.220068 -0.825412 0.519869 +v 0.21253 4.13624 1.67469 +vn 0.150596 -0.842365 0.517438 +v 0.216587 4.12677 1.6582 +vn 0.152864 -0.83988 0.520802 +v 0.290141 4.12591 1.63079 +vn 0.223649 -0.82087 0.525503 +v 0.21991 4.11823 1.64348 +vn 0.153989 -0.838195 0.523179 +v 0.222873 4.11038 1.6301 +vn 0.155359 -0.836827 0.524961 +v 0.142568 4.13201 1.684 +vn 0.0932884 -0.851288 0.516339 +v 0.079231 4.13273 1.69354 +vn 0.051369 -0.856159 0.514153 +v 0.063955 4.12139 1.67607 +vn 0.0336178 -0.854783 0.517896 +v 0.147725 4.11348 1.65281 +vn 0.0961243 -0.847609 0.521841 +v 0.08233 4.1134 1.6615 +vn 0.0547381 -0.852731 0.519475 +v 0.066011 4.10382 1.64726 +vn 0.0332403 -0.852758 0.521248 +v 0.408376 4.16617 1.6238 +vn 0.39536 -0.745813 0.536146 +v 0.346312 4.15309 1.64494 +vn 0.302903 -0.793659 0.527594 +v 0.352406 4.14437 1.6284 +vn 0.30336 -0.792716 0.528748 +v 0.466459 4.183 1.59795 +vn 0.502943 -0.674822 0.540059 +v 0.474072 4.17544 1.58145 +vn 0.503581 -0.674761 0.539541 +v 0.421072 4.15069 1.59274 +vn 0.399139 -0.743844 0.536083 +v 0.357464 4.13654 1.61373 +vn 0.304529 -0.791098 0.530496 +v 0.361946 4.12931 1.60047 +vn 0.305917 -0.789371 0.532266 +v 0.534354 4.19072 1.53699 +vn 0.614427 -0.575803 0.539379 +v 0.480314 4.16858 1.56699 +vn 0.504566 -0.673353 0.540378 +v 0.485815 4.16222 1.55401 +vn 0.505827 -0.671345 0.541696 +v 0.339478 4.16223 1.66276 +vn 0.303185 -0.796706 0.522817 +v 0.268081 4.16298 1.69897 +vn 0.212918 -0.831031 0.513862 +v 0.331181 4.17185 1.68232 +vn 0.297025 -0.803078 0.516567 +v 0.322057 4.18161 1.70277 +vn 0.289389 -0.805188 0.517617 +v 0.457943 4.19076 1.61569 +vn 0.501334 -0.671533 0.545626 +v 0.393398 4.18524 1.66111 +vn 0.401714 -0.748284 0.527918 +v 0.44834 4.198 1.6331 +vn 0.482975 -0.668851 0.565131 +v 0.20802 4.14621 1.69232 +vn 0.148368 -0.84469 0.514282 +v 0 4.13046 1.69333 +vn 6.43651e-07 -0.856235 0.516587 +v 0.06118 4.14206 1.71051 +vn 0.0329933 -0.85872 0.511382 +v 0.135681 4.15322 1.7205 +vn 0.0890075 -0.856707 0.508066 +v 0.202731 4.15689 1.71144 +vn 0.146005 -0.84742 0.510452 +v 0.196896 4.16789 1.73149 +vn 0.144283 -0.850963 0.505019 +v 0 4.15237 1.72997 +vn 1.10451e-18 -0.861097 0.508441 +v 0.075122 4.15463 1.73058 +vn 0.0473264 -0.861276 0.505928 +v 0.057548 4.1649 1.74939 +vn 0.0312377 -0.864297 0.502011 +v 0.665503 4.73289 1.38246 +vn 0.507351 0.813701 0.283699 +v 0.725619 4.71267 1.32494 +vn 0.608959 0.746666 0.267693 +v 0.662242 4.74414 1.35379 +vn 0.484897 0.83365 0.26439 +v 0.724056 4.72356 1.29455 +vn 0.586806 0.777575 0.225911 +v 0.66117 4.75224 1.32956 +vn 0.481557 0.838643 0.25452 +v 0.721348 4.73156 1.27169 +vn 0.577372 0.792088 0.198086 +v 0.593385 4.7619 1.41264 +vn 0.444096 0.854205 0.270393 +v 0.588 4.75311 1.44868 +vn 0.450826 0.849134 0.275187 +v 0.591354 4.7713 1.38625 +vn 0.445025 0.853659 0.27059 +v 0.516489 4.79516 1.43242 +vn 0.451796 0.850939 0.267923 +v 0.626614 4.74345 1.4165 +vn 0.462738 0.839194 0.285705 +v 0.659363 4.72253 1.42122 +vn 0.532563 0.786928 0.311642 +v 0.622215 4.73223 1.45585 +vn 0.483805 0.8219 0.300688 +v 0.583266 4.7427 1.4886 +vn 0.469663 0.83905 0.274613 +v 0.723808 4.69868 1.36369 +vn 0.638852 0.700826 0.31735 +v 0.116787 4.9562 1.55061 +vn 0.188715 0.955499 0.226733 +v 0.177168 4.94118 1.54866 +vn 0.298261 0.931576 0.207861 +v 0.171632 4.95303 1.50589 +vn 0.296963 0.927767 0.225969 +v 0.112319 4.96805 1.50688 +vn 0.188687 0.95078 0.245795 +v 0.166933 4.96324 1.47117 +vn 0.295875 0.925355 0.237014 +v 0.229439 4.93897 1.47232 +vn 0.390973 0.894456 0.216998 +v 0.057669 4.96444 1.55072 +vn 0.0877224 0.967121 0.23871 +v 0.055245 4.97613 1.5066 +vn 0.0876217 0.962193 0.257892 +v 0 4.96977 1.53944 +vn -1.02565e-05 0.968874 0.247553 +v 0.108603 4.97824 1.4714 +vn 0.188512 0.947779 0.257252 +v 0.053275 4.98615 1.47095 +vn 0.087478 0.959071 0.269313 +v 0 4.9811 1.49706 +vn -3.70319e-06 0.964345 0.264649 +v 0.06099 4.95229 1.6014 +vn 0.087786 0.973775 0.209893 +v 0.12223 4.94409 1.59982 +vn 0.19015 0.961668 0.197579 +v 0 4.95758 1.58966 +vn -6.20338e-06 0.975739 0.218935 +v 0.183016 4.92905 1.59744 +vn 0.298643 0.937284 0.179753 +v 0.269341 5.54723 0.211712 +vn 0.30069 0.924172 -0.235568 +v 0.322791 5.5386 0.256557 +vn 0.353528 0.914705 -0.195789 +v 0.341653 5.5247 0.227049 +vn 0.366809 0.907518 -0.204603 +v 0.290259 5.51776 0.130393 +vn 0.307122 0.911689 -0.272946 +v 0.349365 5.51076 0.182482 +vn 0.363319 0.901007 -0.237037 +v 0.367679 5.49203 0.142096 +vn 0.373249 0.889571 -0.263341 +v 0.373592 5.52562 0.29944 +vn 0.401874 0.902469 -0.155071 +v 0.399586 5.52238 0.363058 +vn 0.446531 0.889321 -0.0985795 +v 0.433075 5.50283 0.339027 +vn 0.459555 0.88332 -0.0924957 +v 0.461671 5.48333 0.30155 +vn 0.468811 0.875178 -0.1195 +v 0.526115 5.45026 0.336484 +vn 0.521136 0.85198 -0.0504734 +v 0.496121 5.45901 0.262628 +vn 0.47523 0.867077 -0.149443 +v 0.138319 5.56429 0.152553 +vn 0.170374 0.94147 -0.290873 +v 0.204214 5.55758 0.178797 +vn 0.241803 0.933044 -0.266382 +v 0.212241 5.54377 0.139213 +vn 0.241683 0.928773 -0.281018 +v 0 5.56832 0.124889 +vn 0 0.949864 -0.312664 +v 0.070214 5.56831 0.134951 +vn 0.089204 0.948203 -0.304882 +v 0.072573 5.55471 0.094557 +vn 0.0892056 0.943594 -0.318861 +v 0.149246 5.5353 0.069455 +vn 0.169983 0.931993 -0.320147 +v 0.22269 5.52802 0.097034 +vn 0.24069 0.924333 -0.296102 +v 0.225237 5.51293 0.054656 +vn 0.246812 0.91371 -0.322829 +v 0 5.53843 0.038103 +vn 2.48832e-18 0.94073 -0.339156 +v 0.074587 5.54007 0.052725 +vn 0.0890558 0.93801 -0.334973 +v 0.079021 5.52424 0.010986 +vn 0.0998599 0.931436 -0.349934 +v 0.195 5.57021 0.216167 +vn 0.240384 0.936916 -0.253778 +v 0.24035 5.5741 0.284074 +vn 0.303236 0.927604 -0.218172 +v 0.185337 5.58228 0.252128 +vn 0.241897 0.938318 -0.247071 +v 0.175264 5.59375 0.286256 +vn 0.243528 0.938263 -0.245675 +v 0.067402 5.58058 0.173511 +vn 0.0888534 0.951812 -0.293528 +v 0.126275 5.58851 0.227459 +vn 0.17138 0.946523 -0.273355 +v 0.064342 5.59227 0.210886 +vn 0.0899155 0.953386 -0.288044 +v 0.060958 5.60332 0.246791 +vn 0.090259 0.953862 -0.286357 +v 0.306082 5.552 0.29034 +vn 0.353864 0.91672 -0.185486 +v 0.439154 5.50514 0.418953 +vn 0.506317 0.861881 -0.028352 +v 0.387938 5.53227 0.402739 +vn 0.461131 0.883799 -0.0790982 +v 0.336252 5.55243 0.363543 +vn 0.406282 0.903205 -0.138406 +v 0.290036 5.56477 0.323446 +vn 0.356519 0.916968 -0.179062 +v 0.274088 5.57695 0.354419 +vn 0.360241 0.915741 -0.177887 +v 0.394872 5.53259 0.471144 +vn 0.51057 0.859496 -0.0241809 +v 0.358239 5.54929 0.421439 +vn 0.453914 0.886401 -0.0908569 +v 0.347999 5.55795 0.456353 +vn 0.470746 0.878785 -0.0783286 +v 0.133732 5.56075 0.978461 +vn 0.251951 0.61347 0.748448 +v 0.069503 5.55591 0.996513 +vn 0.117304 0.599594 0.79166 +v 0.138621 5.52399 1.0007 +vn 0.295864 0.444137 0.845699 +v 0.069862 5.51832 1.01936 +vn 0.132556 0.447888 0.884209 +v 0.126575 5.49054 1.01924 +vn 0.266392 0.334335 0.904022 +v 0 5.54486 1.00886 +vn 1.58848e-06 0.556933 0.830558 +v 0 5.50858 1.02864 +vn 7.01897e-06 0.426283 0.90459 +v 0.054431 5.48667 1.03462 +vn 0.0993271 0.331099 0.938354 +v 0.190264 5.53408 0.971798 +vn 0.453909 0.472924 0.755189 +v 0.190173 5.56524 0.947658 +vn 0.434968 0.623098 0.65004 +v 0.202623 5.50024 0.981337 +vn 0.494036 0.35533 0.793517 +v 0.126757 5.59705 0.943681 +vn 0.20685 0.772748 0.600061 +v 0.178122 5.59895 0.916359 +vn 0.359645 0.766583 0.531984 +v 0.119238 5.62876 0.89327 +vn 0.154403 0.892196 0.424436 +v 0.165877 5.62693 0.873318 +vn 0.278527 0.881238 0.381892 +v 0.066191 5.59413 0.960737 +vn 0.0931011 0.766574 0.635371 +v 0 5.5838 0.976623 +vn -3.20506e-06 0.723144 0.690697 +v 0.062655 5.62823 0.907303 +vn 0.0658311 0.89372 0.443769 +v 0 5.62 0.927271 +vn -2.62739e-06 0.868068 0.496445 +v 0.420117 5.48072 0.693147 +vn 0.676963 0.686033 0.266609 +v 0.397389 5.47544 0.756185 +vn 0.700816 0.630483 0.333688 +v 0.411032 5.46456 0.748402 +vn 0.682581 0.651294 0.33151 +v 0.453216 5.45688 0.672321 +vn 0.636783 0.726022 0.259614 +v 0.424996 5.45262 0.744086 +vn 0.653924 0.684337 0.322594 +v 0.44103 5.44018 0.739159 +vn 0.618462 0.719931 0.314969 +v 0.370297 5.4701 0.815372 +vn 0.699117 0.58457 0.411719 +v 0.339245 5.46498 0.869413 +vn 0.682131 0.552152 0.479402 +v 0.351154 5.45488 0.864455 +vn 0.667642 0.584915 0.460574 +v 0.365493 5.44777 0.85331 +vn 0.637711 0.633601 0.438035 +v 0.336628 5.43946 0.903795 +vn 0.58485 0.643416 0.493929 +v 0.376092 5.43332 0.860489 +vn 0.592675 0.692105 0.41198 +v 0.446611 5.4929 0.557956 +vn 0.604894 0.787171 0.120271 +v 0.436914 5.48669 0.626234 +vn 0.650208 0.734917 0.192685 +v 0.455434 5.47428 0.611509 +vn 0.638469 0.744341 0.195737 +v 0.446636 5.49978 0.489783 +vn 0.556599 0.829544 0.0453315 +v 0.470134 5.48536 0.466817 +vn 0.555275 0.830507 0.0439063 +v 0.491057 5.46472 0.522157 +vn 0.587874 0.799879 0.120816 +v 0.475498 5.46102 0.597826 +vn 0.617448 0.763077 0.190976 +v 0.496849 5.44696 0.585809 +vn 0.598644 0.778537 0.188429 +v 0.484629 5.47673 0.371838 +vn 0.509832 0.85951 -0.0362473 +v 0.495749 5.46928 0.445481 +vn 0.555157 0.830639 0.0428851 +v 0.525865 5.45067 0.413953 +vn 0.551509 0.833568 0.031652 +v 0.419276 5.49858 0.641339 +vn 0.653624 0.731755 0.193157 +v 0.388285 5.50499 0.71383 +vn 0.689308 0.679921 0.250124 +v 0.403349 5.50908 0.65495 +vn 0.641287 0.740958 0.19933 +v 0.37212 5.53983 0.633489 +vn 0.627839 0.768824 0.121358 +v 0.424698 5.5133 0.512712 +vn 0.559516 0.827577 0.0453645 +v 0.407164 5.51808 0.595468 +vn 0.612051 0.782218 0.116313 +v 0.403986 5.52616 0.534671 +vn 0.563657 0.824887 0.043037 +v 0.383844 5.53896 0.555134 +vn 0.567137 0.822618 0.0406823 +v 0.384 5.48605 0.76513 +vn 0.712933 0.613776 0.339124 +v 0.305428 5.4606 0.91615 +vn 0.626486 0.532883 0.568816 +v 0.328862 5.47526 0.873326 +vn 0.703559 0.502452 0.50254 +v 0.358102 5.52522 0.743486 +vn 0.704382 0.658688 0.26453 +v 0.371712 5.49589 0.773139 +vn 0.697547 0.627041 0.346767 +v 0.347013 5.49263 0.825432 +vn 0.726095 0.552191 0.409722 +v 0.321545 5.51253 0.844975 +vn 0.725235 0.53298 0.435852 +v 0.319948 5.48465 0.876743 +vn 0.68073 0.519171 0.516786 +v 0.117975 5.66681 0.749178 +vn 0.158198 0.979362 0.125791 +v 0.114731 5.67311 0.665388 +vn 0.156572 0.987616 0.00999668 +v 0.086133 5.67501 0.706193 +vn 0.0904109 0.993216 0.0731313 +v 0.060466 5.67207 0.750375 +vn 0.053195 0.989641 0.133346 +v 0.059343 5.67918 0.657484 +vn 0.0767472 0.996877 0.0186137 +v 0.026808 5.67821 0.703081 +vn 0.0356606 0.996219 0.0792181 +v 0.119257 5.67022 0.593228 +vn 0.185982 0.980051 -0.0700807 +v 0.062181 5.67693 0.56813 +vn 0.114953 0.990678 -0.0730916 +v 0.029582 5.68121 0.609856 +vn 0.0437616 0.998834 -0.0203811 +v 0.087935 5.66371 0.792456 +vn 0.0817779 0.978147 0.191156 +v 0.116863 5.65159 0.830018 +vn 0.14589 0.952348 0.26786 +v 0.064151 5.65497 0.83528 +vn 0.0558023 0.957234 0.283881 +v 0 5.67329 0.751202 +vn 3.05181e-06 0.990655 0.136393 +v 0.027717 5.66527 0.797623 +vn 0.0305579 0.978772 0.20266 +v 0 5.65208 0.850327 +vn 1.9635e-06 0.94875 0.316027 +v 0.16166 5.64638 0.814897 +vn 0.250924 0.941184 0.226297 +v 0.172459 5.65551 0.747358 +vn 0.273347 0.953815 0.124575 +v 0.160981 5.66367 0.680508 +vn 0.242033 0.96981 0.0298089 +v 0.168091 5.66071 0.618115 +vn 0.280093 0.95784 -0.0639576 +v 0.199216 5.65119 0.693816 +vn 0.372026 0.927237 0.0427469 +v 0.152398 5.64338 0.4606 +vn 0.262033 0.948341 -0.178854 +v 0.21593 5.63059 0.512345 +vn 0.367993 0.920686 -0.130073 +v 0.208815 5.62433 0.458006 +vn 0.343213 0.923746 -0.169994 +v 0.185424 5.62129 0.405634 +vn 0.305186 0.92753 -0.215755 +v 0.22423 5.61385 0.436095 +vn 0.366993 0.910978 -0.18824 +v 0.241095 5.60152 0.410642 +vn 0.37148 0.908837 -0.189786 +v 0.267652 5.60881 0.527097 +vn 0.446308 0.890034 -0.0930024 +v 0.258036 5.60567 0.47129 +vn 0.416254 0.897753 -0.144128 +v 0.286395 5.59711 0.511302 +vn 0.471803 0.8761 -0.0992485 +v 0.306919 5.58364 0.491703 +vn 0.475422 0.874413 -0.096829 +v 0.13276 5.63711 0.407591 +vn 0.226687 0.948402 -0.221692 +v 0.079862 5.65166 0.424509 +vn 0.150312 0.963516 -0.221458 +v 0.096122 5.63258 0.36172 +vn 0.164934 0.950058 -0.264926 +v 0.045699 5.64435 0.379883 +vn 0.0817274 0.96282 -0.257486 +v 0.142826 5.62774 0.380785 +vn 0.241558 0.937997 -0.248618 +v 0.153846 5.61653 0.350476 +vn 0.246926 0.935266 -0.253586 +v 0.112378 5.61084 0.296734 +vn 0.173936 0.946484 -0.271871 +v 0.053603 5.62426 0.313942 +vn 0.0891079 0.954294 -0.285278 +v 0.071374 5.66669 0.492311 +vn 0.145861 0.976399 -0.15928 +v 0.135279 5.65932 0.526159 +vn 0.238007 0.961612 -0.136582 +v 0 5.65476 0.411224 +vn -1.10715e-18 0.969892 -0.243534 +v 0.038467 5.66281 0.451385 +vn 0.0756596 0.974708 -0.210284 +v 0 5.67036 0.482993 +vn 3.48941e-06 0.985779 -0.168049 +v 0.033057 5.6756 0.525775 +vn 0.0621367 0.990596 -0.121896 +v 0.189228 5.64842 0.56586 +vn 0.339427 0.93413 -0.110408 +v 0.178001 5.4495 1.01504 +vn 0.372971 0.433161 0.820527 +v 0.099549 5.44545 1.04126 +vn 0.192499 0.411312 0.890936 +v 0.16249 5.42827 1.0337 +vn 0.272568 0.558564 0.783399 +v 0.081095 5.42561 1.05546 +vn 0.116347 0.563602 0.817812 +v 0 5.44372 1.05105 +vn -2.21699e-18 0.41437 0.910108 +v 0 5.41969 1.06532 +vn 0 0.577616 0.816308 +v 0.242457 5.45617 0.975396 +vn 0.501705 0.498025 0.707292 +v 0.244118 5.43278 0.992024 +vn 0.415625 0.58336 0.697816 +v 0.274598 5.45981 0.947363 +vn 0.566428 0.511446 0.646207 +v 0.271919 5.44803 0.958968 +vn 0.524129 0.545512 0.653992 +v 0.333481 5.40414 0.955344 +vn 0.486577 0.678602 0.550219 +v 0.289065 5.42089 0.973388 +vn 0.457047 0.651271 0.605767 +v 0.282286 5.40772 0.991512 +vn 0.439431 0.623766 0.646387 +v 0.222778 5.4742 0.978726 +vn 0.519081 0.378056 0.766569 +v 0.151473 5.46783 1.0185 +vn 0.331912 0.320971 0.887024 +v 0.286059 5.48154 0.920338 +vn 0.644004 0.458074 0.612721 +v 0.074783 5.46402 1.03897 +vn 0.136998 0.292066 0.946535 +v 0 5.46744 1.04327 +vn 4.43676e-06 0.293833 0.955857 +v 0.496926 4.39173 1.79046 +vn 0.822916 0.391523 0.411727 +v 0.460574 4.39478 1.85666 +vn 0.78274 0.431126 0.44883 +v 0.493073 4.37068 1.80854 +vn 0.8883 0.0115205 0.459118 +v 0.45818 4.37417 1.87184 +vn 0.857922 0.065168 0.50963 +v 0.417887 4.39614 1.92297 +vn 0.723665 0.444337 0.528085 +v 0.42475 4.37317 1.92358 +vn 0.804883 0.0592997 0.590463 +v 0.527658 4.37011 1.73729 +vn 0.904134 0.00462592 0.427223 +v 0.531269 4.391 1.7187 +vn 0.831985 0.394297 0.390296 +v 0.563301 4.37498 1.65933 +vn 0.90288 0.0896623 0.420439 +v 0.491832 4.41027 1.77292 +vn 0.641441 0.702353 0.308631 +v 0.524776 4.40842 1.70493 +vn 0.642996 0.709153 0.289236 +v 0.48229 4.42239 1.75113 +vn 0.37003 0.917154 0.148005 +v 0.56692 4.39551 1.63543 +vn 0.767906 0.526502 0.364851 +v 0.551552 4.40994 1.63687 +vn 0.53775 0.81542 0.214279 +v 0.513348 4.41906 1.69091 +vn 0.351512 0.92802 0.123362 +v 0.455824 4.41359 1.83706 +vn 0.600253 0.730128 0.32651 +v 0.415859 4.41685 1.89726 +vn 0.545412 0.756712 0.360433 +v 0.447217 4.4263 1.80956 +vn 0.350811 0.922874 0.158856 +v 0.408234 4.43012 1.86485 +vn 0.317197 0.932102 0.174851 +v 0.316063 4.39903 2.03221 +vn 0.59222 0.402133 0.698258 +v 0.26259 4.39735 2.07501 +vn 0.530537 0.359032 0.767872 +v 0.283473 4.37381 2.06213 +vn 0.588306 -0.159294 0.792793 +v 0.337367 4.3763 2.01836 +vn 0.66604 -0.0638241 0.743181 +v 0.207306 4.39477 2.11133 +vn 0.457616 0.321248 0.829088 +v 0.226598 4.37075 2.10001 +vn 0.50548 -0.244808 0.827381 +v 0.366348 4.39955 1.98336 +vn 0.649495 0.445299 0.616332 +v 0.385718 4.37774 1.97029 +vn 0.735456 0.0403279 0.676372 +v 0.322574 4.42021 2.00267 +vn 0.424261 0.785067 0.451301 +v 0.371118 4.41917 1.95288 +vn 0.485523 0.77618 0.402259 +v 0.318362 4.43548 1.96254 +vn 0.243034 0.943343 0.225919 +v 0.365139 4.43328 1.91607 +vn 0.279941 0.939284 0.19844 +v 0.271345 4.41987 2.04624 +vn 0.370161 0.783833 0.498585 +v 0.218042 4.4185 2.08357 +vn 0.311654 0.782318 0.539306 +v 0.268675 4.43664 2.00369 +vn 0.205555 0.945043 0.254246 +v 0.216883 4.43674 2.03902 +vn 0.165637 0.945791 0.279364 +v 0.095615 4.38847 2.16125 +vn 0.26055 0.260983 0.929517 +v 0.040728 4.38635 2.17404 +vn 0.151524 0.238994 0.959126 +v 0.054654 4.36163 2.16779 +vn 0.177198 -0.421018 0.889576 +v 0.111778 4.36351 2.15311 +vn 0.300597 -0.38465 0.872746 +v 0 4.3858 2.17778 +vn -2.71398e-06 0.233635 0.972324 +v 0 4.36661 2.17596 +vn 6.31338e-07 -0.35652 0.934288 +v 0 4.34226 2.15729 +vn -2.26331e-18 -0.73571 0.677297 +v 0.151529 4.39157 2.14032 +vn 0.36664 0.288211 0.884596 +v 0.169152 4.36709 2.13057 +vn 0.411107 -0.321868 0.852873 +v 0.108696 4.41384 2.13689 +vn 0.174164 0.780201 0.600794 +v 0.163653 4.41632 2.11403 +vn 0.245635 0.781432 0.573609 +v 0.109746 4.43452 2.08997 +vn 0.0830353 0.945532 0.314762 +v 0.163709 4.43591 2.06794 +vn 0.123462 0.946108 0.299393 +v 0.053467 4.4111 2.15277 +vn 0.105467 0.773364 0.625128 +v 0 4.40466 2.16541 +vn -3.1068e-06 0.716572 0.697514 +v 0.055087 4.43269 2.106 +vn 0.0446737 0.943999 0.326911 +v 0 4.42722 2.12575 +vn -2.22976e-18 0.923719 0.38307 +v 0.628627 4.41191 1.49145 +vn 0.331088 0.898099 0.289479 +v 0.642606 4.4052 1.48958 +vn 0.633886 0.611769 0.473209 +v 0.65248 4.42045 1.44746 +vn 0.113631 0.938914 0.324851 +v 0.674893 4.42471 1.42769 +vn 0.421481 0.696175 0.581114 +v 0.677518 4.4326 1.41483 +vn 0.719192 -0.0192428 0.694545 +v 0.654555 4.39607 1.47867 +vn 0.831805 0.166647 0.529462 +v 0.707279 4.44376 1.38965 +vn 0.788468 -0.298179 0.537966 +v 0.608824 4.41216 1.51119 +vn 0.152401 0.975271 0.160064 +v 0.630493 4.41737 1.4666 +vn -0.129199 0.989607 0.0631251 +v 0.611497 4.41345 1.48642 +vn -0.716267 0.503035 -0.48365 +v 0.649732 4.42271 1.43977 +vn 0.839965 0.0554282 0.539803 +v 0.629142 4.41639 1.46149 +vn -0.671476 -0.0989258 -0.734393 +v 0.60448 4.40236 1.55018 +vn 0.591441 0.721383 0.360282 +v 0.582767 4.40818 1.57144 +vn 0.404855 0.890556 0.207371 +v 0.590232 4.41181 1.52665 +vn -0.207454 0.972368 -0.107069 +v 0.566296 4.41252 1.5782 +vn 0.107112 0.994247 -0.000648761 +v 0.602201 4.38539 1.57527 +vn 0.857609 0.261102 0.443095 +v 0.584961 4.3639 1.61052 +vn 0.884903 -0.204737 0.418366 +v 0.13553 4.78495 2.07913 +vn -0.142009 -0.763048 0.630548 +v 0.200372 4.75891 2.06684 +vn -0.224306 -0.743069 0.630504 +v 0.208163 4.7869 2.10093 +vn -0.17853 -0.693337 0.698148 +v 0.140846 4.81329 2.11329 +vn -0.115087 -0.715942 0.688609 +v 0.262352 4.72027 2.04849 +vn -0.30042 -0.71792 0.627964 +v 0.272426 4.74727 2.08204 +vn -0.230169 -0.66836 0.707331 +v 0.068647 4.80074 2.08755 +vn -0.0660743 -0.77422 0.629458 +v 0.071348 4.82886 2.12122 +vn -0.0521308 -0.728887 0.682646 +v 0 4.81301 2.09933 +vn 4.0277e-06 -0.77145 0.63629 +v 0 4.83995 2.13054 +vn -1.08193e-07 -0.714751 0.699379 +v 0.066076 4.76661 2.04369 +vn -0.0698589 -0.785473 0.614941 +v 0.130306 4.75106 2.03501 +vn -0.148606 -0.775792 0.61324 +v 0.066349 4.72599 1.99192 +vn -0.0743957 -0.777874 0.624001 +v 0 4.78063 2.05811 +vn 1.67458e-06 -0.787909 0.615791 +v 0 4.73492 1.9994 +vn -3.3812e-06 -0.784356 0.620311 +v 0.192464 4.72593 2.02268 +vn -0.235266 -0.759645 0.606292 +v 0.124857 4.70925 1.98094 +vn -0.13977 -0.767403 0.625746 +v 0.184431 4.68584 1.96884 +vn -0.219053 -0.758635 0.613586 +v 0.252018 4.68921 2.00492 +vn -0.321816 -0.738 0.593119 +v 0.5549 4.43985 1.75677 +vn 0.282543 -0.875282 0.392492 +v 0.583066 4.42134 1.68059 +vn 0.372014 -0.881064 0.292117 +v 0.606195 4.43621 1.68911 +vn 0.490005 -0.814185 0.311444 +v 0.57527 4.45565 1.7721 +vn 0.410868 -0.810527 0.417413 +v 0.618175 4.41892 1.60862 +vn 0.47334 -0.858685 0.19649 +v 0.643925 4.43601 1.61089 +vn 0.577664 -0.786743 0.217577 +v 0.516585 4.46639 1.82895 +vn 0.125239 -0.864895 0.486078 +v 0.535194 4.48294 1.84912 +vn 0.274524 -0.795827 0.539718 +v 0.473372 4.50481 1.89307 +vn -0.0617569 -0.821139 0.567378 +v 0.5526 4.50122 1.86193 +vn 0.479912 -0.639034 0.601099 +v 0.490818 4.52299 1.91709 +vn 0.109832 -0.756713 0.644455 +v 0.496627 4.45167 1.80299 +vn 0.000463335 -0.899167 0.437605 +v 0.533198 4.42685 1.73803 +vn 0.153464 -0.920928 0.358245 +v 0.477126 4.43882 1.77179 +vn -0.0913849 -0.916646 0.389112 +v 0.455054 4.48753 1.86115 +vn -0.172726 -0.846583 0.503451 +v 0.43717 4.47086 1.82262 +vn -0.235115 -0.85985 0.453188 +v 0.559506 4.41013 1.67019 +vn 0.244396 -0.933363 0.262876 +v 0.592532 4.40681 1.60832 +vn 0.352144 -0.920536 0.169138 +v 0.512036 4.41675 1.71565 +vn 0.0391478 -0.948452 0.314495 +v 0.536979 4.40278 1.65796 +vn 0.115297 -0.969383 0.216804 +v 0.567884 4.39927 1.60784 +vn 0.20523 -0.97116 0.121362 +v 0.375428 4.61235 1.9896 +vn -0.319016 -0.714973 0.622127 +v 0.426295 4.55509 1.94662 +vn -0.224077 -0.760043 0.61002 +v 0.442093 4.57551 1.97426 +vn -0.0650518 -0.708224 0.702985 +v 0.389469 4.63526 2.02 +vn -0.189345 -0.668222 0.719464 +v 0.320776 4.66972 2.02313 +vn -0.34074 -0.702518 0.624792 +v 0.332924 4.69494 2.05548 +vn -0.242181 -0.655148 0.715632 +v 0.308185 4.6416 1.98091 +vn -0.378037 -0.723861 0.57716 +v 0.360756 4.58787 1.94967 +vn -0.378247 -0.735597 0.561983 +v 0.295603 4.60917 1.92982 +vn -0.370625 -0.737857 0.564096 +v 0.241591 4.6523 1.95205 +vn -0.306414 -0.745329 0.59211 +v 0.409713 4.53441 1.91008 +vn -0.310505 -0.780524 0.542558 +v 0.346251 4.56078 1.90139 +vn -0.386841 -0.752023 0.53368 +v 0.393463 4.51281 1.8659 +vn -0.343048 -0.795328 0.499772 +v 0.662071 4.42632 1.47532 +vn 0.482476 -0.875092 0.037832 +v 0.632719 4.41284 1.49243 +vn 0.33185 -0.943062 -0.0225812 +v 0.644074 4.41888 1.45574 +vn 0.24494 -0.9626 -0.115779 +v 0.673319 4.43171 1.43236 +vn 0.451254 -0.891726 0.0345568 +v 0.605727 4.4048 1.51155 +vn 0.057674 -0.987965 -0.143526 +v 0.618792 4.41117 1.4796 +vn -0.266186 -0.886977 -0.377381 +v 0.692341 4.44498 1.46028 +vn 0.603312 -0.792533 0.088915 +v 0.705252 4.44968 1.40997 +vn 0.612188 -0.770671 0.176897 +v 0.671242 4.43846 1.52931 +vn 0.606665 -0.782203 0.141831 +v 0.643514 4.42086 1.5367 +vn 0.499843 -0.859008 0.110737 +v 0.668087 4.45481 1.60449 +vn 0.692956 -0.68087 0.237124 +v 0.615671 4.4079 1.54553 +vn 0.371092 -0.925805 0.0719452 +v 0.589346 4.40013 1.55583 +vn 0.185826 -0.982581 0.00195936 +v 0.559504 4.40375 1.55995 +vn -0.792674 -0.197226 -0.576863 +v 0.544215 4.39925 1.5828 +vn -0.568977 -0.684006 -0.45651 +v 0.537777 4.40797 1.59042 +vn -0.592938 0.55888 -0.579722 +v 0.52463 4.40329 1.60058 +vn -0.708323 -0.139675 -0.691932 +v 0.513855 4.41187 1.61979 +vn -0.317307 0.850111 -0.420271 +v 0.526076 4.39725 1.60956 +vn -0.212519 -0.955906 -0.202682 +v 0.509725 4.40056 1.61535 +vn -0.542222 -0.633464 -0.552013 +v 0.507246 4.4066 1.61725 +vn -0.554436 0.430373 -0.712306 +v 0.574219 4.40865 1.5418 +vn -0.692118 0.529369 -0.490654 +v 0.551418 4.41192 1.58364 +vn -0.275754 0.922091 -0.271491 +v 0.524817 4.41627 1.62543 +vn -0.0995254 0.975772 -0.19484 +v 0.537726 4.41648 1.63209 +vn 0.211579 0.977122 0.0215974 +v 0.581616 4.40213 1.53358 +vn -0.475253 -0.787685 -0.39203 +v 0.59615 4.40809 1.50704 +vn -0.781983 -0.245311 -0.572996 +v 0.565561 4.3976 1.56794 +vn -0.121503 -0.97891 -0.164231 +v 0.545416 4.39637 1.60773 +vn 0.0315284 -0.999171 0.0257712 +v 0.478982 4.40547 1.6664 +vn -0.128167 -0.979565 0.155002 +v 0.468376 4.40638 1.65505 +vn -0.365345 -0.919662 -0.144034 +v 0.490254 4.40178 1.63559 +vn -0.346792 -0.910787 -0.22406 +v 0.505175 4.3989 1.63351 +vn -0.131726 -0.991271 -0.00552493 +v 0.459166 4.41092 1.65873 +vn -0.744278 0.00625365 -0.667841 +v 0.48057 4.40593 1.63892 +vn -0.681005 -0.166232 -0.713161 +v 0.496384 4.40454 1.62507 +vn -0.688556 -0.073817 -0.721417 +v 0.517188 4.3993 1.64516 +vn -0.00348708 -0.989606 0.143764 +v 0.492908 4.40981 1.69144 +vn -0.0515281 -0.964826 0.257788 +v 0.445532 4.42017 1.70688 +vn -0.159034 -0.946308 0.281443 +v 0.459446 4.42816 1.73802 +vn -0.14263 -0.928773 0.342107 +v 0.40774 4.44152 1.74265 +vn -0.201441 -0.894227 0.399725 +v 0.420975 4.45512 1.78073 +vn -0.245982 -0.874063 0.418936 +v 0.442603 4.41444 1.68123 +vn -0.249287 -0.965465 0.0757213 +v 0.401957 4.43017 1.71325 +vn -0.00281047 -0.878476 0.477778 +v 0.428747 4.41887 1.68582 +vn -0.896859 -0.00182086 -0.442312 +v 0.463783 4.42304 1.69432 +vn -0.0378484 0.985955 -0.162665 +v 0.472174 4.42601 1.72339 +vn 0.113958 0.993233 -0.0224149 +v 0.501792 4.42154 1.67301 +vn 0.0574147 0.996247 -0.0647691 +v 0.492088 4.41801 1.65474 +vn -0.14271 0.959902 -0.241293 +v 0.458796 4.41697 1.67085 +vn -0.154557 0.929874 -0.333837 +v 0.486653 4.41112 1.63937 +vn -0.369619 0.787425 -0.493298 +v 0.42753 4.42323 1.70258 +vn 0.0238874 0.979173 -0.201618 +v 0.431127 4.42835 1.73451 +vn 0.0490592 0.992964 -0.107778 +v 0.392182 4.43121 1.734 +vn 0.179528 0.980683 -0.0776599 +v 0.398761 4.42763 1.71063 +vn 0.547534 0.333201 0.767583 +v 0.438287 4.43057 1.77322 +vn 0.143652 0.989623 0.0030825 +v 0.394248 4.43441 1.77377 +vn 0.122375 0.991178 -0.0509008 +v 0.40036 4.43523 1.82104 +vn 0.160164 0.986613 0.0307072 +v 0.321317 4.50212 1.80077 +vn -0.223652 -0.769331 0.598422 +v 0.3143 4.47649 1.76893 +vn 0.0782513 -0.586714 0.806005 +v 0.366241 4.46971 1.77411 +vn -0.228608 -0.829067 0.51028 +v 0.358744 4.45235 1.74451 +vn 0.0445721 -0.728365 0.683738 +v 0.320685 4.45615 1.75892 +vn 0.497251 0.375952 0.781922 +v 0.363751 4.4397 1.73394 +vn 0.539463 0.370535 0.756097 +v 0.378632 4.49059 1.81772 +vn -0.320763 -0.813783 0.484632 +v 0.332776 4.53131 1.84859 +vn -0.34232 -0.769295 0.539446 +v 0.273216 4.53511 1.82299 +vn -0.18879 -0.721458 0.666226 +v 0.283632 4.57257 1.87376 +vn -0.314845 -0.745989 0.586833 +v 0.22236 4.56484 1.84096 +vn -0.136147 -0.686496 0.714274 +v 0.231422 4.60955 1.89379 +vn -0.250754 -0.738834 0.625497 +v 0.266895 4.50109 1.78962 +vn 0.0946409 -0.4826 0.870713 +v 0.274216 4.47329 1.7811 +vn 0.446541 0.385443 0.807487 +v 0.216983 4.52338 1.80671 +vn 0.100734 -0.408639 0.90712 +v 0.225212 4.48909 1.80005 +vn 0.379874 0.397783 0.835143 +v 0.114047 4.60483 1.86494 +vn -0.0484927 -0.642016 0.765156 +v 0.119142 4.659 1.92033 +vn -0.110251 -0.735047 0.668992 +v 0.055383 4.61884 1.8736 +vn -0.0393229 -0.634992 0.771517 +v 0.060381 4.67672 1.93241 +vn -0.068242 -0.741499 0.667475 +v 0.029253 4.64954 1.90098 +vn -0.0338278 -0.710891 0.702488 +v 0.031066 4.70502 1.96307 +vn -0.0316112 -0.768221 0.639404 +v 0.056334 4.56195 1.8362 +vn 0.0410702 -0.297035 0.953983 +v 0.111783 4.55348 1.82981 +vn 0.0733625 -0.319434 0.944764 +v 0.068287 4.51641 1.83456 +vn 0.118288 0.441583 0.889389 +v 0 4.62882 1.88068 +vn -5.54197e-19 -0.649507 0.760356 +v 0 4.57743 1.84369 +vn -4.54995e-18 -0.382625 0.923904 +v 0 4.5189 1.83847 +vn -1.64988e-06 0.438652 0.898657 +v 0.169175 4.58827 1.85488 +vn -0.0829827 -0.661597 0.745254 +v 0.165139 4.54104 1.82012 +vn 0.0949156 -0.356002 0.929652 +v 0.122289 4.51085 1.82696 +vn 0.211268 0.430252 0.877638 +v 0.174406 4.5018 1.81541 +vn 0.299788 0.414105 0.859444 +v 0.176438 4.63852 1.90913 +vn -0.17296 -0.737525 0.652796 +v 0.106844 4.46504 1.93934 +vn 0.0768708 0.972442 0.220106 +v 0.10805 4.48413 1.86911 +vn 0.142878 0.895819 0.420825 +v 0.054139 4.48608 1.87866 +vn 0.0748493 0.896601 0.436469 +v 0.051612 4.46444 1.95518 +vn 0.0305651 0.974374 0.222849 +v 0 4.48047 1.89744 +vn 4.45737e-18 0.925811 0.377986 +v 0.108341 4.45029 2.01959 +vn 0.0559363 0.978854 0.196763 +v 0.057096 4.44893 2.03735 +vn 0.0286474 0.978105 0.206131 +v 0 4.46229 1.96863 +vn -5.31591e-06 0.977835 0.209376 +v 0.027064 4.45643 1.99945 +vn 0.00871355 0.982968 0.183571 +v 0 4.44731 2.0493 +vn -2.19619e-06 0.976294 0.21645 +v 0.161498 4.45027 1.99991 +vn 0.0877389 0.979175 0.183079 +v 0.159401 4.46312 1.92307 +vn 0.121364 0.972551 0.198533 +v 0.213639 4.44928 1.97431 +vn 0.119356 0.979725 0.160915 +v 0.160193 4.47957 1.85611 +vn 0.21385 0.895906 0.389384 +v 0.210792 4.45963 1.90169 +vn 0.160443 0.972826 0.166938 +v 0.211214 4.47258 1.83871 +vn 0.277469 0.89872 0.339578 +v 0.308384 4.44815 1.84499 +vn 0.192953 0.978672 0.0705051 +v 0.312771 4.44385 1.90663 +vn 0.16111 0.981993 0.098659 +v 0.358367 4.43978 1.86576 +vn 0.165874 0.984098 0.0635437 +v 0.353159 4.44121 1.81086 +vn 0.171952 0.98505 0.0104183 +v 0.307939 4.45235 1.7922 +vn 0.329115 0.928447 0.172247 +v 0.352118 4.44121 1.76416 +vn 0.286775 0.956529 0.053042 +v 0.260699 4.46323 1.81724 +vn 0.321143 0.90844 0.26759 +v 0.260675 4.45451 1.87547 +vn 0.18738 0.974454 0.123809 +v 0.264282 4.44711 1.94301 +vn 0.145294 0.980521 0.132166 +v 0.564869 5.36763 0.694815 +vn 0.560629 0.78741 0.256282 +v 0.592323 5.36252 0.646488 +vn 0.577404 0.786045 0.220767 +v 0.556198 5.38183 0.668473 +vn 0.55346 0.798443 0.237005 +v 0.545075 5.39801 0.63864 +vn 0.562812 0.796165 0.222178 +v 0.571621 5.39532 0.575661 +vn 0.573421 0.798802 0.181946 +v 0.533535 5.41434 0.608568 +vn 0.566843 0.797787 0.205487 +v 0.604152 5.38477 0.515142 +vn 0.583566 0.800007 0.139427 +v 0.6376 5.36705 0.456658 +vn 0.627703 0.775416 0.0686929 +v 0.591496 5.40219 0.456122 +vn 0.585156 0.806762 0.0820214 +v 0.463462 5.38875 0.824264 +vn 0.524168 0.78415 0.332201 +v 0.503904 5.37659 0.787771 +vn 0.526818 0.793782 0.303927 +v 0.495076 5.39167 0.762952 +vn 0.533676 0.793828 0.291596 +v 0.464913 5.34396 0.91659 +vn 0.492881 0.737883 0.461082 +v 0.487186 5.35067 0.875796 +vn 0.518786 0.766882 0.377828 +v 0.466084 5.36614 0.872312 +vn 0.506209 0.78051 0.366819 +v 0.42347 5.42322 0.808349 +vn 0.570796 0.741802 0.352025 +v 0.471069 5.40864 0.761229 +vn 0.543203 0.783387 0.302053 +v 0.465155 5.42734 0.723685 +vn 0.576414 0.762692 0.29334 +v 0.406451 5.37541 0.92654 +vn 0.479654 0.735398 0.478667 +v 0.439927 5.37781 0.883162 +vn 0.496516 0.776877 0.387213 +v 0.418243 5.39734 0.871617 +vn 0.508421 0.774075 0.377249 +v 0.540596 5.36689 0.746538 +vn 0.549231 0.786705 0.281851 +v 0.525862 5.36099 0.789848 +vn 0.542092 0.782213 0.307048 +v 0.56196 5.3349 0.790956 +vn 0.56431 0.765087 0.310154 +v 0.526648 5.32585 0.870503 +vn 0.541152 0.755652 0.368978 +v 0.587022 5.30011 0.828 +vn 0.589469 0.734402 0.336422 +v 0.503562 5.35864 0.833015 +vn 0.532108 0.778845 0.332057 +v 0.562828 5.29386 0.880755 +vn 0.577913 0.718185 0.387591 +v 0.536532 5.2961 0.912766 +vn 0.542889 0.70003 0.463928 +v 0.601721 5.33407 0.714789 +vn 0.582753 0.766799 0.269107 +v 0.642875 5.3224 0.652783 +vn 0.610945 0.757334 0.230635 +v 0.620183 5.30174 0.761804 +vn 0.608035 0.7345 0.301336 +v 0.853463 5.03517 0.74228 +vn 0.852624 0.463484 0.241277 +v 0.853262 4.99547 0.808695 +vn 0.852555 0.42644 0.302156 +v 0.887984 4.9594 0.746226 +vn 0.9019 0.370164 0.222608 +v 0.930354 4.88776 0.627187 +vn 0.95803 0.270374 0.0952735 +v 0.91131 4.94804 0.637108 +vn 0.940985 0.318063 0.115686 +v 0.910305 4.92755 0.69265 +vn 0.937853 0.311217 0.153543 +v 0.88529 4.93308 0.794545 +vn 0.895922 0.346719 0.277686 +v 0.89292 4.88417 0.823355 +vn 0.899617 0.308331 0.309226 +v 0.908389 4.89622 0.75636 +vn 0.929424 0.301471 0.212805 +v 0.885063 5.00758 0.661226 +vn 0.903153 0.398973 0.15854 +v 0.838224 5.08593 0.690476 +vn 0.831964 0.506733 0.225961 +v 0.856254 5.07667 0.637203 +vn 0.868218 0.464309 0.174971 +v 0.872273 5.05911 0.588015 +vn 0.897383 0.430143 0.0983945 +v 0.847765 5.10029 0.611266 +vn 0.856249 0.497092 0.140492 +v 0.903019 4.98391 0.597165 +vn 0.93277 0.348218 0.0931938 +v 0.916246 4.95735 0.533186 +vn 0.951002 0.306991 0.0367645 +v 0.89698 5.00924 0.553904 +vn 0.928615 0.365955 0.0612514 +v 0.882962 5.0464 0.524189 +vn 0.911996 0.408138 0.0410604 +v 0.888507 5.03463 0.458464 +vn 0.922273 0.385884 -0.0224732 +v 0.870617 5.07519 0.496249 +vn 0.899779 0.435683 0.0240466 +v 0.802022 5.10462 0.765127 +vn 0.777049 0.559227 0.288893 +v 0.812429 5.06526 0.809704 +vn 0.790256 0.525947 0.314444 +v 0.761038 5.11894 0.832998 +vn 0.724 0.591413 0.355041 +v 0.820592 5.13582 0.633468 +vn 0.810643 0.553426 0.191251 +v 0.744151 5.15733 0.801116 +vn 0.7156 0.612605 0.335606 +v 0.812609 5.03383 0.857107 +vn 0.794803 0.489734 0.358398 +v 0.772244 5.0845 0.865469 +vn 0.731187 0.5688 0.376607 +v 0.777013 5.05583 0.897518 +vn 0.737759 0.541545 0.403038 +v 0.425552 5.33199 0.968541 +vn 0.460489 0.686724 0.562459 +v 0.367337 5.3525 0.988985 +vn 0.438773 0.674158 0.594129 +v 0.474532 5.30234 0.963325 +vn 0.480562 0.663584 0.573338 +v 0.530383 5.27196 0.948881 +vn 0.528231 0.634144 0.564653 +v 0.505479 5.31057 0.925485 +vn 0.508078 0.708992 0.489067 +v 0.700546 5.09482 0.96724 +vn 0.646088 0.583991 0.491453 +v 0.714584 5.06461 0.983293 +vn 0.652643 0.554182 0.516661 +v 0.743609 5.06607 0.940064 +vn 0.696424 0.558927 0.450105 +v 0.73301 5.09531 0.918518 +vn 0.688038 0.585101 0.429257 +v 0.72491 5.04132 0.99438 +vn 0.661718 0.520382 0.539752 +v 0.679358 5.12844 0.953783 +vn 0.632126 0.604219 0.485114 +v 0.719425 5.12779 0.894836 +vn 0.68288 0.601397 0.414724 +v 0.664447 5.16315 0.928894 +vn 0.6328 0.618342 0.466066 +v 0.703115 5.16266 0.869963 +vn 0.679415 0.616389 0.398069 +v 0.666726 5.10607 0.994257 +vn 0.590258 0.588436 0.552575 +v 0.638435 5.15488 0.970552 +vn 0.581068 0.615679 0.532259 +v 0.681016 5.08152 1.00436 +vn 0.60015 0.562177 0.569014 +v 0.625694 5.23437 0.884532 +vn 0.63376 0.643659 0.429011 +v 0.644924 5.19863 0.907814 +vn 0.631037 0.626349 0.457689 +v 0.683872 5.19904 0.845182 +vn 0.674734 0.633369 0.378918 +v 0.662769 5.23529 0.819997 +vn 0.663699 0.659397 0.353127 +v 0.607377 5.26786 0.858089 +vn 0.622652 0.685315 0.377688 +v 0.6409 5.26976 0.793405 +vn 0.64043 0.695258 0.32629 +v 0.572838 5.26764 0.909628 +vn 0.589409 0.653339 0.475127 +v 0.587917 5.232 0.935306 +vn 0.580917 0.619355 0.528143 +v 0.611995 5.18936 0.95872 +vn 0.572122 0.620886 0.535889 +v 0.943642 4.54694 0.967621 +vn 0.8877 0.16301 0.4306 +v 0.962641 4.52966 0.930719 +vn 0.921568 0.148055 0.358876 +v 0.953623 4.58582 0.926545 +vn 0.913435 0.200395 0.35423 +v 0.981995 4.5153 0.880308 +vn 0.950673 0.140399 0.276604 +v 0.998684 4.497 0.822161 +vn 0.973326 0.11604 0.197916 +v 0.990519 4.55952 0.815118 +vn 0.965007 0.17574 0.194619 +v 0.940189 4.42572 1.00598 +vn 0.880904 0.0708566 0.46796 +v 0.945954 4.36303 0.998489 +vn 0.90499 -0.0194137 0.424989 +v 0.960364 4.41674 0.965155 +vn 0.918177 0.0361356 0.39452 +v 0.981995 4.41271 0.908634 +vn 0.950154 0.011239 0.311578 +v 0.995059 4.36419 0.860532 +vn 0.966209 -0.0488059 0.253097 +v 1.00111 4.43223 0.835935 +vn 0.975866 0.0409141 0.214503 +v 0.959551 4.63316 0.875819 +vn 0.93142 0.238864 0.27459 +v 0.939362 4.64123 0.927884 +vn 0.898787 0.244739 0.36371 +v 0.888658 4.78049 0.934612 +vn 0.85412 0.347778 0.386692 +v 0.90431 4.72935 0.944095 +vn 0.863097 0.314291 0.395329 +v 0.917268 4.74782 0.896529 +vn 0.887909 0.321875 0.328656 +v 0.993796 4.603 0.741958 +vn 0.969365 0.206854 0.132447 +v 0.977616 4.6222 0.813197 +vn 0.954219 0.2269 0.194892 +v 0.95965 4.68576 0.819076 +vn 0.940207 0.269451 0.208345 +v 0.955157 4.74288 0.751859 +vn 0.946494 0.282101 0.156744 +v 0.936207 4.74895 0.835748 +vn 0.920133 0.305722 0.244724 +v 0.928754 4.60013 0.974471 +vn 0.870688 0.209152 0.44515 +v 0.905921 4.68028 0.975755 +vn 0.855024 0.273354 0.440695 +v 0.901861 4.63987 1.00538 +vn 0.841401 0.226995 0.490426 +v 0.896389 4.5952 1.03119 +vn 0.816982 0.186908 0.545533 +v 0.870404 4.67571 1.03955 +vn 0.81716 0.239559 0.524271 +v 0.859786 4.75959 1.00854 +vn 0.826343 0.322631 0.461592 +v 0.826001 4.74168 1.07582 +vn 0.803257 0.288403 0.521155 +v 0.92395 4.54799 1.00339 +vn 0.848505 0.161895 0.503815 +v 0.921967 4.38354 1.04293 +vn 0.860748 0.0437749 0.507145 +v 0.91814 4.44948 1.03904 +vn 0.842302 0.110815 0.527492 +v 0.883227 4.55839 1.06039 +vn 0.787246 0.163648 0.594527 +v 0.889213 4.41747 1.08738 +vn 0.805153 0.111687 0.582456 +v 0.89808 4.46172 1.06624 +vn 0.803376 0.135264 0.579906 +v 0.881486 4.46916 1.08577 +vn 0.773878 0.15267 0.614658 +v 0.813203 4.2062 1.19402 +vn 0.804643 -0.185539 0.564025 +v 0.770392 4.17714 1.24274 +vn 0.779645 -0.231089 0.582023 +v 0.769347 4.14424 1.22835 +vn 0.764204 -0.312865 0.564011 +v 0.833645 4.15285 1.13867 +vn 0.812123 -0.288727 0.507044 +v 0.787192 4.12962 1.19491 +vn 0.77507 -0.322924 0.543126 +v 0.786905 4.08756 1.16741 +vn 0.758175 -0.380032 0.529855 +v 0.724308 4.13721 1.28171 +vn 0.724855 -0.333933 0.602556 +v 0.670101 4.10902 1.32631 +vn 0.671604 -0.40954 0.617434 +v 0.670278 4.07912 1.30492 +vn 0.647718 -0.45169 0.613545 +v 0.730196 4.08233 1.23922 +vn 0.707801 -0.405987 0.578094 +v 0.673476 4.05397 1.28244 +vn 0.636896 -0.473015 0.608786 +v 0.675325 4.02601 1.25831 +vn 0.62816 -0.48615 0.607513 +v 0.883873 4.28589 1.10389 +vn 0.849007 -0.0733524 0.523264 +v 0.84951 4.25717 1.15384 +vn 0.8296 -0.0844111 0.551941 +v 0.855973 4.22182 1.13498 +vn 0.836472 -0.178776 0.518029 +v 0.907174 4.33671 1.07028 +vn 0.857109 -0.00948188 0.515047 +v 0.923037 4.31595 1.04024 +vn 0.884273 -0.0675045 0.462065 +v 0.90791 4.24072 1.04954 +vn 0.876391 -0.171249 0.450124 +v 0.874665 4.20754 1.09757 +vn 0.852194 -0.207569 0.480292 +v 0.8799 4.16478 1.06497 +vn 0.851029 -0.285479 0.440739 +v 0.91852 4.20198 1.00774 +vn 0.890335 -0.244526 0.384071 +v 0.952069 4.24637 0.949694 +vn 0.924686 -0.19797 0.325213 +v 0.939941 4.28465 0.998267 +vn 0.909755 -0.129861 0.394312 +v 0.834039 4.26617 1.17719 +vn 0.807468 -0.0589755 0.586957 +v 0.784808 4.23889 1.24021 +vn 0.793021 -0.0885797 0.60272 +v 0.818734 4.28013 1.19848 +vn 0.798793 -0.0144441 0.601432 +v 0.80403 4.29246 1.21747 +vn 0.788043 0.0288232 0.614946 +v 0.888572 4.35501 1.09828 +vn 0.826379 0.0440669 0.561387 +v 0.849643 4.32532 1.15525 +vn 0.805027 0.0433279 0.591654 +v 0.867937 4.37817 1.1238 +vn 0.793081 0.108225 0.599424 +v 0.852254 4.3805 1.14317 +vn 0.771173 0.123982 0.624437 +v 0.756842 4.18637 1.2637 +vn 0.765672 -0.214155 0.606534 +v 0.61251 4.07617 1.35957 +vn 0.58326 -0.503854 0.637133 +v 0.657506 4.11824 1.34586 +vn 0.660397 -0.413633 0.626724 +v 0.700117 4.16443 1.32409 +vn 0.729587 -0.285445 0.621469 +v 0.745185 4.20034 1.28271 +vn 0.767487 -0.17925 0.615494 +v 0.734019 4.21279 1.2999 +vn 0.768502 -0.149386 0.622164 +v 0.593071 4.10337 1.39883 +vn 0.584992 -0.499852 0.638695 +v 0.649253 4.13204 1.3634 +vn 0.668752 -0.394582 0.63014 +v 0.641532 4.14443 1.37936 +vn 0.674737 -0.383363 0.630684 +v 0.320465 3.99574 1.45773 +vn 0.228712 -0.682242 0.694433 +v 0.243492 3.98869 1.47196 +vn 0.164515 -0.697752 0.697192 +v 0.239805 3.97127 1.45599 +vn 0.16048 -0.676956 0.718315 +v 0.269159 3.95359 1.43271 +vn 0.184669 -0.658064 0.729965 +v 0.192755 3.94219 1.43865 +vn 0.131189 -0.659132 0.740496 +v 0.247215 3.92182 1.40987 +vn 0.167993 -0.640059 0.749736 +v 0.161524 3.97966 1.47864 +vn 0.10272 -0.699678 0.707035 +v 0.081419 3.97941 1.48653 +vn 0.050417 -0.709675 0.702722 +v 0.074002 3.95998 1.46817 +vn 0.0427447 -0.68325 0.728932 +v 0.112153 3.9372 1.44472 +vn 0.0670812 -0.660658 0.747684 +v 0.062158 3.93632 1.44706 +vn 0.0304132 -0.662717 0.748252 +v 0.073504 3.91003 1.42401 +vn 0.044958 -0.638258 0.768509 +v 0.477116 4.02775 1.41796 +vn 0.398032 -0.625749 0.670827 +v 0.406953 4.01757 1.4448 +vn 0.322214 -0.662823 0.675902 +v 0.395534 3.99344 1.42682 +vn 0.299975 -0.651485 0.696837 +v 0.548315 4.05536 1.39534 +vn 0.499099 -0.57141 0.651453 +v 0.54529 4.02834 1.37382 +vn 0.479984 -0.575745 0.661916 +v 0.477186 3.93225 1.33338 +vn 0.391677 -0.581803 0.712807 +v 0.405249 3.94496 1.37874 +vn 0.312697 -0.621193 0.718568 +v 0.401345 3.91463 1.35504 +vn 0.307614 -0.593615 0.743636 +v 0.611253 4.02535 1.31909 +vn 0.558684 -0.525539 0.641624 +v 0.547601 4.00542 1.35225 +vn 0.476713 -0.575935 0.664111 +v 0.546512 3.97937 1.33046 +vn 0.464661 -0.574627 0.673716 +v 0.387353 4.02884 1.46521 +vn 0.295846 -0.687185 0.663515 +v 0.329255 4.0322 1.49249 +vn 0.242469 -0.708911 0.662309 +v 0.402313 4.04821 1.47844 +vn 0.32931 -0.68693 0.647829 +v 0.392038 4.05555 1.49128 +vn 0.31053 -0.697845 0.645433 +v 0.536511 4.0651 1.41293 +vn 0.483899 -0.587879 0.648259 +v 0.464562 4.05881 1.45543 +vn 0.39669 -0.645277 0.652882 +v 0.53108 4.07893 1.42953 +vn 0.490727 -0.58507 0.645663 +v 0.526266 4.09144 1.44471 +vn 0.494054 -0.588017 0.640427 +v 0.243687 4.00587 1.48969 +vn 0.163172 -0.71635 0.678394 +v 0.16234 4.01413 1.51483 +vn 0.102844 -0.737061 0.667956 +v 0.081456 4.01136 1.52071 +vn 0.0493196 -0.744798 0.665465 +v 0.081771 3.99626 1.50414 +vn 0.0489421 -0.729617 0.682103 +v 0.251617 4.02516 1.50869 +vn 0.177245 -0.728522 0.661694 +v 0.23104 4.03406 1.52396 +vn 0.149776 -0.745753 0.649169 +v 0 4.01126 1.52364 +vn 7.21624e-07 -0.744797 0.667291 +v 0.081193 4.02385 1.53502 +vn 0.049568 -0.755822 0.652898 +v 0.730831 4.838 1.1462 +vn 0.699819 0.429392 0.570855 +v 0.764551 4.82512 1.11232 +vn 0.743211 0.39769 0.538033 +v 0.751331 4.86312 1.10053 +vn 0.717313 0.429694 0.548475 +v 0.787275 4.85569 1.05575 +vn 0.764027 0.390898 0.513285 +v 0.82216 4.83758 1.0138 +vn 0.801308 0.373188 0.467584 +v 0.794501 4.87043 1.03324 +vn 0.773707 0.391052 0.498454 +v 0.798969 4.80934 1.07327 +vn 0.778219 0.366294 0.510102 +v 0.828478 4.7856 1.04315 +vn 0.801828 0.34604 0.487163 +v 0.85801 4.81488 0.96781 +vn 0.828704 0.361242 0.427498 +v 0.874663 4.82602 0.922385 +vn 0.850502 0.366168 0.377581 +v 0.694451 4.88224 1.15341 +vn 0.659202 0.470487 0.586595 +v 0.713035 4.9085 1.11137 +vn 0.672318 0.455541 0.583498 +v 0.68097 4.85377 1.1908 +vn 0.645206 0.465505 0.605817 +v 0.714569 4.814 1.1835 +vn 0.695141 0.413355 0.588147 +v 0.665398 4.83609 1.22057 +vn 0.628367 0.463855 0.624494 +v 0.771994 4.78864 1.12702 +vn 0.760025 0.34802 0.548857 +v 0.122406 5.14497 1.27446 +vn 0.169724 0.544161 0.821634 +v 0.187695 5.15059 1.25219 +vn 0.261172 0.550704 0.792789 +v 0.131053 5.1902 1.24246 +vn 0.188031 0.561481 0.805843 +v 0.185542 5.19445 1.2225 +vn 0.27828 0.564112 0.777392 +v 0.065313 5.19111 1.25229 +vn 0.0838219 0.56576 0.820298 +v 0.060011 5.14731 1.28162 +vn 0.0724864 0.543973 0.835966 +v 0 5.18161 1.26179 +vn -4.42286e-18 0.558303 0.829637 +v 0 5.22778 1.22953 +vn 1.10644e-18 0.596145 0.802877 +v 0.105799 5.11045 1.29981 +vn 0.137366 0.544067 0.827721 +v 0.054917 5.10836 1.30689 +vn 0.0610793 0.546256 0.835388 +v 0 5.13845 1.28963 +vn 0 0.54085 0.841119 +v 0 5.10118 1.31347 +vn 4.41856e-18 0.555058 0.831811 +v 0.169876 5.0987 1.29334 +vn 0.213017 0.56609 0.796345 +v 0.36642 4.87787 1.43358 +vn 0.466349 0.842802 0.268707 +v 0.442274 4.83742 1.42683 +vn 0.467457 0.839167 0.277996 +v 0.44288 4.84128 1.41499 +vn 0.467002 0.821039 0.328335 +v 0.366322 4.88209 1.42167 +vn 0.457622 0.824881 0.331895 +v 0.518611 4.80525 1.39789 +vn 0.457324 0.836576 0.301653 +v 0.51955 4.8087 1.38774 +vn 0.469873 0.80728 0.357096 +v 0.292732 4.91799 1.43319 +vn 0.440541 0.858857 0.261322 +v 0.291907 4.92268 1.42051 +vn 0.42738 0.841613 0.330203 +v 0.223803 4.95241 1.42959 +vn 0.381045 0.884508 0.269166 +v 0.222502 4.95749 1.41615 +vn 0.368223 0.865585 0.339375 +v 0.294282 4.91254 1.45023 +vn 0.447835 0.86515 0.225742 +v 0.366898 4.87286 1.44989 +vn 0.472144 0.848832 0.237831 +v 0.226049 4.9466 1.44739 +vn 0.387397 0.89233 0.231669 +v 0.441708 4.83255 1.44349 +vn 0.470039 0.844525 0.256596 +v 0.517622 4.80101 1.41211 +vn 0.451876 0.84834 0.275912 +v 0.805544 4.61551 1.15813 +vn 0.983809 0.174851 0.0393397 +v 0.805694 4.53964 1.17281 +vn 0.991305 -0.0488606 0.122175 +v 0.807087 4.53975 1.16549 +vn 0.957821 0.0130611 0.287069 +v 0.807083 4.61066 1.1503 +vn 0.968183 0.102116 0.228461 +v 0.792605 4.46592 1.20508 +vn 0.958567 -0.085443 0.271753 +v 0.794776 4.4645 1.19827 +vn 0.926394 -0.0100414 0.376421 +v 0.797838 4.46298 1.192 +vn 0.871062 0.0662466 0.486686 +v 0.791594 4.66923 1.16057 +vn 0.925491 0.320018 0.202618 +v 0.788236 4.6759 1.16945 +vn 0.856242 0.516283 -0.0173714 +v 0.761671 4.71381 1.18986 +vn 0.776503 0.60023 0.191749 +v 0.79279 4.6658 1.1748 +vn 0.919916 0.384918 -0.0747821 +v 0.807069 4.60718 1.16854 +vn 0.992074 0.0783838 -0.0982138 +v 0.762081 4.71161 1.1973 +vn 0.756329 0.641607 0.127701 +v 0.764124 4.70768 1.20742 +vn 0.749569 0.656351 0.0857312 +v 0.805157 4.53913 1.1822 +vn 0.99409 -0.10195 0.0373002 +v 0.790623 4.46727 1.21417 +vn 0.966721 -0.139815 0.214248 +v 0.715238 4.30065 1.33878 +vn 0.868846 -0.184064 0.459595 +v 0.684241 4.26257 1.37743 +vn 0.8346 -0.255208 0.488171 +v 0.686104 4.26085 1.37345 +vn 0.83286 -0.241704 0.497919 +v 0.718555 4.2977 1.33162 +vn 0.859517 -0.143368 0.490587 +v 0.687654 4.25936 1.37016 +vn 0.829345 -0.223962 0.511887 +v 0.68917 4.25791 1.36719 +vn 0.82454 -0.202415 0.528358 +v 0.647796 4.22697 1.41572 +vn 0.784441 -0.344168 0.515946 +v 0.605437 4.19458 1.45203 +vn 0.712922 -0.452732 0.535514 +v 0.607355 4.19255 1.44786 +vn 0.712976 -0.446856 0.540357 +v 0.651266 4.22349 1.40827 +vn 0.782215 -0.320842 0.534042 +v 0.608856 4.19088 1.44446 +vn 0.712391 -0.436185 0.549765 +v 0.61027 4.18929 1.44148 +vn 0.711737 -0.42408 0.559989 +v 0.762399 4.3813 1.26521 +vn 0.916137 -0.109159 0.385717 +v 0.741135 4.34046 1.30087 +vn 0.895761 -0.139838 0.421968 +v 0.742775 4.3391 1.29706 +vn 0.889995 -0.115591 0.441076 +v 0.77939 4.42259 1.23294 +vn 0.938182 -0.101225 0.33101 +v 0.780661 4.42164 1.22926 +vn 0.927243 -0.0651277 0.368754 +v 0.765286 4.37899 1.25828 +vn 0.896031 -0.0470144 0.441495 +v 0.744252 4.33783 1.29386 +vn 0.881091 -0.0878441 0.464718 +v 0.745777 4.33656 1.29088 +vn 0.868887 -0.0549727 0.491949 +v 0.781946 4.42068 1.22612 +vn 0.911453 -0.0271822 0.410506 +v 0.783366 4.41965 1.22312 +vn 0.88971 0.0148155 0.456285 +v 0.739385 4.34195 1.30521 +vn 0.898297 -0.155742 0.41086 +v 0.710898 4.30445 1.34888 +vn 0.870774 -0.206752 0.446101 +v 0.737284 4.34383 1.31057 +vn 0.899082 -0.167623 0.404419 +v 0.734916 4.34594 1.31679 +vn 0.898361 -0.175044 0.402874 +v 0.778115 4.42357 1.23707 +vn 0.94285 -0.126128 0.308426 +v 0.759054 4.38407 1.27467 +vn 0.921389 -0.147585 0.359529 +v 0.776659 4.42468 1.2422 +vn 0.944672 -0.147609 0.292927 +v 0.775064 4.42589 1.24803 +vn 0.942622 -0.158802 0.293678 +v 0.682185 4.26448 1.38206 +vn 0.83538 -0.264483 0.481861 +v 0.642909 4.23173 1.42652 +vn 0.784229 -0.355619 0.508449 +v 0.600484 4.19975 1.46313 +vn 0.712456 -0.460022 0.529893 +v 0.603279 4.19687 1.45695 +vn 0.712877 -0.458027 0.531053 +v 0.679586 4.26684 1.38785 +vn 0.835023 -0.270693 0.479022 +v 0.676632 4.26955 1.3946 +vn 0.834232 -0.274581 0.478186 +v 0.551933 4.17173 1.49681 +vn 0.616012 -0.571142 0.542518 +v 0.597297 4.20306 1.47038 +vn 0.712147 -0.462148 0.528456 +v 0.30496 4.09467 1.57622 +vn 0.227262 -0.813414 0.535453 +v 0.231549 4.08588 1.58867 +vn 0.157874 -0.831818 0.532122 +v 0.232499 4.08313 1.58416 +vn 0.158504 -0.829252 0.535926 +v 0.30706 4.08989 1.56813 +vn 0.228781 -0.805024 0.547354 +v 0.233193 4.08096 1.58058 +vn 0.159081 -0.824279 0.543376 +v 0.233806 4.07901 1.57751 +vn 0.160078 -0.817759 0.552852 +v 0.15565 4.08008 1.59758 +vn 0.0983083 -0.84138 0.531428 +v 0.0777 4.07699 1.60297 +vn 0.0504908 -0.841672 0.537624 +v 0.078475 4.0741 1.59835 +vn 0.0472232 -0.843764 0.534633 +v 0.156811 4.07502 1.58942 +vn 0.0993716 -0.833659 0.543266 +v 0.078741 4.07182 1.59473 +vn 0.0469287 -0.839467 0.54138 +v 0.078976 4.06979 1.59161 +vn 0.047278 -0.833562 0.550399 +v 0.377511 4.10213 1.55164 +vn 0.309197 -0.775122 0.550984 +v 0.37645 4.10416 1.55519 +vn 0.308551 -0.780756 0.543338 +v 0.556838 4.16612 1.48538 +vn 0.616517 -0.565564 0.547763 +v 0.501778 4.14211 1.51435 +vn 0.506756 -0.664349 0.549399 +v 0.503552 4.1398 1.51002 +vn 0.50726 -0.661152 0.55278 +v 0.443764 4.11803 1.53125 +vn 0.403084 -0.72594 0.557256 +v 0.378458 4.10029 1.5486 +vn 0.310488 -0.76845 0.559538 +v 0.56016 4.16217 1.47764 +vn 0.617131 -0.552568 0.560195 +v 0.50489 4.13795 1.50653 +vn 0.507653 -0.654029 0.560834 +v 0.506112 4.13623 1.50352 +vn 0.508593 -0.646222 0.568973 +v 0.375016 4.10671 1.55964 +vn 0.307857 -0.783561 0.539682 +v 0.373368 4.10966 1.56493 +vn 0.307495 -0.785989 0.536347 +v 0.30173 4.10169 1.58835 +vn 0.226283 -0.816717 0.530819 +v 0.371196 4.11341 1.57163 +vn 0.30708 -0.786695 0.535549 +v 0.368709 4.11775 1.57951 +vn 0.306846 -0.787801 0.534056 +v 0.440915 4.12243 1.5392 +vn 0.40163 -0.73544 0.54573 +v 0.499755 4.14474 1.51951 +vn 0.506529 -0.66766 0.545581 +v 0.436594 4.1288 1.55108 +vn 0.400933 -0.739218 0.541118 +v 0.497103 4.14809 1.526 +vn 0.506279 -0.668352 0.544965 +v 0.494071 4.15195 1.53365 +vn 0.506212 -0.669691 0.543381 +v 0.230455 4.08906 1.59405 +vn 0.157459 -0.833975 0.52886 +v 0 4.07693 1.60621 +vn 3.05402e-06 -0.848833 0.528661 +v 0.067971 4.08066 1.60968 +vn 0.0310323 -0.845627 0.532872 +v 0.153855 4.08759 1.60991 +vn 0.0980114 -0.844736 0.526132 +v 0.229008 4.09312 1.60085 +vn 0.156932 -0.834718 0.527843 +v 0.227357 4.09783 1.60885 +vn 0.156529 -0.835526 0.526683 +v 0 4.08411 1.61778 +vn 2.86566e-06 -0.850219 0.526429 +v 0.086208 4.08596 1.61666 +vn 0.06069 -0.852114 0.519826 +v 0.067489 4.09023 1.62515 +vn 0.0319129 -0.852967 0.520988 +v 0.659729 4.7621 1.29991 +vn 0.504608 0.818276 0.275311 +v 0.717533 4.74109 1.24412 +vn 0.601546 0.769247 0.215411 +v 0.659901 4.76515 1.29127 +vn 0.541753 0.772974 0.330175 +v 0.717223 4.74385 1.23605 +vn 0.639683 0.716936 0.277143 +v 0.592952 4.78442 1.34507 +vn 0.489658 0.796057 0.355708 +v 0.592256 4.78119 1.35438 +vn 0.462483 0.834113 0.300609 +v 0.660228 4.75802 1.31207 +vn 0.486641 0.835739 0.254402 +v 0.591778 4.77707 1.36746 +vn 0.449155 0.849519 0.276725 +v 0.718964 4.73719 1.25541 +vn 0.582359 0.789818 0.192472 +v 0.104107 4.99207 1.42622 +vn 0.185883 0.932672 0.309146 +v 0.161162 4.97705 1.42701 +vn 0.290387 0.912135 0.289284 +v 0.159799 4.98237 1.41298 +vn 0.281292 0.890375 0.357921 +v 0.103046 4.99751 1.41179 +vn 0.180941 0.908783 0.375997 +v 0.050421 5.00521 1.41126 +vn 0.0837073 0.917154 0.389643 +v 0.050956 4.99973 1.42576 +vn 0.0857924 0.942718 0.322371 +v 0 5.00321 1.42193 +vn 3.31482e-18 0.940455 0.339918 +v 0 5.00876 1.40803 +vn 0 0.910891 0.412648 +v 0.051869 4.99379 1.44463 +vn 0.0869913 0.954761 0.284364 +v 0.105892 4.98605 1.4451 +vn 0.187983 0.943721 0.272129 +v 0 4.99755 1.4394 +vn -1.10498e-18 0.955822 0.293947 +v 0 4.99049 1.46362 +vn -5.09316e-06 0.961414 0.275107 +v 0.163461 4.97106 1.44545 +vn 0.29441 0.921907 0.251815 +v 1.24073 2.14567 -1.3199 +vn 0.822534 0.371317 -0.430768 +v 1.21298 2.14723 -1.36909 +vn 0.800055 0.365364 -0.475838 +v 1.02738 2.36267 -1.42116 +vn 0.616869 0.58584 -0.525609 +v 1.05407 2.37756 -1.371 +vn 0.616403 0.636442 -0.463669 +v 0.904265 1.18054 -1.19365 +vn 0.461448 -0.796845 -0.390005 +v 0.919717 1.1523 -1.11569 +vn 0.429072 -0.823938 -0.370166 +v 0.888668 1.23966 -1.32268 +vn 0.50978 -0.746201 -0.428145 +v 0.903051 1.21546 -1.26239 +vn 0.495031 -0.762959 -0.415737 +v 0.935247 1.1264 -1.03751 +vn 0.398814 -0.849213 -0.3461 +v 0.953371 1.10277 -0.955471 +vn 0.370046 -0.871754 -0.321109 +v 0.971362 1.08049 -0.870461 +vn 0.347086 -0.891406 -0.291422 +v 0.990369 1.06117 -0.783335 +vn 0.33093 -0.908996 -0.253399 +v 0.562488 1.00854 -1.05691 +vn 0.176148 -0.966913 -0.18453 +v 0.586874 0.982536 -0.882888 +vn 0.116464 -0.98213 -0.147842 +v 0.543514 1.04025 -1.22103 +vn 0.229044 -0.943293 -0.240285 +v 0.5313 1.08168 -1.37026 +vn 0.275295 -0.906018 -0.321472 +v 0.399886 0.984388 -1.04059 +vn 0.0895672 -0.987927 -0.126404 +v 0.447809 0.972635 -0.901383 +vn 0.0647799 -0.993345 -0.0952355 +v 0.416316 0.967427 -0.859407 +vn 0.0444109 -0.996504 -0.0707638 +v 0.557336 0.973942 -0.840296 +vn 0.0794189 -0.990449 -0.112713 +v 0.180948 0.983828 -1.14758 +vn 0.0381236 -0.991116 -0.127421 +v 0 0.979945 -1.14199 +vn -4.50106e-07 -0.993007 -0.118052 +v 0.223232 0.97127 -1.01395 +vn 0.0343624 -0.995804 -0.084816 +v 0.188169 0.966997 -0.971002 +vn 0.0234426 -0.997438 -0.0675813 +v 0.07618 0.968764 -1.0228 +vn 0.0100664 -0.996883 -0.0782469 +v 0.037465 0.96608 -0.989827 +vn 0.00448975 -0.997796 -0.0661985 +v 0.141413 1.00168 -1.2739 +vn 0.038351 -0.982861 -0.180315 +v 0.175493 1.0105 -1.3113 +vn 0.0538619 -0.977209 -0.205334 +v 0.138588 1.03849 -1.43136 +vn 0.060251 -0.957001 -0.28376 +v 0 1.00529 -1.30703 +vn -7.59516e-19 -0.981136 -0.193321 +v 0 1.04313 -1.45896 +vn -2.14124e-18 -0.953679 -0.300825 +v 1.03977 1.02297 -0.518245 +vn 0.246853 -0.960183 -0.130814 +v 1.05606 1.01663 -0.431909 +vn 0.22972 -0.967708 -0.103777 +v 1.00788 1.04504 -0.695183 +vn 0.303473 -0.929872 -0.20795 +v 1.025 1.03275 -0.606702 +vn 0.272428 -0.94745 -0.167692 +v 0.977686 0.980898 0.006709 +vn 0.184379 -0.982842 -0.00506168 +v 1.06575 1.01105 -0.344453 +vn 0.220805 -0.972577 -0.0730728 +v 1.0794 1.00855 -0.255505 +vn 0.213009 -0.975697 -0.0514128 +v 1.08997 1.00721 -0.165045 +vn 0.21234 -0.976747 -0.0296057 +v 1.09586 1.00661 -0.077563 +vn 0.21008 -0.977576 -0.0145633 +v 0.808709 0.964591 -0.333224 +vn 0.078888 -0.996666 -0.0208219 +v 0.673162 0.960349 -0.347563 +vn 0.00575779 -0.999977 -0.0034898 +v 0.852148 0.965635 -0.18587 +vn 0.0899526 -0.995842 -0.0143911 +v 0.824847 0.963049 -0.139739 +vn 0.0632834 -0.99796 -0.00845856 +v 0.72222 0.960174 -0.195085 +vn 0.0103482 -0.999942 -0.00287649 +v 0.728463 0.960014 -0.097361 +vn 0.00832508 -0.999964 -0.0017662 +v 0.6875 0.960002 -0.147142 +vn 8.21792e-05 -0.999999 -0.00110917 +v 0.763273 0.964692 -0.483439 +vn 0.0793015 -0.996279 -0.0337688 +v 0.627878 0.96075 -0.499691 +vn 0.00991639 -0.999911 -0.00890987 +v 0.657889 0.961687 -0.54428 +vn 0.0216246 -0.999581 -0.0192604 +v 0.609062 0.965278 -0.695538 +vn 0.0429073 -0.997544 -0.0553689 +v 0.635907 0.969656 -0.735588 +vn 0.0675373 -0.994067 -0.0852618 +v 0.407628 0.960183 -0.469326 +vn 8.37543e-05 -1 -0.000505268 +v 0.446508 0.960186 -0.466693 +vn 0.000199021 -1 -0.000728696 +v 0.560022 0.960233 -0.457514 +vn 0.00206041 -0.999996 -0.00185471 +v 0.593476 0.960326 -0.454281 +vn 0.00443197 -0.999986 -0.00296941 +v 0.432413 0.960991 -0.667304 +vn 0.0096322 -0.999891 -0.0112288 +v 0.547282 0.961249 -0.606479 +vn 0.0104171 -0.999825 -0.0155347 +v 0.578309 0.962582 -0.650776 +vn 0.0226077 -0.999308 -0.0295409 +v 0.458173 0.960178 -0.260165 +vn 2.86181e-06 -1 -5.18236e-06 +v 0.418366 0.960178 -0.261804 +vn 0 -1 0 +v 0.467081 0.960178 -0.050525 +vn 0 -1 0 +v 0.426586 0.960178 -0.051055 +vn 0 -1 0 +v 0.611528 0.960175 -0.252226 +vn -0.000273369 -1 -0.000543617 +v 0.5772 0.960173 -0.20313 +vn -0.000342861 -1 -0.000129534 +v 0.574245 0.96018 -0.254432 +vn -4.54681e-05 -1 -0.000153506 +v 0.580101 0.96017 -0.151724 +vn -0.000475034 -1 -7.20998e-05 +v 0.541692 0.960177 -0.153097 +vn -0.000113141 -1 -4.23484e-05 +v 0.251294 0.960178 -0.372806 +vn 0 -1 0 +v 0.209874 0.960178 -0.373972 +vn 0 -1 0 +v 0.084105 0.960178 -0.380467 +vn 0 -1 0 +v 0.042005 0.960178 -0.391837 +vn 0 -1 0 +v 0.257292 0.960178 -0.160043 +vn 0 -1 0 +v 0.214929 0.960178 -0.16064 +vn 0 -1 0 +v 0.086227 0.960178 -0.166076 +vn 0 -1 0 +v 0.043084 0.960178 -0.177484 +vn 0 -1 0 +v 0.20366 0.960106 -0.582156 +vn 0.000700204 -0.999998 0.00168111 +v 0.243906 0.960138 -0.580497 +vn 0.000871065 -0.999999 0.00116539 +v 0.158629 0.959528 -0.736789 +vn 0.00401325 -0.99999 -0.00186629 +v 0.196223 0.959945 -0.78206 +vn 0.00776006 -0.999908 -0.0110924 +v 0.237312 0.959903 -0.733029 +vn 0.00637579 -0.999965 -0.00534031 +v 0.040689 0.960001 -0.600652 +vn 3.37758e-06 -0.999993 0.0036954 +v 0.081513 0.960039 -0.589501 +vn 0.00017552 -0.999995 0.00302905 +v 0 0.959086 -0.765471 +vn -7.98434e-09 -0.999997 -0.0024092 +v 0.039118 0.959307 -0.801212 +vn 0.00232149 -0.999953 -0.00941416 +v 0.079181 0.95927 -0.743533 +vn 0.00254006 -0.999997 -0.000159559 +v 0.999801 0.986572 0.187396 +vn 0.200024 -0.97958 0.020328 +v 1.11102 1.01721 0.357938 +vn 0.220353 -0.973908 0.0542958 +v 1.09929 1.00662 0.011369 +vn 0.212637 -0.977127 -0.00280908 +v 1.10735 1.00864 0.096811 +vn 0.21186 -0.977263 0.00855453 +v 0.971955 1.01318 0.724677 +vn 0.300263 -0.9475 0.109936 +v 1.03849 1.00076 0.358625 +vn 0.219649 -0.974359 0.0487736 +v 1.03741 1.01272 0.538481 +vn 0.243974 -0.96594 0.0862331 +v 0.839883 0.96977 0.528974 +vn 0.127528 -0.991435 0.0281732 +v 0.738645 0.96263 0.590558 +vn 0.0453071 -0.998928 0.00952204 +v 0.704442 0.961321 0.547301 +vn 0.0213621 -0.999758 0.00533896 +v 0.860506 0.983443 0.750802 +vn 0.228741 -0.971371 0.0641565 +v 0.732132 0.964684 0.778741 +vn 0.081818 -0.99635 0.0243528 +v 0.698078 0.962316 0.737061 +vn 0.0393974 -0.999174 0.00991125 +v 0.911395 0.972027 0.240916 +vn 0.137997 -0.990242 0.0194384 +v 0.808581 0.961557 0.102853 +vn 0.0448025 -0.998992 0.00260933 +v 0.836366 0.962985 0.054211 +vn 0.0646173 -0.99791 0.000308744 +v 0.812778 0.963215 0.29517 +vn 0.0606962 -0.998085 0.0119584 +v 0.785794 0.961478 0.24885 +vn 0.0371113 -0.999277 0.0082887 +v 0.668722 0.960034 0.104879 +vn -0.00125163 -0.999999 0.000701737 +v 0.697838 0.959924 0.054348 +vn -0.000541117 -1 0.000437007 +v 0.740917 0.960043 0.103869 +vn 0.0101805 -0.999948 0.00108515 +v 0.454743 0.960178 0.21153 +vn 0 -1 0 +v 0.485549 0.960178 0.262478 +vn 2.78399e-06 -1 5.61557e-06 +v 0.444667 0.960178 0.263797 +vn 0 -1 0 +v 0.613452 0.960173 0.20706 +vn -0.000169413 -1 0.000476584 +v 0.642266 0.960213 0.256294 +vn 0.000660195 -0.999999 0.00117708 +v 0.604263 0.960192 0.257979 +vn 0.000446003 -1 0.000395542 +v 0.443166 0.960178 0.159616 +vn 0 -1 0 +v 0.483949 0.960178 0.158939 +vn 0 -1 0 +v 0.602411 0.960162 0.156648 +vn -0.000657769 -1 0.000287621 +v 0.64035 0.960125 0.155791 +vn -0.0011593 -0.999999 0.000848939 +v 0.391066 0.960178 0.575185 +vn 0 -1 0 +v 0.432648 0.960178 0.572538 +vn 0 -1 0 +v 0.346608 0.960178 0.727685 +vn 6.82875e-08 -1 1.85904e-05 +v 0.387191 0.960178 0.773511 +vn 1.39e-05 -1 8.88145e-05 +v 0.514589 0.960181 0.518366 +vn 0.000355531 -1 2.61232e-05 +v 0.593335 0.960257 0.511958 +vn 0.00321324 -0.999995 0.000487836 +v 0.553599 0.960194 0.563025 +vn 0.00118771 -0.999999 0.00018551 +v 0.510554 0.960182 0.713978 +vn 0.000683627 -1 4.45455e-05 +v 0.548384 0.960208 0.757744 +vn 0.00223651 -0.999997 0.000467848 +v 0.220316 0.960178 0.583285 +vn 0 -1 0 +v 0.263633 0.960178 0.581674 +vn 0 -1 0 +v 0.044308 0.960178 0.601733 +vn 0 -1 0 +v 0.088593 0.960178 0.590562 +vn 0 -1 0 +v 0.259958 0.960185 0.83045 +vn 3.99419e-05 -1 0.000845495 +v 0.218016 0.960178 0.783953 +vn 3.70274e-06 -1 7.23825e-05 +v 0.261713 0.960178 0.734664 +vn 6.43063e-08 -1 1.71615e-05 +v 0.087226 0.960184 0.841439 +vn 4.76994e-05 -1 0.000741978 +v 0.043783 0.960178 0.803246 +vn -1.86748e-06 -1 8.20061e-05 +v 0.087868 0.960178 0.745208 +vn 7.19645e-07 -1 1.43384e-05 +v 0.31877 0.960178 0.267105 +vn 0 -1 0 +v 0.275907 0.960178 0.267999 +vn 0 -1 0 +v 0.218919 0.960178 0.054805 +vn 0 -1 0 +v 0.26193 0.960178 0.05479 +vn 0 -1 0 +v 0.144805 0.960178 0.270047 +vn 0 -1 0 +v 0.095082 0.960178 0.26629 +vn 0 -1 0 +v 0.043979 0.960178 0.039516 +vn 0 -1 0 +v 0.087969 0.960178 0.05078 +vn 0 -1 0 +v 1.06542 1.10762 1.00991 +vn 0.398493 -0.87568 0.272742 +v 0.939379 1.1749 1.33051 +vn 0.443051 -0.795497 0.413389 +v 1.00029 1.08542 1.04001 +vn 0.430637 -0.863796 0.261549 +v 0.989897 1.12962 1.1742 +vn 0.446346 -0.823837 0.349382 +v 0.829608 1.14236 1.37667 +vn 0.380033 -0.824832 0.418602 +v 0.7021 1.11322 1.42145 +vn 0.295909 -0.86588 0.403348 +v 0.419601 0.962448 1.00365 +vn 0.00832471 -0.999214 0.0387638 +v 0.457346 0.964793 1.0436 +vn 0.017054 -0.997833 0.0635554 +v 0.57549 0.963423 0.98285 +vn 0.0250568 -0.998298 0.0526684 +v 0.61005 0.966974 1.02053 +vn 0.0499818 -0.994855 0.0881221 +v 0.426875 0.960187 0.818071 +vn 0.000106544 -0.999999 0.00109929 +v 0.465573 0.960237 0.861311 +vn 0.000832485 -0.999993 0.00368116 +v 0.585069 0.960386 0.800177 +vn 0.00848699 -0.999961 0.00238276 +v 0.620534 0.960923 0.841234 +vn 0.0195253 -0.999775 0.0083437 +v 0.368511 1.00704 1.3062 +vn 0.0743701 -0.957843 0.277501 +v 0.367841 1.05771 1.45973 +vn 0.105258 -0.931241 0.34887 +v 0.486541 1.00114 1.2496 +vn 0.0974031 -0.956584 0.274698 +v 0.523073 1.01588 1.28296 +vn 0.128633 -0.940977 0.313075 +v 0.483856 1.05282 1.40437 +vn 0.147247 -0.927014 0.344911 +v 0.522159 1.0707 1.43354 +vn 0.175714 -0.914576 0.364247 +v 0.247359 1.0143 1.35819 +vn 0.0506942 -0.958231 0.281468 +v 0.206975 1.00206 1.32126 +vn 0.0364665 -0.965536 0.257704 +v 0.082877 1.01237 1.37089 +vn 0.0163504 -0.961285 0.275072 +v 0.041502 1.00324 1.33989 +vn 0.00821903 -0.966109 0.258002 +v 0.248066 1.06578 1.51008 +vn 0.0684983 -0.928789 0.364223 +v 0.206661 1.05058 1.47663 +vn 0.0519864 -0.939292 0.339158 +v 0.083358 1.06327 1.52366 +vn 0.0220205 -0.931734 0.362473 +v 0.041587 1.05184 1.49518 +vn 0.0107866 -0.939488 0.342412 +v 0.2956 0.963785 1.06 +vn 0.00900621 -0.998692 0.0503355 +v 0.301122 0.960222 0.875696 +vn 0.000397225 -0.999996 0.00275434 +v 0.16926 0.965815 1.11233 +vn 0.00781121 -0.997307 0.072916 +v 0.127701 0.963265 1.07007 +vn 0.00423888 -0.999017 0.0441307 +v 0.172648 0.960406 0.930001 +vn 0.000667718 -0.999968 0.00800163 +v 0.130224 0.960214 0.884729 +vn 0.000235792 -0.999997 0.00225621 +v 1.00437 2.94714 0.931529 +vn 0.530786 0.832467 0.158951 +v 1.01503 2.95258 0.857569 +vn 0.525278 0.84215 0.121928 +v 1.01393 2.96243 0.779121 +vn 0.534251 0.84189 0.0761429 +v 1.02111 2.96318 0.69659 +vn 0.533215 0.845289 0.0341746 +v 0.778109 3.1731 0.812566 +vn 0.840686 0.531732 0.102509 +v 0.770637 3.16949 0.87244 +vn 0.832503 0.533458 0.149537 +v 0.860158 3.08448 0.664918 +vn 0.682136 0.730854 0.0233038 +v 0.782881 3.17731 0.626671 +vn 0.84129 0.53946 -0.034842 +v 0.782198 3.17658 0.719338 +vn 0.850373 0.525123 0.0333502 +v 0.726098 3.14369 1.0918 +vn 0.752655 0.584598 0.302912 +v 0.663475 3.11445 1.26081 +vn 0.650122 0.621239 0.437498 +v 0.690941 3.04713 1.32119 +vn 0.591756 0.671867 0.445444 +v 0.999788 2.91394 1.07924 +vn 0.527834 0.812863 0.246262 +v 1.00881 2.92725 1.00957 +vn 0.523301 0.826914 0.205835 +v 1.00159 2.87206 1.19295 +vn 0.531339 0.780455 0.329497 +v 1.00259 2.8927 1.13816 +vn 0.527354 0.799809 0.28671 +v 0.188319 3.29475 1.43908 +vn 0.207452 0.570717 0.79451 +v 0.154545 3.20141 1.51832 +vn 0.163025 0.61109 0.774591 +v 0.21526 3.15646 1.53911 +vn 0.221817 0.61695 0.755096 +v 0 3.31135 1.45201 +vn -7.73469e-18 0.586484 0.809961 +v 0.077269 3.16809 1.55717 +vn 0.0788266 0.623984 0.777451 +v 0.54886 3.296 1.22265 +vn 0.67223 0.450311 0.587645 +v 0.376824 3.25038 1.39536 +vn 0.406975 0.56032 0.721396 +v 0.418176 3.21621 1.3979 +vn 0.439512 0.572318 0.692302 +v 0.527032 3.41591 1.1731 +vn 0.679853 0.303157 0.667755 +v 0.521996 3.53198 1.14372 +vn 0.66214 0.0930022 0.743587 +v 0 3.4145 1.38401 +vn -1.44498e-06 0.503296 0.864114 +v 0 3.5159 1.3342 +vn 1.10574e-18 0.341995 0.939702 +v 0.768264 2.79224 -1.43255 +vn 0.836653 0.534352 -0.12033 +v 0.868575 2.64006 -1.38954 +vn 0.847269 0.49739 -0.186381 +v 0.69548 2.90214 -1.35551 +vn 0.771608 0.636055 0.00746053 +v 0.582149 3.03302 -1.4119 +vn 0.709043 0.697953 0.100597 +v 0.55504 3.05256 -1.37389 +vn 0.658689 0.738775 0.142616 +v 0.6801 2.90908 -1.53133 +vn 0.835563 0.541202 -0.0945195 +v 0.581479 3.04441 -1.50283 +vn 0.765593 0.64109 0.053577 +v 0.567109 3.06628 -1.54969 +vn 0.769639 0.636293 0.0527927 +v 0.547505 3.0845 -1.51212 +vn 0.73235 0.674124 0.0960248 +v 0.726586 2.85468 -0.808751 +vn 0.62945 0.775705 -0.0455429 +v 0.603726 2.94526 -0.848963 +vn 0.562019 0.827124 -0.00128023 +v 0.834697 2.76564 -0.762616 +vn 0.67063 0.735964 -0.0928049 +v 0.926121 2.68492 -0.724015 +vn 0.69439 0.706776 -0.135242 +v 0.817298 2.81957 -0.556698 +vn 0.630261 0.753544 -0.186928 +v 0.730587 2.8731 -0.632187 +vn 0.607233 0.781083 -0.145527 +v 0.701463 2.90145 -0.600944 +vn 0.592041 0.789485 -0.161865 +v 0.605976 2.95582 -0.678424 +vn 0.551243 0.826108 -0.116949 +v 0.574385 2.98113 -0.647927 +vn 0.53224 0.834938 -0.14 +v 0.696789 2.88053 -0.773638 +vn 0.609365 0.790685 -0.0590827 +v 0.770004 2.92698 -0.324082 +vn 0.595693 0.761536 -0.255368 +v 0.784168 2.97516 -0.151484 +vn 0.595552 0.759787 -0.260847 +v 0.676903 2.97311 -0.39937 +vn 0.572209 0.781749 -0.24788 +v 0.646954 3.00535 -0.367326 +vn 0.564396 0.782742 -0.262244 +v 0.64538 3.08904 -0.13963 +vn 0.596951 0.750027 -0.284797 +v 0.661881 3.05962 -0.183796 +vn 0.589816 0.757598 -0.279576 +v 0.628047 3.08383 -0.189205 +vn 0.583452 0.758583 -0.290059 +v 0.853354 2.88353 -0.25785 +vn 0.604533 0.751733 -0.263511 +v 0.864655 2.93399 -0.087304 +vn 0.594126 0.762517 -0.256089 +v 0.94238 2.97661 0.270181 +vn 0.575214 0.800576 -0.167946 +v 0.793619 3.03838 0.065867 +vn 0.61564 0.753776 -0.229805 +v 0.7817 3.0621 0.111561 +vn 0.630392 0.743026 -0.224763 +v 0.682215 3.1628 0.132801 +vn 0.691598 0.669577 -0.270848 +v 0.713785 3.1231 0.110524 +vn 0.673927 0.695004 -0.250581 +v 0.762464 3.00479 -0.114635 +vn 0.598593 0.758251 -0.258344 +v 0.742903 3.03378 -0.075281 +vn 0.605577 0.752871 -0.2578 +v 0.620461 3.12205 -0.106337 +vn 0.601666 0.739574 -0.301708 +v 0.651792 3.10301 -0.089731 +vn 0.610988 0.737868 -0.286783 +v 0.877273 3.02304 0.260982 +vn 0.60429 0.778029 -0.17177 +v 0.809549 3.0963 0.332483 +vn 0.683458 0.71102 -0.165333 +v 0.79132 3.09341 0.251106 +vn 0.669734 0.717311 -0.19215 +v 0.782854 3.11385 0.297291 +vn 0.695233 0.694532 -0.185139 +v 0.7632 3.17345 0.43725 +vn 0.79175 0.592265 -0.149515 +v 0.772885 3.17268 0.498323 +vn 0.811622 0.573389 -0.111776 +v 0.786597 3.15234 0.48454 +vn 0.771339 0.628694 -0.0988974 +v 1.00422 2.93538 0.277489 +vn 0.552021 0.815323 -0.174705 +v 0.964744 2.99536 0.501439 +vn 0.561865 0.823927 -0.0738421 +v 0.297965 3.22052 -1.4085 +vn 0.336682 0.867495 0.366194 +v 0.307852 3.31354 -1.58743 +vn 0.426041 0.735909 0.526238 +v 0.398312 3.1569 -1.36064 +vn 0.446491 0.84997 0.279639 +v 0.42858 3.15349 -1.40244 +vn 0.504348 0.821666 0.265516 +v 0.387563 3.22885 -1.52985 +vn 0.533163 0.767276 0.356405 +v 0.432703 3.23247 -1.6155 +vn 0.674656 0.67285 0.3035 +v 0.16576 3.25898 -1.41075 +vn 0.171187 0.893347 0.415484 +v 0 3.2696 -1.40234 +vn 0 0.907135 0.42084 +v 0.18545 3.35548 -1.5765 +vn 0.21031 0.756517 0.619235 +v 0.061199 3.37611 -1.57715 +vn 0.0495692 0.756576 0.652025 +v 0 3.3472 -1.53824 +vn -2.21069e-18 0.809466 0.587167 +v 0.237748 3.1569 -1.1585 +vn 0.242769 0.942963 0.227781 +v 0.238645 3.12552 -0.986511 +vn 0.250593 0.961528 0.112548 +v 0.135926 3.1905 -1.20936 +vn 0.136756 0.95421 0.266045 +v 0.102193 3.18417 -1.16923 +vn 0.102728 0.965568 0.239008 +v 0.136641 3.1538 -1.03998 +vn 0.145582 0.977908 0.150003 +v 0.102576 3.15297 -1.00151 +vn 0.108567 0.986772 0.120394 +v 0.338629 3.11234 -1.10054 +vn 0.34337 0.920892 0.184538 +v 0.37123 3.10778 -1.13953 +vn 0.376485 0.904443 0.200602 +v 0.470046 3.04751 -1.0724 +vn 0.469781 0.870298 0.147941 +v 0.501313 3.03655 -1.11017 +vn 0.506954 0.847952 0.154838 +v 0.338204 3.08824 -0.928635 +vn 0.349873 0.934265 0.0688337 +v 0.4726 3.02558 -0.892833 +vn 0.46625 0.883702 0.0410038 +v 0 3.15532 -0.767567 +vn 0 0.994749 -0.102344 +v 0.201503 3.13091 -0.950419 +vn 0.218254 0.97245 0.0818884 +v 0.066282 3.15237 -0.964857 +vn 0.0705705 0.993447 0.0899014 +v 0 3.15127 -0.914193 +vn 0 0.998983 0.0450838 +v 0.201505 3.24133 -0.395609 +vn 0.295446 0.850868 -0.434436 +v 0.067281 3.2546 -0.432072 +vn 0.105067 0.883432 -0.456628 +v 0.513506 3.07503 -0.425033 +vn 0.502087 0.820028 -0.274706 +v 0.337342 3.2129 -0.331898 +vn 0.430703 0.809597 -0.398809 +v 0.479161 3.17257 -0.234528 +vn 0.527022 0.770206 -0.359208 +v 0.51762 3.13881 -0.251233 +vn 0.534341 0.776996 -0.332803 +v 0.439477 3.20301 -0.227509 +vn 0.51873 0.762182 -0.387294 +v 0 3.34647 -0.293868 +vn -4.42294e-18 0.789871 -0.613273 +v 0 3.27774 -0.39731 +vn -2.21089e-18 0.867699 -0.497091 +v 0.134519 3.56308 -0.126535 +vn 0.336472 -0.00802931 -0.941659 +v 0.200258 3.56268 -0.095914 +vn 0.45666 -0.0256198 -0.889272 +v 0 3.55674 -0.151467 +vn -8.9606e-18 0.0582207 -0.998304 +v 0.066843 3.56137 -0.143247 +vn 0.1811 0.0156247 -0.983341 +v 0.328496 3.56412 -0.011764 +vn 0.623356 -0.0834974 -0.777467 +v 0.447718 3.56772 0.097634 +vn 0.717411 -0.14242 -0.681937 +v 1.24986 1.06238 0.341238 +vn 0.512294 -0.857296 0.0509845 +v 1.28181 1.08111 0.309274 +vn 0.562681 -0.82561 0.0419278 +v 1.28191 1.07844 0.228292 +vn 0.565378 -0.82471 0.0141716 +v 1.24449 1.05364 0.093187 +vn 0.517273 -0.85579 -0.00718078 +v 1.39625 1.18234 0.179022 +vn 0.794426 -0.607342 -0.00474388 +v 1.398 1.18465 0.261356 +vn 0.79373 -0.608013 0.0176721 +v 1.38884 1.17888 0.010277 +vn 0.792569 -0.608476 -0.0398855 +v 1.39363 1.18017 0.094981 +vn 0.792714 -0.609184 -0.0223614 +v 1.39926 1.19015 0.334642 +vn 0.80108 -0.597557 0.0345922 +v 1.4021 1.1995 0.4172 +vn 0.806555 -0.589293 0.0469365 +v 1.39463 1.19938 0.502453 +vn 0.791585 -0.605529 0.0820192 +v 1.39286 1.20966 0.585727 +vn 0.785727 -0.609497 0.105571 +v 1.20228 2.079 -1.42986 +vn 0.779293 0.297367 -0.551612 +v 1.18585 2.14833 -1.41063 +vn 0.76782 0.36345 -0.527595 +v 1.22953 1.87675 -1.45046 +vn 0.818945 0.015334 -0.573667 +v 1.56535 1.62694 0.441968 +vn 0.960132 -0.275101 0.0496599 +v 1.52822 1.50513 0.44009 +vn 0.951351 -0.304818 0.0449085 +v 1.5686 1.67087 0.576406 +vn 0.964213 -0.253543 0.0775252 +v 1.55733 1.6427 0.620346 +vn 0.961243 -0.26234 0.0847981 +v 1.53272 1.54651 0.578836 +vn 0.953497 -0.292783 0.0715645 +v 1.51212 1.50023 0.65588 +vn 0.95135 -0.296747 0.0829118 +v 1.55812 1.58518 0.303786 +vn 0.956269 -0.291662 0.0219534 +v 1.56771 1.61396 0.256665 +vn 0.958318 -0.285354 0.014133 +v 1.55511 1.57313 0.115902 +vn 0.953288 -0.301692 -0.0149661 +v 1.56298 1.60124 0.067959 +vn 0.95476 -0.296484 -0.0230367 +v 1.52014 1.46676 0.303497 +vn 0.948877 -0.315128 0.0180811 +v 1.52922 1.49216 0.256056 +vn 0.949448 -0.313787 0.00927922 +v 1.51752 1.45996 0.110689 +vn 0.946274 -0.322661 -0.021316 +v 1.52402 1.48235 0.068278 +vn 0.946146 -0.322384 -0.0296101 +v 1.61854 1.82847 0.345372 +vn 0.98171 -0.186154 0.0399079 +v 1.63762 1.96957 0.33292 +vn 0.99706 -0.0659473 0.03902 +v 1.61172 1.7785 0.20464 +vn 0.976368 -0.215908 0.00946357 +v 1.61845 1.80881 0.15616 +vn 0.979891 -0.199529 0.0009702 +v 1.63566 1.91545 0.199135 +vn 0.993182 -0.116153 0.00988665 +v 1.63886 1.944 0.150974 +vn 0.99616 -0.087554 -0.000502909 +v 1.61587 1.86947 0.509387 +vn 0.986349 -0.144623 0.0787371 +v 1.6004 1.8806 0.687963 +vn 0.985342 -0.128228 0.112515 +v 1.58438 1.82045 0.745037 +vn 0.978405 -0.165934 0.123243 +v 1.22765 1.05185 -0.149492 +vn 0.509953 -0.858445 -0.0549441 +v 1.21401 1.04961 -0.228359 +vn 0.50269 -0.861588 -0.0704872 +v 1.23967 1.05226 0.010301 +vn 0.513993 -0.857515 -0.0218782 +v 1.23331 1.0511 -0.072615 +vn 0.514152 -0.856907 -0.0368578 +v 1.20609 1.05373 -0.313076 +vn 0.497612 -0.86131 -0.102601 +v 1.19285 1.05938 -0.408248 +vn 0.501711 -0.853828 -0.138793 +v 1.17741 1.06468 -0.487148 +vn 0.488242 -0.855852 -0.170697 +v 1.16254 1.07679 -0.578466 +vn 0.493329 -0.842834 -0.215077 +v 1.29276 1.14442 -0.470475 +vn 0.673909 -0.71539 -0.184564 +v 1.35562 1.17591 -0.304501 +vn 0.777567 -0.615285 -0.129664 +v 1.36517 1.17583 -0.241249 +vn 0.78385 -0.612709 -0.100831 +v 1.37454 1.17661 -0.159691 +vn 0.78864 -0.609778 -0.0788532 +v 1.38278 1.17718 -0.07479 +vn 0.789671 -0.610753 -0.0583193 +v 1.50976 1.44622 0.020876 +vn 0.943224 -0.329419 -0.0425598 +v 1.50473 1.42572 0.073351 +vn 0.94502 -0.32543 -0.0321416 +v 1.48107 1.38357 0.559772 +vn 0.938873 -0.338016 0.0652951 +v 1.51782 1.48014 0.48569 +vn 0.95016 -0.307269 0.0527463 +v 1.38997 1.22111 0.662393 +vn 0.780771 -0.610607 0.1325 +v 1.31943 2.27011 1.48137 +vn 0.70233 0.301009 0.645078 +v 1.34612 2.25995 1.45545 +vn 0.750289 0.290464 0.593883 +v 1.32854 2.21626 1.49429 +vn 0.711584 0.247541 0.657549 +v 1.33623 2.16403 1.50359 +vn 0.728444 0.197135 0.656131 +v 1.34446 2.10888 1.50853 +vn 0.739077 0.139019 0.659119 +v 1.42236 2.17417 1.37364 +vn 0.877241 0.191929 0.440013 +v 1.45261 2.17039 1.30783 +vn 0.908621 0.186797 0.373517 +v 1.45327 2.21403 1.28076 +vn 0.909224 0.233382 0.344737 +v 1.43762 2.26726 1.28153 +vn 0.892823 0.281607 0.351517 +v 1.42973 2.31489 1.26009 +vn 0.885603 0.325314 0.331477 +v 1.40886 2.36654 1.26053 +vn 0.865449 0.370151 0.33762 +v 1.39738 2.41286 1.23584 +vn 0.856552 0.408169 0.31578 +v 1.49054 1.5372 -0.479737 +vn 0.921691 -0.354394 -0.157769 +v 1.46266 1.59644 -0.723806 +vn 0.910841 -0.345158 -0.226353 +v 1.46486 1.54446 -0.627591 +vn 0.910999 -0.36085 -0.199668 +v 1.47408 1.53152 -0.558215 +vn 0.915053 -0.361926 -0.178012 +v 1.5694 1.74219 -0.41077 +vn 0.958156 -0.25746 -0.125105 +v 1.59403 1.8572 -0.412903 +vn 0.980187 -0.149155 -0.130331 +v 1.53584 1.70065 -0.550545 +vn 0.942326 -0.288807 -0.169149 +v 1.53449 1.72563 -0.597566 +vn 0.944127 -0.2727 -0.185093 +v 1.56398 1.81124 -0.553374 +vn 0.966584 -0.187751 -0.174543 +v 1.5593 1.83254 -0.598873 +vn 0.968874 -0.157805 -0.190736 +v 1.59659 1.79007 -0.270788 +vn 0.971825 -0.218901 -0.0874032 +v 1.59477 1.76527 -0.222555 +vn 0.96871 -0.236333 -0.0758131 +v 1.61478 1.81618 -0.081721 +vn 0.979363 -0.197144 -0.0445311 +v 1.61101 1.78924 -0.033263 +vn 0.975851 -0.215626 -0.0349261 +v 1.61648 1.91022 -0.273224 +vn 0.991107 -0.0925736 -0.0955916 +v 1.61824 1.88899 -0.225823 +vn 0.988739 -0.126669 -0.0796877 +v 1.63295 1.94362 -0.084977 +vn 0.996132 -0.071689 -0.0508077 +v 1.63289 1.9198 -0.037203 +vn 0.993759 -0.104987 -0.0376955 +v 1.52679 1.5697 -0.309984 +vn 0.938011 -0.328681 -0.110017 +v 1.48645 1.45779 -0.302325 +vn 0.929694 -0.348463 -0.119341 +v 1.55514 1.6136 -0.169096 +vn 0.949211 -0.30622 -0.0723057 +v 1.54986 1.58687 -0.120824 +vn 0.947991 -0.311885 -0.0635728 +v 1.51542 1.49659 -0.1645 +vn 0.93877 -0.334883 -0.0810223 +v 1.51049 1.47226 -0.118372 +vn 0.939505 -0.334825 -0.0722638 +v 1.11295 2.90692 0.745317 +vn 0.469795 0.88078 0.0593173 +v 1.11025 2.90138 0.820888 +vn 0.467197 0.877985 0.104252 +v 1.11761 2.90743 0.591236 +vn 0.456779 0.889167 -0.0271044 +v 1.11547 2.90892 0.668526 +vn 0.455508 0.890037 0.01864 +v 1.10839 2.89199 0.894286 +vn 0.479277 0.865565 0.145226 +v 1.10761 2.87867 0.964785 +vn 0.479511 0.856091 0.192814 +v 1.10891 2.86114 1.03142 +vn 0.492989 0.837014 0.237423 +v 1.11237 2.83935 1.09365 +vn 0.498383 0.817047 0.28991 +v 1.23847 2.796 0.864692 +vn 0.721352 0.681068 0.12569 +v 1.19815 2.83962 0.837779 +vn 0.65124 0.749583 0.11837 +v 1.20422 2.84296 0.770826 +vn 0.660077 0.747664 0.0727811 +v 1.20741 2.84631 0.699464 +vn 0.655009 0.753643 0.0546327 +v 1.2106 2.84667 0.625677 +vn 0.649315 0.760493 0.00629891 +v 1.43838 1.84627 1.36551 +vn 0.891807 -0.115047 0.437543 +v 1.35268 1.94656 1.51113 +vn 0.757036 -0.04053 0.652115 +v 1.35064 1.8923 1.50767 +vn 0.751301 -0.100535 0.652258 +v 1.34967 2.05495 1.5115 +vn 0.74982 0.0782453 0.656999 +v 1.35215 2.00072 1.51277 +vn 0.753146 0.0185712 0.657591 +v 1.34781 1.83687 1.49981 +vn 0.746738 -0.15791 0.646101 +v 1.34027 1.78439 1.49318 +vn 0.731393 -0.214634 0.6473 +v 1.33346 1.73074 1.48046 +vn 0.721684 -0.2708 0.637055 +v 1.32181 1.67979 1.46954 +vn 0.697868 -0.327326 0.637054 +v 1.46974 1.84425 1.29155 +vn 0.929043 -0.105536 0.354601 +v 1.45807 1.7346 1.27665 +vn 0.916217 -0.186905 0.354419 +v 1.1263 2.46559 -0.971879 +vn 0.552825 0.813961 -0.178473 +v 1.08878 2.48659 -0.984855 +vn 0.517349 0.839826 -0.164447 +v 1.16979 2.43734 -0.955912 +vn 0.617993 0.760385 -0.199748 +v 1.21642 2.40101 -0.936472 +vn 0.683969 0.694423 -0.223526 +v 1.23111 2.41124 -0.856887 +vn 0.672909 0.708788 -0.211692 +v 1.26035 2.45623 -0.632308 +vn 0.627804 0.736881 -0.250736 +v 1.25357 2.43625 -0.712787 +vn 0.648884 0.723317 -0.236141 +v 1.0573 2.50336 -0.996606 +vn 0.540542 0.82693 -0.154922 +v 1.17608 2.66646 1.32035 +vn 0.584444 0.632283 0.508569 +v 1.1169 2.8137 1.15207 +vn 0.51339 0.788335 0.339057 +v 1.12859 2.78228 1.20171 +vn 0.529356 0.751258 0.3942 +v 1.20788 2.64173 1.31307 +vn 0.625295 0.609722 0.487078 +v 1.22842 2.59768 1.33856 +vn 0.652 0.561115 0.509947 +v 1.24509 2.55163 1.36624 +vn 0.657092 0.534653 0.531391 +v 1.33309 2.55605 1.19512 +vn 0.808204 0.507121 0.299391 +v 1.31731 2.59813 1.16342 +vn 0.797546 0.536934 0.274996 +v 1.37339 2.46295 1.23192 +vn 0.836247 0.445459 0.319776 +v 1.359 2.50805 1.2036 +vn 0.827994 0.475745 0.296803 +v 1.11447 2.83105 0.132827 +vn 0.402339 0.877097 -0.262343 +v 1.1154 2.85181 0.208681 +vn 0.399434 0.888118 -0.227373 +v 1.11153 2.77911 -0.024404 +vn 0.391284 0.861421 -0.323806 +v 1.11647 2.80868 0.065082 +vn 0.37999 0.879462 -0.286627 +v 1.11694 2.86927 0.284968 +vn 0.419367 0.887428 -0.19132 +v 1.11792 2.88363 0.361145 +vn 0.419204 0.895119 -0.151753 +v 1.11867 2.89475 0.437524 +vn 0.439106 0.891315 -0.112885 +v 1.1185 2.90273 0.514223 +vn 0.438758 0.895969 -0.0687811 +v 1.21572 2.8319 0.415917 +vn 0.627383 0.773766 -0.0876208 +v 1.26504 2.76837 0.28109 +vn 0.675371 0.725665 -0.131467 +v 1.26779 2.75223 0.212395 +vn 0.666903 0.727273 -0.162219 +v 1.27019 2.73228 0.14053 +vn 0.655111 0.731132 -0.190464 +v 1.27116 2.71103 0.06622 +vn 0.64211 0.734575 -0.219306 +v 1.07386 1.29047 1.37875 +vn 0.527918 -0.698804 0.482677 +v 1.0911 1.33432 1.4198 +vn 0.555944 -0.655276 0.511409 +v 1.12121 1.4331 1.49853 +vn 0.602425 -0.561209 0.567564 +v 1.15375 1.53626 1.55332 +vn 0.634638 -0.459893 0.621074 +v 0.674769 1.30095 1.73382 +vn 0.350224 -0.688673 0.63488 +v 0.760707 1.36731 1.74811 +vn 0.423839 -0.605114 0.673941 +v 0.730246 1.38813 1.78428 +vn 0.404342 -0.579244 0.707802 +v 0.784384 1.2228 1.56059 +vn 0.395535 -0.765321 0.507776 +v 0.416406 1.14003 1.62596 +vn 0.15678 -0.861685 0.482616 +v 0.458801 1.16251 1.64992 +vn 0.184366 -0.836757 0.515603 +v 0.571501 1.15682 1.59186 +vn 0.244379 -0.842008 0.480938 +v 0.612371 1.1815 1.61172 +vn 0.278869 -0.81422 0.509194 +v 0.408133 1.07463 1.49019 +vn 0.128464 -0.918892 0.373008 +v 0.448649 1.09288 1.51876 +vn 0.153098 -0.904761 0.397452 +v 0.558821 1.09051 1.46278 +vn 0.209195 -0.899994 0.382426 +v 0.59911 1.11063 1.48578 +vn 0.241386 -0.881981 0.404775 +v 0.481203 1.30209 1.81743 +vn 0.224925 -0.675655 0.702068 +v 0.536872 1.39164 1.87375 +vn 0.268149 -0.565717 0.779782 +v 0.498672 1.41918 1.90505 +vn 0.245797 -0.530249 0.811431 +v 0.642053 1.32069 1.77104 +vn 0.331008 -0.657777 0.676582 +v 0.698126 1.41077 1.81941 +vn 0.381884 -0.550937 0.742046 +v 0.66436 1.43541 1.85325 +vn 0.357481 -0.519652 0.775996 +v 0.06606 1.31244 1.89571 +vn 0.0260113 -0.653005 0.756907 +v 0 1.27192 1.85935 +vn -4.14605e-18 -0.706986 0.707227 +v 0.26852 1.31635 1.87979 +vn 0.117467 -0.651787 0.74925 +v 0.225444 1.34347 1.90821 +vn 0.0974044 -0.615345 0.782217 +v 0 1.35836 1.93351 +vn -1.57477e-06 -0.590506 0.807033 +v 0.296287 1.15109 1.67664 +vn 0.106993 -0.849283 0.516983 +v 0.289711 1.0822 1.54186 +vn 0.0866341 -0.916629 0.390238 +v 0.128335 1.14585 1.69204 +vn 0.0435479 -0.855513 0.515947 +v 0.167656 1.09351 1.5881 +vn 0.0493412 -0.907988 0.416082 +v 0.12536 1.07735 1.55546 +vn 0.0346199 -0.92152 0.386784 +v 1.20054 1.75959 1.62386 +vn 0.665571 -0.229362 0.710217 +v 1.181 1.6456 1.59475 +vn 0.654729 -0.348671 0.670641 +v 1.10417 2.04478 1.73656 +vn 0.630131 0.0772098 0.772641 +v 1.21177 1.87685 1.64064 +vn 0.669121 -0.104537 0.735764 +v 1.21711 1.9956 1.64246 +vn 0.666883 0.0214444 0.744854 +v 1.19387 2.04604 1.65979 +vn 0.659162 0.077674 0.747979 +v 0.928212 1.79932 1.85421 +vn 0.545663 -0.156985 0.823169 +v 0.783928 1.77878 1.93503 +vn 0.447403 -0.164753 0.879026 +v 0.967389 1.90705 1.84161 +vn 0.561534 -0.0535434 0.825719 +v 0.824199 2.0473 1.92736 +vn 0.475838 0.0776401 0.876099 +v 0.785779 2.01166 1.9499 +vn 0.447446 0.0442215 0.893217 +v 0.884543 1.69185 1.85529 +vn 0.51846 -0.258766 0.815009 +v 0.915416 1.66328 1.82521 +vn 0.539815 -0.290262 0.790157 +v 0.868391 1.55866 1.81069 +vn 0.511854 -0.400065 0.760233 +v 0.732942 1.67447 1.93371 +vn 0.408184 -0.262588 0.874319 +v 0.769992 1.64381 1.90543 +vn 0.438579 -0.298184 0.847782 +v 0.718477 1.5367 1.88619 +vn 0.400687 -0.407046 0.820831 +v 0.752529 1.5092 1.85423 +vn 0.426691 -0.439604 0.790369 +v 0.495696 1.58818 1.99117 +vn 0.248232 -0.336508 0.908374 +v 0.524256 1.55198 1.96857 +vn 0.262263 -0.382032 0.886154 +v 0.648786 1.5975 1.94369 +vn 0.348939 -0.341428 0.872736 +v 0.6828 1.56604 1.91641 +vn 0.373631 -0.374167 0.848763 +v 0.437476 1.86538 2.06729 +vn 0.215216 -0.0889684 0.972505 +v 0.438173 2.03166 2.07035 +vn 0.219466 0.0516217 0.974253 +v 0.57436 1.82054 2.0259 +vn 0.296622 -0.127676 0.946422 +v 0.618642 1.86017 2.01598 +vn 0.325473 -0.0924239 0.941023 +v 0.575459 1.98251 2.03524 +vn 0.299452 0.0137482 0.954012 +v 0.619254 2.02027 2.01954 +vn 0.328344 0.0479847 0.943339 +v 0.295282 1.91251 2.09637 +vn 0.140931 -0.0517298 0.988667 +v 0.246462 1.87163 2.09984 +vn 0.115821 -0.0859446 0.989545 +v 0.049655 1.88753 2.11517 +vn 0.0250313 -0.0744611 0.99691 +v 0 1.85593 2.11293 +vn 2.55533e-18 -0.100386 0.994949 +v 0.049597 1.84444 2.11128 +vn 0.0245458 -0.109918 0.993638 +v 0.29499 2.08217 2.09323 +vn 0.144838 0.0896732 0.985384 +v 0.246749 2.04233 2.10257 +vn 0.119301 0.0545801 0.991357 +v 0.049609 2.06028 2.11602 +vn 0.0260337 0.0662802 0.997461 +v 0 2.0288 2.11825 +vn 1.83967e-06 0.0397613 0.999209 +v 0.049667 2.01721 2.1182 +vn 0.0255493 0.0298567 0.999228 +v 0.349816 1.62439 2.03613 +vn 0.16526 -0.300033 0.939505 +v 0.1926 1.49234 2.00498 +vn 0.082473 -0.432869 0.897676 +v 0.238709 1.46623 1.98692 +vn 0.109466 -0.462279 0.879952 +v 0.196124 1.66347 2.0681 +vn 0.0906558 -0.264712 0.960057 +v 0.099984 1.66797 2.07624 +vn 0.0511538 -0.259856 0.964292 +v 0.147857 1.6199 2.05925 +vn 0.0698022 -0.29718 0.952267 +v 0.118572 1.43762 1.98193 +vn 0.0523953 -0.492953 0.868477 +v 1.00476 2.54597 1.60864 +vn 0.575151 0.495409 0.650977 +v 1.08159 2.41622 1.62829 +vn 0.607988 0.404215 0.683345 +v 0.892761 2.42692 1.77261 +vn 0.523586 0.396136 0.754277 +v 0.783455 2.48063 1.81397 +vn 0.459588 0.425526 0.779555 +v 0.751277 2.45343 1.84646 +vn 0.436927 0.403386 0.803974 +v 0.893113 2.57727 1.67757 +vn 0.526345 0.506049 0.683283 +v 0.762653 2.61134 1.74452 +vn 0.458946 0.520305 0.720174 +v 0.731103 2.58699 1.7804 +vn 0.434381 0.497064 0.75116 +v 0.984777 2.21523 1.7943 +vn 0.571512 0.234251 0.786448 +v 0.881928 2.26112 1.84969 +vn 0.513303 0.265426 0.81613 +v 0.849705 2.22955 1.87896 +vn 0.493171 0.238111 0.836711 +v 0.894606 2.11727 1.87746 +vn 0.520343 0.141069 0.842225 +v 0.861081 2.08203 1.9028 +vn 0.501135 0.108083 0.858593 +v 0.479386 2.23177 2.03151 +vn 0.250015 0.220536 0.942792 +v 0.522695 2.26663 2.01053 +vn 0.27672 0.250205 0.927806 +v 0.655426 2.21354 1.97827 +vn 0.358621 0.215577 0.90825 +v 0.694601 2.24713 1.95342 +vn 0.386607 0.244686 0.889193 +v 0.484092 2.06985 2.05661 +vn 0.246906 0.0863498 0.965185 +v 0.528898 2.10715 2.04041 +vn 0.274311 0.12068 0.954039 +v 0.661707 2.05728 2.00143 +vn 0.358089 0.0823729 0.930047 +v 0.70267 2.09347 1.98097 +vn 0.387486 0.11617 0.914527 +v 0.418488 2.5049 1.95163 +vn 0.230365 0.411917 0.881622 +v 0.407141 2.645 1.88013 +vn 0.238203 0.499559 0.832887 +v 0.55308 2.45068 1.93528 +vn 0.305637 0.385982 0.870405 +v 0.59192 2.48041 1.90712 +vn 0.332116 0.409776 0.849578 +v 0.538754 2.5917 1.86817 +vn 0.309991 0.479644 0.820882 +v 0.575952 2.61798 1.83739 +vn 0.336243 0.501177 0.797347 +v 0.279953 2.55597 1.95745 +vn 0.156447 0.433982 0.887234 +v 0.235314 2.52347 1.97995 +vn 0.129797 0.411617 0.902066 +v 0.093626 2.57142 1.97199 +vn 0.0546667 0.434442 0.89904 +v 0.047084 2.54364 1.98721 +vn 0.0278811 0.417206 0.908384 +v 0.272057 2.69416 1.88289 +vn 0.165347 0.514903 0.841151 +v 0.228873 2.66493 1.90794 +vn 0.137055 0.494931 0.858055 +v 0.090932 2.70996 1.89742 +vn 0.0590067 0.511371 0.857332 +v 0.045757 2.6847 1.91453 +vn 0.0299326 0.496722 0.867393 +v 0.338372 2.28447 2.04975 +vn 0.173979 0.254064 0.951411 +v 0.34251 2.12106 2.08135 +vn 0.170597 0.124484 0.977446 +v 0.193847 2.33468 2.05629 +vn 0.100245 0.284693 0.953363 +v 0.146161 2.29741 2.07118 +vn 0.0758171 0.257697 0.963247 +v 0.196726 2.17131 2.09391 +vn 0.0979782 0.160698 0.982129 +v 0.100512 2.17815 2.10013 +vn 0.0558312 0.16402 0.984876 +v 0.148099 2.13194 2.10388 +vn 0.0741668 0.127917 0.989008 +v 1.05547 2.71211 1.39539 +vn 0.565858 0.64613 0.512172 +v 0.993102 2.73381 1.4368 +vn 0.559946 0.647037 0.517497 +v 1.01786 2.83826 1.24229 +vn 0.533393 0.758471 0.374453 +v 0.801248 2.89786 1.41931 +vn 0.5245 0.702164 0.481524 +v 0.636832 2.92962 1.53121 +vn 0.461128 0.671467 0.580081 +v 0.657933 3.04477 1.36561 +vn 0.568849 0.660315 0.490301 +v 0.43334 2.79645 1.76731 +vn 0.28087 0.590544 0.756551 +v 0.47035 2.81878 1.73466 +vn 0.309337 0.607278 0.731795 +v 0.592819 2.76545 1.72155 +vn 0.370801 0.598227 0.710374 +v 0.625549 2.78593 1.68566 +vn 0.395775 0.614747 0.682237 +v 0.44705 2.67182 1.85128 +vn 0.265354 0.520682 0.811466 +v 0.485605 2.69718 1.82099 +vn 0.292576 0.541521 0.788134 +v 0.611605 2.6429 1.80529 +vn 0.361802 0.522234 0.772251 +v 0.64565 2.66647 1.77196 +vn 0.386662 0.542356 0.745884 +v 0.477796 3.064 1.50047 +vn 0.415135 0.64223 0.644363 +v 0.436439 3.09988 1.49113 +vn 0.397673 0.634212 0.663047 +v 0.626522 3.03796 1.40821 +vn 0.528518 0.661867 0.531601 +v 0.587142 3.07402 1.40326 +vn 0.527409 0.645979 0.551861 +v 0.207345 3.02385 1.65196 +vn 0.186773 0.628882 0.754734 +v 0.082056 3.06003 1.64436 +vn 0.0718091 0.627834 0.775027 +v 0 3.02693 1.67495 +vn -1.10519e-18 0.625031 0.7806 +v 0 3.13462 1.58806 +vn 0 0.627123 0.77892 +v 0.304351 2.84473 1.77154 +vn 0.212236 0.594785 0.775363 +v 0.314145 2.72185 1.85632 +vn 0.194294 0.535056 0.822171 +v 0.173411 2.88729 1.76816 +vn 0.132252 0.596485 0.791653 +v 0.131145 2.86131 1.79348 +vn 0.0989896 0.584103 0.805621 +v 0.179157 2.76649 1.85275 +vn 0.118447 0.545312 0.829822 +v 0.135449 2.73792 1.87646 +vn 0.0886916 0.528206 0.844471 +v 0.54267 4.12419 -0.320711 +vn 0.554835 -0.48692 -0.674586 +v 0.534633 4.09214 -0.30329 +vn 0.551635 -0.509885 -0.660087 +v 0.511445 4.01178 -0.254885 +vn 0.533249 -0.5756 -0.619943 +v 0.501913 3.98549 -0.237878 +vn 0.526449 -0.595903 -0.606425 +v 0.738357 4.17933 -0.158092 +vn 0.714512 -0.42839 -0.553132 +v 0.729231 4.14594 -0.142705 +vn 0.707042 -0.457151 -0.53954 +v 0.700734 4.06122 -0.099999 +vn 0.676835 -0.534687 -0.505968 +v 0.688669 4.03308 -0.085292 +vn 0.665905 -0.557989 -0.495195 +v 0.307133 4.05301 -0.420373 +vn 0.353358 -0.540585 -0.763483 +v 0.312911 4.08406 -0.439266 +vn 0.353212 -0.521831 -0.776488 +v 0.061572 4.02739 -0.472159 +vn 0.0813933 -0.555012 -0.827851 +v 0 4.04729 -0.488182 +vn 1.10628e-18 -0.535339 -0.844638 +v 0.063033 4.05487 -0.489971 +vn 0.081732 -0.529904 -0.84411 +v 0.286652 3.95081 -0.349712 +vn 0.341469 -0.617532 -0.708557 +v 0.292464 3.97577 -0.368239 +vn 0.344705 -0.598862 -0.722871 +v 0.056959 3.92768 -0.398237 +vn 0.0805404 -0.633013 -0.76994 +v 0 3.94478 -0.415029 +vn -9.95382e-18 -0.620046 -0.784566 +v 0.058256 3.95189 -0.417632 +vn 0.0807476 -0.61503 -0.784358 +v 0.320666 4.21796 -0.510185 +vn 0.363673 -0.389974 -0.845968 +v 0.321517 4.18481 -0.494079 +vn 0.361156 -0.413624 -0.835752 +v 0.316425 4.3364 -0.558323 +vn 0.362562 -0.285837 -0.887043 +v 0.318105 4.30601 -0.547405 +vn 0.362798 -0.313143 -0.877678 +v 0 4.18209 -0.563211 +vn -1.01972e-06 -0.434761 -0.900546 +v 0.06519 4.2058 -0.571319 +vn 0.0817549 -0.410962 -0.907979 +v 0.065792 4.17559 -0.557125 +vn 0.0819748 -0.439453 -0.894517 +v 0 4.30236 -0.612714 +vn 1.10621e-18 -0.328199 -0.944609 +v 0.063973 4.32604 -0.617847 +vn 0.0823703 -0.307373 -0.948017 +v 0.06441 4.29514 -0.607399 +vn 0.082238 -0.333525 -0.939147 +v 0.670353 4.23358 -0.272846 +vn 0.671278 -0.363226 -0.646106 +v 0.659118 4.25347 -0.294814 +vn 0.660237 -0.343652 -0.667826 +v 0.865255 4.33722 -0.064229 +vn 0.855362 -0.217883 -0.469982 +v 0.839609 4.29702 -0.088714 +vn 0.824341 -0.268945 -0.498127 +v 0.831413 4.31659 -0.111801 +vn 0.816413 -0.252839 -0.519175 +v 0.656714 4.34379 -0.337171 +vn 0.668132 -0.257321 -0.69813 +v 0.654599 4.37289 -0.349323 +vn 0.66873 -0.226887 -0.708042 +v 0.858335 4.45209 -0.115533 +vn 0.860737 -0.103107 -0.498499 +v 0.82783 4.40653 -0.15335 +vn 0.825832 -0.164149 -0.539496 +v 0.824991 4.43511 -0.165622 +vn 0.826284 -0.132787 -0.547378 +v 0.289949 3.67728 1.27141 +vn 0.289501 -0.159633 0.943772 +v 0.289484 3.59027 1.26825 +vn 0.317627 0.0758889 0.945174 +v 0.150546 3.5883 1.3026 +vn 0.159039 0.124367 0.979408 +v 0.300072 3.76292 1.29406 +vn 0.262933 -0.373267 0.889684 +v 0.55348 3.74854 1.16127 +vn 0.568897 -0.362006 0.73845 +v 0.532362 3.64327 1.14001 +vn 0.616934 -0.16447 0.769637 +v 0.31142 3.83845 1.3313 +vn 0.244992 -0.518249 0.819388 +v 0.320767 3.90438 1.37626 +vn 0.237034 -0.603468 0.761341 +v 0.578895 3.84521 1.19976 +vn 0.540586 -0.48472 0.687614 +v 0.55507 3.95079 1.30031 +vn 0.472378 -0.565402 0.676151 +v 0.828467 3.81204 0.720363 +vn 0.912563 -0.404024 0.0631868 +v 0.717287 3.60055 0.871512 +vn 0.913083 -0.23403 0.333929 +v 0.744809 3.59611 0.743806 +vn 0.959464 -0.266244 0.0924287 +v 0.890347 4.12466 1.01247 +vn 0.861554 -0.336741 0.379909 +v 0.965898 4.15803 0.797644 +vn 0.936303 -0.311649 0.161902 +v 0.961637 4.20278 0.882769 +vn 0.931912 -0.26598 0.246567 +v 0.707308 3.92657 1.13783 +vn 0.678867 -0.480303 0.555382 +v 0.703762 3.58652 0.479332 +vn 0.907783 -0.254697 -0.333255 +v 0.740205 3.59241 0.612048 +vn 0.952114 -0.27213 -0.139375 +v 0.639799 3.5796 0.347942 +vn 0.847924 -0.223674 -0.480619 +v 0.552908 3.57292 0.21991 +vn 0.784693 -0.18534 -0.591528 +v 0.862418 3.9611 0.398029 +vn 0.846288 -0.487262 -0.215345 +v 0.937292 4.10761 0.382926 +vn 0.889878 -0.425283 -0.165083 +v 0.781703 3.92268 0.235519 +vn 0.763466 -0.554873 -0.330509 +v 0.864952 4.03349 0.25663 +vn 0.822683 -0.503159 -0.26462 +v 0.841007 4.02071 0.211149 +vn 0.795995 -0.526022 -0.299486 +v 0.858355 4.05309 0.202045 +vn 0.810844 -0.504353 -0.296918 +v 0.919172 4.02554 0.522344 +vn 0.898066 -0.427548 -0.10335 +v 0.908345 3.99422 0.562085 +vn 0.900093 -0.427822 -0.0824737 +v 0.936591 4.0515 0.690067 +vn 0.922367 -0.383309 0.0480904 +v 0.917975 4.01301 0.723825 +vn 0.916946 -0.391972 0.0746214 +v 0.9828 4.1778 0.519372 +vn 0.944643 -0.32124 -0.0667458 +v 0.976004 4.15096 0.567372 +vn 0.939348 -0.340805 -0.0384206 +v 0.996018 4.22239 0.712575 +vn 0.96339 -0.255215 0.0821216 +v 0.983034 4.19215 0.755375 +vn 0.949689 -0.291161 0.115392 +v 0.950913 4.82767 0.37538 +vn 0.968326 0.242853 -0.0580356 +v 0.944783 4.847 0.358227 +vn 0.962907 0.258779 -0.0764404 +v 0.965137 4.78097 0.488392 +vn 0.971664 0.236291 0.00596113 +v 0.982304 4.70525 0.441343 +vn 0.975036 0.2193 -0.0348322 +v 0.968589 4.7641 0.432777 +vn 0.973819 0.225967 -0.0248079 +v 0.924202 4.92396 0.576697 +vn 0.956295 0.285245 0.0642993 +v 0.931456 4.85481 0.693666 +vn 0.952643 0.271388 0.137183 +v 0.954417 4.78198 0.667635 +vn 0.959004 0.264184 0.102553 +v 0.942227 4.83753 0.643678 +vn 0.961425 0.256753 0.0986905 +v 0.897419 4.77933 0.035553 +vn 0.919864 0.227286 -0.319673 +v 0.907644 4.75411 0.047857 +vn 0.927597 0.210059 -0.308932 +v 0.799347 4.67925 -0.204578 +vn 0.825414 0.11856 -0.551938 +v 0.817022 4.72121 -0.165451 +vn 0.845543 0.163772 -0.508169 +v 0.827864 4.69365 -0.155703 +vn 0.853185 0.141699 -0.501993 +v 0.934766 4.677 0.08653 +vn 0.947471 0.156947 -0.278687 +v 0.942676 4.65075 0.099565 +vn 0.953024 0.138716 -0.269264 +v 0.835705 4.56588 -0.162663 +vn 0.849427 0.0156045 -0.527475 +v 0.856424 4.61019 -0.123499 +vn 0.873306 0.069415 -0.482201 +v 0.86457 4.58216 -0.112077 +vn 0.878901 0.0437922 -0.47499 +v 0.852213 4.87821 -0.008862 +vn 0.886134 0.294511 -0.357812 +v 0.864147 4.85379 0.001332 +vn 0.895013 0.276827 -0.34974 +v 0.801537 4.97425 -0.042097 +vn 0.849065 0.358264 -0.388247 +v 0.75374 4.79077 -0.237512 +vn 0.794316 0.210033 -0.570043 +v 0.769449 4.82973 -0.198246 +vn 0.811545 0.248034 -0.529031 +v 0.781912 4.8029 -0.191183 +vn 0.820469 0.227691 -0.524392 +v 0.703441 4.89895 -0.257654 +vn 0.75827 0.296866 -0.580429 +v 0.718006 4.93466 -0.217845 +vn 0.773047 0.329641 -0.541973 +v 0.731015 4.90884 -0.214476 +vn 0.782931 0.308766 -0.540077 +v 0.92814 4.87582 0.275956 +vn 0.951116 0.281982 -0.125955 +v 0.905632 4.99133 0.494269 +vn 0.939969 0.341206 0.00610179 +v 0.896235 4.98376 0.301182 +vn 0.93115 0.341693 -0.127303 +v 0.775113 3.17701 0.539606 +vn 0.824141 0.558754 -0.0926583 +v 0.605253 3.15345 -0.061583 +vn 0.620122 0.718456 -0.315072 +v 0.53042 3.20308 -0.092723 +vn 0.603575 0.707328 -0.367946 +v 0.554857 3.20581 -0.045341 +vn 0.631754 0.690805 -0.351674 +v 0.592403 3.16648 1.29244 +vn 0.63197 0.57658 0.517851 +v 0.735586 3.26522 0.801231 +vn 0.938428 0.327411 0.110251 +v 0.707218 3.25255 0.961493 +vn 0.89066 0.370245 0.263901 +v 0.765925 3.20233 0.763132 +vn 0.893254 0.446421 0.0529733 +v 0.712204 3.43249 0.793139 +vn 0.98842 -0.0266354 0.149385 +v 0.901223 2.49463 -1.53787 +vn 0.858881 0.407194 -0.310672 +v 0.789381 2.75199 -1.4544 +vn 0.849113 0.504238 -0.157326 +v 0.811797 2.70848 -1.46863 +vn 0.853603 0.483626 -0.193566 +v 0.916469 2.39673 -1.60917 +vn 0.853357 0.361511 -0.375622 +v 0.934776 2.29141 -1.65922 +vn 0.8437 0.317064 -0.433174 +v 0.684703 2.72587 -1.82714 +vn 0.85733 0.347418 -0.379849 +v 0.685695 2.69411 -1.85257 +vn 0.852444 0.330298 -0.405268 +v 0.556094 2.89872 -1.96466 +vn 0.859834 0.308182 -0.407074 +v 0.582658 2.88818 -1.91433 +vn 0.866988 0.331764 -0.37184 +v 0.581794 2.85642 -1.94301 +vn 0.859913 0.312822 -0.403351 +v 0.68851 2.59172 -1.91833 +vn 0.827891 0.282835 -0.484356 +v 0.688163 2.55153 -1.94087 +vn 0.812678 0.259485 -0.521749 +v 0.538281 2.76659 -2.06903 +vn 0.797375 0.225996 -0.55957 +v 0.569681 2.7595 -2.02464 +vn 0.822519 0.244483 -0.513508 +v 0.566688 2.71422 -2.0491 +vn 0.802927 0.224321 -0.552258 +v 0.677755 2.8391 -1.71376 +vn 0.867096 0.415923 -0.274141 +v 0.67985 2.8134 -1.74401 +vn 0.866941 0.397226 -0.30104 +v 0.662563 2.92699 -1.58253 +vn 0.845566 0.520076 -0.12058 +v 0.669911 2.9048 -1.61581 +vn 0.858706 0.483371 -0.170224 +v 0.554202 3.02006 -1.84433 +vn 0.884029 0.384994 -0.26509 +v 0.57679 3.0033 -1.79224 +vn 0.878959 0.412218 -0.239805 +v 0.579572 2.9769 -1.82409 +vn 0.879729 0.38884 -0.273643 +v 0.531413 3.1196 -1.70919 +vn 0.859015 0.509276 -0.0522489 +v 0.546987 3.09888 -1.65561 +vn 0.833132 0.552858 -0.015489 +v 0.560101 3.07465 -1.69084 +vn 0.857803 0.506454 -0.0876244 +v 0.530921 3.04384 -1.8876 +vn 0.88681 0.360445 -0.289218 +v 0.531061 3.06493 -1.85821 +vn 0.889886 0.383028 -0.247774 +v 0.515607 3.13969 -1.76164 +vn 0.881484 0.46054 -0.104346 +v 0.505544 3.16343 -1.7287 +vn 0.867331 0.496881 -0.0290832 +v 0.436919 3.12682 -2.05061 +vn 0.862223 0.294395 -0.412193 +v 0.440385 3.14832 -2.02593 +vn 0.87327 0.316989 -0.370024 +v 0.404301 3.04238 -2.14754 +vn 0.76652 0.215139 -0.605114 +v 0.415101 3.06255 -2.12481 +vn 0.799179 0.238603 -0.551708 +v 0.528724 2.92082 -2.00561 +vn 0.853926 0.28908 -0.432717 +v 0.531728 2.95076 -1.97737 +vn 0.865178 0.308313 -0.395486 +v 0.505382 2.77393 -2.11003 +vn 0.750667 0.202134 -0.628999 +v 0.510731 2.82172 -2.08608 +vn 0.786653 0.21907 -0.577222 +v 0.30952 3.49378 -2.00518 +vn 0.87126 0.417082 -0.258744 +v 0.370459 3.25877 -2.09108 +vn 0.842196 0.307646 -0.442786 +v 0.326487 3.30613 -2.13619 +vn 0.786754 0.311457 -0.532928 +v 0.29933 3.42551 -2.10268 +vn 0.821125 0.344531 -0.45503 +v 0.374501 3.40142 -1.89369 +vn 0.899739 0.427238 -0.0890896 +v 0.333501 3.46263 -1.80507 +vn 0.784949 0.546474 0.291926 +v 0.274063 3.58812 -1.93783 +vn 0.840003 0.534837 -0.0913423 +v 0.788064 5.20672 0.335995 +vn 0.821553 0.563327 -0.0878249 +v 0.786602 5.19418 0.592467 +vn 0.778165 0.608274 0.156404 +v 0.638813 5.35858 0.51637 +vn 0.614716 0.777305 0.133871 +v 0.724636 5.28368 0.308325 +vn 0.744757 0.659765 -0.10024 +v 0.639104 5.36605 0.298741 +vn 0.649152 0.755441 -0.0889425 +v 0.611836 5.39184 0.38261 +vn 0.61568 0.787835 0.0159286 +v 0.486369 5.25907 -0.212444 +vn 0.535705 0.667293 -0.517437 +v 0.445387 5.26834 -0.240951 +vn 0.491146 0.681879 -0.542048 +v 0.909039 2.0837 -1.79515 +vn 0.783545 0.115902 -0.610429 +v 0.953579 2.18707 -1.69155 +vn 0.831234 0.262886 -0.489837 +v 0.92143 1.97736 -1.79061 +vn 0.749163 0.00605789 -0.662358 +v 0.927813 1.87402 -1.77597 +vn 0.713332 -0.106003 -0.692764 +v 0.583866 2.16267 -2.09862 +vn 0.517514 -0.0852803 -0.851415 +v 0.59591 2.01234 -2.06899 +vn 0.480823 -0.16961 -0.860257 +v 0.676525 2.42748 -2.00427 +vn 0.757279 0.165954 -0.631654 +v 0.565381 2.33014 -2.11865 +vn 0.570316 0.00549835 -0.821407 +v 0.568598 2.55899 -2.09476 +vn 0.705035 0.144831 -0.694226 +v 0.60092 2.52958 -2.06666 +vn 0.74287 0.150255 -0.652355 +v 0.574709 2.50933 -2.09772 +vn 0.684898 0.0990424 -0.721876 +v 0.399306 2.33278 -2.20492 +vn 0.348175 -0.0895043 -0.933147 +v 0.496438 2.35492 -2.16193 +vn 0.488308 -0.0373233 -0.871873 +v 0.348578 2.48023 -2.23374 +vn 0.332137 -0.0513997 -0.94183 +v 0.341828 2.53318 -2.23873 +vn 0.340218 -0.0344642 -0.939715 +v 0.376039 2.52866 -2.2251 +vn 0.388203 -0.018521 -0.921388 +v 0.48405 2.50959 -2.16858 +vn 0.545329 0.0483605 -0.836826 +v 0.513268 2.49324 -2.14987 +vn 0.57986 0.0474232 -0.813335 +v 0.38727 1.97198 -2.14437 +vn 0.271392 -0.237668 -0.932663 +v 0.187519 2.26986 -2.24675 +vn 0.126784 -0.156808 -0.979458 +v 0 2.26472 -2.25714 +vn 0 -0.165282 -0.986246 +v 0.230833 2.14084 -2.21708 +vn 0.150145 -0.197993 -0.968636 +v 0.193935 2.10275 -2.2141 +vn 0.120591 -0.213416 -0.96949 +v 0.077048 2.14919 -2.23379 +vn 0.04023 -0.202874 -0.978378 +v 0 2.09786 -2.22431 +vn 3.57743e-06 -0.218967 -0.975732 +v 0.144131 2.40651 -2.27065 +vn 0.103037 -0.114897 -0.988019 +v 0.17741 2.45118 -2.27148 +vn 0.13526 -0.0981148 -0.98594 +v 0.162698 2.65321 -2.28785 +vn 0.141437 -0.0432101 -0.989004 +v 0.195516 2.65117 -2.28256 +vn 0.178326 -0.0392738 -0.983187 +v 0 2.44451 -2.28189 +vn 2.92997e-06 -0.109074 -0.994034 +v 0.031681 2.67344 -2.29916 +vn 0.0228144 -0.0449147 -0.99873 +v 0.05877 2.65919 -2.29756 +vn 0.0437221 -0.0503092 -0.997776 +v 1.01802 4.37505 0.435446 +vn 0.992125 -0.0824826 -0.0942541 +v 1.01491 4.33898 0.44432 +vn 0.987419 -0.128015 -0.0928267 +v 0.996515 4.23698 0.463389 +vn 0.960941 -0.259821 -0.0953141 +v 0.987286 4.2046 0.467876 +vn 0.946566 -0.308666 -0.0934737 +v 1.02477 4.39803 0.636722 +vn 0.999133 -0.0223212 0.0351291 +v 1.014 4.28891 0.658907 +vn 0.984623 -0.1705 0.03804 +v 1.00596 4.25036 0.662078 +vn 0.974081 -0.222909 0.038449 +v 0.96858 4.27475 0.24292 +vn 0.940657 -0.245165 -0.234647 +v 0.974927 4.31165 0.23325 +vn 0.950321 -0.197687 -0.240438 +v 0.876255 4.20864 0.044089 +vn 0.843636 -0.366887 -0.39201 +v 0.884834 4.24366 0.031377 +vn 0.854597 -0.32989 -0.401045 +v 0.931373 4.14594 0.277101 +vn 0.888099 -0.397802 -0.23029 +v 0.943327 4.17873 0.269 +vn 0.903063 -0.362274 -0.230728 +v 0.834136 4.08826 0.090716 +vn 0.788848 -0.49182 -0.368553 +v 0.847028 4.1186 0.079054 +vn 0.803559 -0.46308 -0.373964 +v 0.977128 4.45712 0.184801 +vn 0.96982 -0.024999 -0.242537 +v 0.97929 4.42334 0.198393 +vn 0.967527 -0.0516326 -0.247437 +v 0.962056 4.56999 0.137926 +vn 0.965143 0.0776787 -0.249928 +v 0.967142 4.54233 0.150083 +vn 0.967692 0.0551943 -0.246019 +v 0.894745 4.38437 -0.026932 +vn 0.889279 -0.161708 -0.427824 +v 0.895649 4.35117 -0.011563 +vn 0.884232 -0.189359 -0.426939 +v 0.883367 4.49774 -0.076432 +vn 0.890141 -0.041604 -0.453783 +v 0.887793 4.46948 -0.064313 +vn 0.891876 -0.0712587 -0.446631 +v 1.01266 4.565 0.502866 +vn 0.9871 0.157888 -0.0265668 +v 1.01751 4.53353 0.508955 +vn 0.991246 0.129077 -0.0277548 +v 0.993248 4.64472 0.650266 +vn 0.969568 0.23459 0.0700452 +v 0.994059 4.62533 0.696442 +vn 0.969443 0.225686 0.0961512 +v 1.00696 4.57961 0.657746 +vn 0.980181 0.183672 0.0742261 +v 0.987152 4.68916 0.4878 +vn 0.973814 0.227078 -0.0110045 +v 0.993481 4.66072 0.481421 +vn 0.977021 0.212159 -0.0204411 +v 0.967875 4.72283 0.700494 +vn 0.955546 0.273669 0.109717 +v 0.923931 1.67241 -1.71806 +vn 0.657046 -0.314694 -0.685024 +v 0.926745 1.77317 -1.75382 +vn 0.681183 -0.212239 -0.700674 +v 0.815837 1.47978 -1.69845 +vn 0.574403 -0.50738 -0.642361 +v 0.851361 1.48719 -1.67158 +vn 0.596246 -0.501517 -0.626874 +v 0.898752 1.5364 -1.66284 +vn 0.61848 -0.457683 -0.638756 +v 0.592315 1.60792 -1.93632 +vn 0.425879 -0.404441 -0.809354 +v 0.581384 1.48896 -1.87389 +vn 0.412592 -0.501684 -0.760316 +v 0.599484 1.73573 -1.98831 +vn 0.439401 -0.318632 -0.839881 +v 0.601036 1.87106 -2.03208 +vn 0.456507 -0.242616 -0.856002 +v 0.424335 1.70695 -2.0498 +vn 0.283159 -0.350028 -0.892917 +v 0.389233 1.81707 -2.09935 +vn 0.255727 -0.297998 -0.919674 +v 0.426201 1.85179 -2.0994 +vn 0.289364 -0.279046 -0.915643 +v 0.418365 1.57074 -1.99091 +vn 0.278921 -0.435615 -0.855829 +v 0.409202 1.44585 -1.9209 +vn 0.274276 -0.538911 -0.79646 +v 0.19606 1.63814 -2.07127 +vn 0.119006 -0.389657 -0.913239 +v 0 1.62912 -2.07965 +vn -7.18334e-18 -0.393672 -0.919251 +v 0.231626 1.53363 -2.01669 +vn 0.144527 -0.460165 -0.875991 +v 0.192551 1.49973 -2.00423 +vn 0.119538 -0.485166 -0.866213 +v 0.077992 1.53269 -2.03264 +vn 0.0399894 -0.458298 -0.887898 +v 0 1.48949 -2.01129 +vn -4.97446e-18 -0.491268 -0.871008 +v 0.158373 1.74999 -2.11895 +vn 0.0934305 -0.331992 -0.938644 +v 0.197763 1.78715 -2.12729 +vn 0.118243 -0.315496 -0.941531 +v 0.158347 1.90523 -2.16807 +vn 0.0928956 -0.272931 -0.957538 +v 0.197205 1.94301 -2.1743 +vn 0.118322 -0.260438 -0.958213 +v 0 1.77971 -2.13661 +vn 4.4197e-18 -0.318796 -0.947823 +v 0 1.93714 -2.18419 +vn 3.46297e-06 -0.264053 -0.964508 +v 0.078865 1.98734 -2.19587 +vn 0.0397571 -0.250224 -0.967371 +v 0.749602 1.30026 -1.57448 +vn 0.506097 -0.688028 -0.520081 +v 0.822538 1.26903 -1.45043 +vn 0.523771 -0.719417 -0.456184 +v 0.888345 1.29957 -1.4203 +vn 0.541916 -0.69993 -0.465215 +v 0.889457 1.26899 -1.37113 +vn 0.527886 -0.723079 -0.445525 +v 0.533108 1.20319 -1.61758 +vn 0.343849 -0.788465 -0.509991 +v 0.528994 1.13614 -1.50238 +vn 0.314281 -0.852344 -0.418016 +v 0 1.16869 -1.72231 +vn 1.69226e-06 -0.826241 -0.563317 +v 0 1.09713 -1.59749 +vn -3.91e-06 -0.902231 -0.431252 +v 0.143303 1.24394 -1.80903 +vn 0.0918605 -0.74651 -0.659003 +v 0.182124 1.26838 -1.82979 +vn 0.114032 -0.717214 -0.687459 +v 0.149489 1.34605 -1.90598 +vn 0.0928164 -0.630979 -0.770227 +v 0.187696 1.37564 -1.92416 +vn 0.117531 -0.600725 -0.79077 +v 0 1.25792 -1.8331 +vn 6.63454e-18 -0.72591 -0.687789 +v 0 1.3649 -1.9295 +vn 6.9109e-18 -0.609401 -0.792862 +v 0.076218 1.40315 -1.95544 +vn 0.0393466 -0.571041 -0.819978 +v 0.47165 3.72198 0.027277 +vn 0.603402 -0.547704 -0.579591 +v 0 3.67349 -0.184815 +vn -6.64257e-18 -0.503041 -0.864263 +v 0.26054 3.55456 -0.061819 +vn 0.550647 0.0121198 -0.83465 +v 0.32611 3.79433 -0.171291 +vn 0.422417 -0.652727 -0.628897 +v 0.337272 3.81822 -0.188839 +vn 0.422096 -0.658467 -0.623102 +v 0.369436 3.89108 -0.244353 +vn 0.427733 -0.6526 -0.625426 +v 0.379279 3.91587 -0.263141 +vn 0.431697 -0.641894 -0.633727 +v 0.14541 3.80185 -0.266173 +vn 0.211833 -0.681551 -0.700439 +v 0.15955 3.86837 -0.325111 +vn 0.216385 -0.665908 -0.713964 +v 0.164087 3.89182 -0.345348 +vn 0.217847 -0.656416 -0.722261 +v 0.513685 3.84724 -0.069244 +vn 0.560064 -0.64058 -0.525343 +v 0.497419 3.82085 -0.054496 +vn 0.558297 -0.636526 -0.532109 +v 0.664863 3.88336 0.077407 +vn 0.666081 -0.608584 -0.431232 +v 0.678488 3.86316 0.127939 +vn 0.689385 -0.593314 -0.415604 +v 0.645153 3.85391 0.088533 +vn 0.66164 -0.606711 -0.440608 +v 0.574388 3.95397 -0.133124 +vn 0.581516 -0.617336 -0.529845 +v 0.560272 3.9271 -0.116758 +vn 0.573917 -0.629958 -0.523232 +v 0.737667 4.00135 0.027347 +vn 0.701665 -0.574383 -0.421604 +v 0.720892 3.97188 0.040445 +vn 0.689879 -0.590337 -0.41901 +v 0.631839 4.48241 1.73815 +vn 0.775996 -0.474397 0.415664 +v 0.523731 4.97354 -0.410846 +vn 0.611297 0.359588 -0.704991 +v 0.495657 4.94025 -0.449641 +vn 0.589098 0.317043 -0.743268 +v 0.485525 4.97084 -0.443931 +vn 0.576528 0.357382 -0.734774 +v 0.48678 5.07578 -0.382564 +vn 0.579027 0.451973 -0.678564 +v 0.651652 5.00258 -0.262197 +vn 0.717699 0.386319 -0.579367 +v 0.636742 4.96671 -0.30222 +vn 0.700957 0.359619 -0.6159 +v 0.622086 4.99482 -0.301562 +vn 0.693238 0.377398 -0.613996 +v 0.266517 5.00066 -0.565164 +vn 0.373613 0.378128 -0.847014 +v 0.222575 5.02482 -0.572057 +vn 0.322901 0.407942 -0.854001 +v 0.092848 4.98925 -0.622645 +vn 0.147706 0.358343 -0.921831 +v 0.045879 5.01049 -0.619836 +vn 0.0746746 0.388576 -0.918386 +v 0.25975 4.88207 -0.608693 +vn 0.366992 0.233934 -0.900329 +v 0.063101 4.87105 -0.661829 +vn 0.0975522 0.209377 -0.972957 +v 0 4.91769 -0.653777 +vn 4.43222e-18 0.26666 -0.963791 +v 0.226021 5.27539 -0.377577 +vn 0.281419 0.721671 -0.632451 +v 0.077543 5.27361 -0.425724 +vn 0.110464 0.735085 -0.668915 +v 0.307436 5.19748 -0.415129 +vn 0.387051 0.613492 -0.688345 +v 0.294283 5.27441 -0.343789 +vn 0.347718 0.711381 -0.610761 +v 0.347808 5.27681 -0.307378 +vn 0.399222 0.706148 -0.584787 +v 0.614678 4.58373 -0.419526 +vn 0.654755 -0.0180472 -0.755626 +v 0.606219 4.61442 -0.427079 +vn 0.65114 0.00959033 -0.758897 +v 0.642345 4.46192 -0.382774 +vn 0.665835 -0.133868 -0.733991 +v 0.636576 4.49211 -0.392942 +vn 0.663757 -0.104121 -0.740666 +v 0.777199 4.63651 -0.243067 +vn 0.800505 0.0704533 -0.59517 +v 0.767272 4.66526 -0.252409 +vn 0.794311 0.0960004 -0.599879 +v 0.809913 4.52119 -0.200912 +vn 0.820096 -0.0400767 -0.57082 +v 0.80303 4.55 -0.212118 +vn 0.816368 -0.0109354 -0.577428 +v 0.288059 4.59359 -0.618969 +vn 0.35737 -0.066894 -0.931564 +v 0.292744 4.56064 -0.614385 +vn 0.358082 -0.0947116 -0.928874 +v 0 4.56294 -0.672591 +vn 5.53103e-19 -0.118133 -0.992998 +v 0.057593 4.58844 -0.672926 +vn 0.0824774 -0.0954488 -0.992012 +v 0.058592 4.55477 -0.669191 +vn 0.0822545 -0.12386 -0.988885 +v 0.305126 4.4626 -0.595074 +vn 0.360285 -0.176439 -0.916004 +v 0.308617 4.43039 -0.587081 +vn 0.360846 -0.20348 -0.910157 +v 0 4.42964 -0.649301 +vn 1.10876e-06 -0.224666 -0.974436 +v 0.061318 4.45469 -0.652183 +vn 0.0823372 -0.203382 -0.975631 +v 0.062102 4.4218 -0.644873 +vn 0.0821472 -0.229826 -0.969759 +v 0.267763 4.7247 -0.62801 +vn 0.353437 0.0506936 -0.934084 +v 0.273006 4.69218 -0.627334 +vn 0.354579 0.0200948 -0.93481 +v 0.233802 4.85037 -0.625871 +vn 0.333632 0.177322 -0.925876 +v 0.250002 4.8255 -0.624062 +vn 0.354634 0.147708 -0.923264 +v 0 4.69723 -0.680819 +vn 8.5621e-08 -0.000422946 -1 +v 0.053331 4.72224 -0.678295 +vn 0.0826179 0.0252355 -0.996262 +v 0.054411 4.68905 -0.67858 +vn 0.0824069 -0.00739892 -0.996571 +v 0 4.82787 -0.672506 +vn -2.58097e-07 0.136922 -0.990582 +v 0.050769 4.82227 -0.671026 +vn 0.080482 0.135784 -0.987464 +v 0.57804 4.70625 -0.444721 +vn 0.638486 0.0915512 -0.764169 +v 0.568033 4.73661 -0.448958 +vn 0.633742 0.118787 -0.764369 +v 0.73416 4.75083 -0.276362 +vn 0.773126 0.168684 -0.61141 +v 0.722368 4.77904 -0.282943 +vn 0.765403 0.192347 -0.614134 +v 0.537001 4.82618 -0.45556 +vn 0.617491 0.201468 -0.760339 +v 0.526587 4.85539 -0.455781 +vn 0.611288 0.229822 -0.757304 +v 0.685515 4.86226 -0.297209 +vn 0.740533 0.261381 -0.619105 +v 0.67304 4.88945 -0.300131 +vn 0.731511 0.284659 -0.619565 +v 0.235031 5.49317 0.008486 +vn 0.258177 0.900401 -0.350175 +v 0.083765 5.50411 -0.03882 +vn 0.101044 0.918593 -0.38207 +v 0.375265 5.4732 0.092475 +vn 0.380663 0.876466 -0.294794 +v 0.508402 5.43917 0.203993 +vn 0.4889 0.844605 -0.218219 +v 0 5.3702 -0.30666 +vn 2.42911e-06 0.835376 -0.549679 +v 0 5.30041 -0.4016 +vn -2.21532e-18 0.768289 -0.640103 +v 0.339981 5.52414 0.791021 +vn 0.75009 0.582125 0.313839 +v 0.297287 5.51108 0.883554 +vn 0.709212 0.474542 0.521372 +v 0.363114 5.53805 0.685148 +vn 0.684184 0.711811 0.158801 +v 0.363509 5.55213 0.573779 +vn 0.572118 0.819316 0.037441 +v 0.79953 4.93508 0.976948 +vn 0.788735 0.368429 0.492095 +v 0.883404 4.85216 0.876408 +vn 0.869814 0.336368 0.360944 +v 0.854828 5.06371 0.249206 +vn 0.896169 0.4095 -0.170854 +v 0.663815 5.03735 -0.222337 +vn 0.733663 0.399989 -0.549316 +v 0.637963 5.27344 0.015085 +vn 0.663976 0.661604 -0.348448 +v 0.545379 5.33266 -0.023819 +vn 0.548354 0.749615 -0.370655 +v 0.59772 5.23707 -0.107678 +vn 0.63838 0.624416 -0.450084 +v 0.190371 3.51745 -2.17655 +vn 0.548643 0.408694 -0.729356 +v 0 3.69544 -2.11397 +vn -1.22525e-17 0.742716 -0.669606 +v 0 3.72933 -2.06821 +vn -1.56511e-17 0.877513 -0.479553 +v 0 3.59885 -2.18924 +vn -2.22208e-18 0.476936 -0.878938 +v 0 3.64877 -2.15718 +vn -2.22405e-18 0.622553 -0.782578 +v 0.288135 2.98027 -2.25008 +vn 0.41681 0.0875659 -0.904766 +v 0.261587 2.99045 -2.26047 +vn 0.370948 0.074265 -0.925679 +v 0.332036 2.75881 -2.2429 +vn 0.415099 0.028665 -0.909324 +v 0.306137 2.75487 -2.25393 +vn 0.359275 0.0153354 -0.933106 +v 0.331996 2.98436 -2.22607 +vn 0.530367 0.114122 -0.840052 +v 0.347532 3.0028 -2.21247 +vn 0.588152 0.140696 -0.796418 +v 0.459976 2.73556 -2.16458 +vn 0.633727 0.130287 -0.762506 +v 0.424929 2.74866 -2.18968 +vn 0.585901 0.0956621 -0.804717 +v 0.109748 2.94128 -2.29786 +vn 0.106104 0.0210725 -0.994132 +v 0.10499 2.99958 -2.29681 +vn 0.102813 0.0364083 -0.994034 +v 0.13163 2.99918 -2.29355 +vn 0.138593 0.0395147 -0.989561 +v 0 2.98293 -2.30221 +vn 0 0.025769 -0.999668 +v 0 3.03961 -2.30013 +vn -1.65705e-18 0.0532406 -0.998582 +v 0.025511 3.01935 -2.30076 +vn 0.0215911 0.0403643 -0.998952 +v 0.171634 2.8794 -2.29014 +vn 0.180411 0.0117521 -0.983521 +v 0.142912 2.88067 -2.29469 +vn 0.141079 0.00827821 -0.989964 +v 0.051483 2.88577 -2.30278 +vn 0.0428337 0.00256194 -0.999079 +v 0.02764 2.90146 -2.30349 +vn 0.0222998 0.00846122 -0.999716 +v 0.09097 3.17737 -2.28599 +vn 0.108871 0.0954302 -0.989465 +v 0.091369 3.24742 -2.27896 +vn 0.106209 0.119707 -0.987112 +v 0.115101 3.23458 -2.27727 +vn 0.155372 0.105404 -0.982217 +v 0.07748 3.45162 -2.24111 +vn 0.135864 0.256967 -0.956822 +v 0 3.21446 -2.28642 +vn 0 0.101394 -0.994846 +v 0 3.27603 -2.27948 +vn -3.31548e-18 0.12796 -0.991779 +v 0.041206 3.28485 -2.27736 +vn 0.0383242 0.136402 -0.989912 +v 0 3.42933 -2.25094 +vn -2.21205e-18 0.240398 -0.970674 +v 0 3.52256 -2.22296 +vn -4.43171e-18 0.356354 -0.934351 +v 0.242435 3.28028 -2.22845 +vn 0.501583 0.20734 -0.839896 +v 0.20944 3.2737 -2.2462 +vn 0.391782 0.181147 -0.902049 +v 0.192915 3.54932 -1.74316 +vn 0.353308 0.53219 0.769381 +v 0.273041 3.50892 -1.76536 +vn 0.595366 0.561441 0.574738 +v 0.106036 3.55843 -1.72533 +vn 0.144567 0.521901 0.840666 +v 0 3.58658 -1.73491 +vn -2.30914e-06 0.510729 0.859742 +v 0 3.62332 -1.7569 +vn -6.82268e-06 0.549224 0.835675 +v 0 3.72582 -1.8505 +vn 0 0.847376 0.530993 +v 1.40015 2.62343 0.636684 +vn 0.819797 0.569239 0.0624413 +v 1.4576 2.53039 0.66399 +vn 0.855954 0.509763 0.0865154 +v 1.28582 2.73604 0.88883 +vn 0.773717 0.619218 0.133906 +v 1.33492 2.66579 0.908962 +vn 0.804621 0.575141 0.147639 +v 1.5727 2.23828 0.757849 +vn 0.957246 0.250924 0.143932 +v 1.56215 2.03764 0.978347 +vn 0.97755 0.0356791 0.20766 +v 1.58289 2.15049 0.809576 +vn 0.975223 0.152622 0.160147 +v 1.5935 2.11843 0.769965 +vn 0.982316 0.114399 0.148214 +v 1.55316 2.32329 0.706732 +vn 0.93081 0.343394 0.125195 +v 1.50986 2.4296 0.68723 +vn 0.893002 0.437216 0.10672 +v 1.52829 2.05185 1.11936 +vn 0.965845 0.0570995 0.252753 +v 1.49197 2.06064 1.24167 +vn 0.946664 0.0742543 0.313551 +v 1.47071 1.44481 0.871659 +vn 0.93453 -0.33051 0.131972 +v 1.49508 1.5318 0.893539 +vn 0.950644 -0.279546 0.134649 +v 1.49081 1.5525 0.961587 +vn 0.949041 -0.27278 0.157838 +v 1.47532 1.40721 0.725039 +vn 0.936938 -0.336325 0.095037 +v 1.50796 1.51193 0.737627 +vn 0.951915 -0.290157 0.0983176 +v 1.50307 1.52384 0.81384 +vn 0.952312 -0.282822 0.114512 +v 1.48175 1.56381 1.03148 +vn 0.945008 -0.273386 0.1795 +v 1.47575 1.585 1.09003 +vn 0.939822 -0.266107 0.214294 +v 1.46626 1.6 1.14691 +vn 0.931646 -0.26996 0.243223 +v 1.45867 1.62131 1.19557 +vn 0.920817 -0.260821 0.289945 +v 1.37484 1.28344 0.931078 +vn 0.74443 -0.619202 0.249825 +v 1.37564 1.3053 0.980747 +vn 0.759168 -0.59286 0.268667 +v 1.38496 1.27154 0.866993 +vn 0.769341 -0.606212 0.201546 +v 1.3833 1.25071 0.807372 +vn 0.762788 -0.619267 0.186177 +v 1.38659 1.23444 0.736455 +vn 0.770038 -0.61738 0.16088 +v 1.37336 1.93306 -1.17605 +vn 0.910571 0.0842883 -0.404669 +v 1.34137 1.93281 -1.24438 +vn 0.897933 0.0880569 -0.431234 +v 1.30064 2.14242 -1.19607 +vn 0.842558 0.394865 -0.366302 +v 1.33169 2.14203 -1.12323 +vn 0.843295 0.412947 -0.343989 +v 1.27034 2.14381 -1.26234 +vn 0.835204 0.382114 -0.395505 +v 1.3628 2.14119 -1.04497 +vn 0.843077 0.425426 -0.32899 +v 1.39167 2.14693 -0.96125 +vn 0.84041 0.445525 -0.308575 +v 1.41885 2.15359 -0.87457 +vn 0.838202 0.458027 -0.296022 +v 1.44432 2.16387 -0.785963 +vn 0.833578 0.473425 -0.284634 +v 1.44515 1.88222 -1.00576 +vn 0.938082 -0.0202534 -0.345821 +v 1.52992 1.85227 -0.736457 +vn 0.962548 -0.0963707 -0.253405 +v 1.50508 1.84095 -0.820662 +vn 0.950685 -0.119017 -0.286415 +v 1.5175 1.87059 -0.788084 +vn 0.960468 -0.0704574 -0.269325 +v 1.6054 2.01064 -0.364495 +vn 0.982765 0.103019 -0.153495 +v 1.57523 1.95993 -0.553903 +vn 0.977517 0.0582397 -0.202653 +v 1.60459 1.89326 -0.36683 +vn 0.987272 -0.102977 -0.121203 +v 1.59055 1.87582 -0.45525 +vn 0.981853 -0.111697 -0.15326 +v 1.60017 1.91161 -0.412917 +vn 0.987842 -0.0639139 -0.141718 +v 1.57339 1.87149 -0.551822 +vn 0.978884 -0.0916901 -0.182698 +v 1.55328 1.85135 -0.641039 +vn 0.968778 -0.12096 -0.21642 +v 1.56469 1.8875 -0.603985 +vn 0.9776 -0.0697836 -0.198566 +v 1.49749 2.22187 -0.518082 +vn 0.829163 0.495793 -0.258221 +v 1.50904 2.24825 -0.42917 +vn 0.829044 0.502093 -0.246146 +v 1.46701 2.17579 -0.696874 +vn 0.833474 0.478457 -0.276403 +v 1.48375 2.1981 -0.606972 +vn 0.828478 0.491908 -0.267679 +v 1.52277 2.30578 -0.253961 +vn 0.835416 0.507415 -0.211209 +v 1.52715 2.36208 -0.080914 +vn 0.845339 0.509644 -0.160203 +v 1.6255 2.0418 -0.18133 +vn 0.99055 0.0943215 -0.0995715 +v 1.61311 1.92982 -0.320199 +vn 0.992045 -0.0543083 -0.11357 +v 1.63143 1.96554 -0.132392 +vn 0.997186 -0.0360818 -0.0657199 +v 1.63495 2.11722 0.283463 +vn 0.99219 0.123165 0.0197538 +v 1.63199 2.1421 0.236618 +vn 0.987037 0.1604 0.00536183 +v 1.63718 2.0941 0.09975 +vn 0.993538 0.110705 -0.0250225 +v 1.63282 2.11566 0.053013 +vn 0.987807 0.14999 -0.0417142 +v 1.6402 1.99105 0.285241 +vn 0.998978 -0.0360337 0.027302 +v 1.64168 2.01914 0.241326 +vn 0.99988 -0.00118849 0.0154493 +v 1.64054 1.97115 0.103003 +vn 0.998512 -0.0531875 -0.0119974 +v 1.6406 1.99655 0.055286 +vn 0.999551 -0.0175833 -0.0242817 +v 1.57995 2.32318 0.318639 +vn 0.926446 0.376387 0.00544823 +v 1.51787 2.44587 0.261706 +vn 0.862976 0.5033 -0.0442943 +v 1.5959 2.27678 0.183886 +vn 0.937144 0.347056 -0.0362368 +v 1.54974 2.37973 0.177627 +vn 0.883971 0.463353 -0.0624508 +v 1.52568 2.40881 0.091439 +vn 0.855897 0.507317 -0.100344 +v 1.55769 2.36648 0.468759 +vn 0.915415 0.399754 0.0470387 +v 1.56874 2.29313 0.666913 +vn 0.94331 0.312078 0.113022 +v 1.62369 2.1604 0.417269 +vn 0.983815 0.171438 0.0521331 +v 1.58574 2.20755 0.718992 +vn 0.967182 0.216435 0.1331 +v 1.59739 2.17624 0.679344 +vn 0.975862 0.18107 0.122098 +v 1.6024 2.08462 0.731005 +vn 0.987797 0.072898 0.137632 +v 1.60953 2.04984 0.691401 +vn 0.991452 0.0316594 0.126573 +v 1.46176 2.36237 -0.33139 +vn 0.773803 0.582245 -0.249439 +v 1.44707 2.30417 -0.502692 +vn 0.775373 0.572498 -0.26654 +v 1.52239 2.26833 -0.339613 +vn 0.841509 0.489524 -0.228535 +v 1.27345 2.50415 -0.470629 +vn 0.607212 0.74143 -0.285615 +v 1.27641 2.53438 -0.388096 +vn 0.604441 0.739963 -0.295137 +v 1.27299 2.47703 -0.544527 +vn 0.622762 0.73445 -0.269724 +v 1.28167 2.56327 -0.305742 +vn 0.608496 0.734919 -0.299377 +v 1.27482 2.59711 -0.237179 +vn 0.599018 0.740658 -0.304307 +v 1.27288 2.63006 -0.158635 +vn 0.603963 0.741699 -0.291738 +v 1.27366 2.65863 -0.083351 +vn 0.617423 0.738056 -0.272144 +v 1.27293 2.6854 -0.008362 +vn 0.629851 0.73639 -0.247018 +v 1.37753 2.66201 0.461054 +vn 0.7863 0.617687 -0.0139999 +v 1.24663 2.42106 -0.778417 +vn 0.659121 0.71486 -0.233527 +v 1.14424 2.64484 -0.317858 +vn 0.386845 0.852904 -0.35058 +v 1.1173 2.64533 -0.344673 +vn 0.3837 0.856192 -0.345991 +v 1.14354 2.6676 -0.264214 +vn 0.377791 0.854156 -0.357338 +v 1.14314 2.71674 -0.147073 +vn 0.387319 0.851988 -0.352279 +v 1.14333 2.68567 -0.221205 +vn 0.383215 0.852787 -0.354825 +v 1.113 2.74937 -0.098661 +vn 0.369733 0.862654 -0.345145 +v 1.03377 1.23222 -1.13991 +vn 0.519287 -0.743695 -0.42102 +v 1.0495 1.20655 -1.07383 +vn 0.515031 -0.755528 -0.404872 +v 1.01261 1.28483 -1.25419 +vn 0.531838 -0.720897 -0.44436 +v 1.02342 1.26513 -1.20876 +vn 0.53086 -0.726925 -0.435623 +v 1.06698 1.17882 -0.997907 +vn 0.50543 -0.772015 -0.385399 +v 1.08576 1.15256 -0.917869 +vn 0.49985 -0.787914 -0.359639 +v 1.10585 1.12899 -0.834996 +vn 0.492765 -0.804399 -0.331851 +v 1.12563 1.10799 -0.750117 +vn 0.490247 -0.819755 -0.296073 +v 1.14482 1.09058 -0.664504 +vn 0.486978 -0.834901 -0.2565 +v 1.22298 1.04707 0.334042 +vn 0.432117 -0.900366 0.0511496 +v 1.19878 1.0377 0.342832 +vn 0.320816 -0.945521 0.0553855 +v 1.16537 1.02879 0.347428 +vn 0.240588 -0.969047 0.0553649 +v 1.18027 1.14557 0.967245 +vn 0.46363 -0.833618 0.300213 +v 1.20755 1.15661 0.952762 +vn 0.502881 -0.812498 0.294884 +v 1.15256 1.13476 0.977107 +vn 0.409936 -0.862067 0.297983 +v 1.11725 1.12368 0.990251 +vn 0.380826 -0.878169 0.289466 +v 1.00701 2.54135 -1.01793 +vn 0.726267 0.671724 -0.146027 +v 1.03206 2.51933 -1.00659 +vn 0.632277 0.75973 -0.151779 +v 0.973945 2.57737 -1.03497 +vn 0.772187 0.621903 -0.130242 +v 0.931534 2.62626 -1.06424 +vn 0.785508 0.609466 -0.107369 +v 0.913924 2.61699 -1.22664 +vn 0.823494 0.550258 -0.138108 +v 1.02985 2.70143 -0.351844 +vn 0.615242 0.735809 -0.282952 +v 0.980738 2.7395 -0.362825 +vn 0.627903 0.730498 -0.268535 +v 0.975945 2.68636 -0.530497 +vn 0.659931 0.718223 -0.22056 +v 1.06557 2.72008 -0.234891 +vn 0.549193 0.771516 -0.321169 +v 1.04968 2.90716 0.28653 +vn 0.53081 0.828072 -0.180379 +v 1.05156 2.92536 0.388912 +vn 0.530672 0.837048 -0.133181 +v 1.05434 2.93422 0.466394 +vn 0.527305 0.844831 -0.0906074 +v 1.22193 1.35034 1.29716 +vn 0.565888 -0.652168 0.504428 +v 1.23533 1.39059 1.33129 +vn 0.577087 -0.616555 0.535565 +v 1.21158 1.30894 1.25203 +vn 0.550431 -0.690104 0.469874 +v 1.24725 1.4334 1.36478 +vn 0.597569 -0.572155 0.561739 +v 1.26772 1.47641 1.38462 +vn 0.610405 -0.533935 0.58508 +v 1.28042 1.53081 1.41737 +vn 0.639509 -0.476791 0.603075 +v 1.29579 1.57832 1.43634 +vn 0.657386 -0.432542 0.617049 +v 1.14541 1.48407 1.52009 +vn 0.620185 -0.511524 0.594739 +v 1.17596 1.59009 1.56777 +vn 0.646268 -0.407104 0.645449 +v 1.10611 1.37981 1.45822 +vn 0.578009 -0.61101 0.5409 +v 1.30929 1.63108 1.45607 +vn 0.683462 -0.377446 0.624831 +v 1.22267 1.93406 1.63651 +vn 0.669767 -0.0441127 0.74126 +v 1.21538 1.81646 1.62591 +vn 0.669081 -0.17024 0.723429 +v 1.19974 1.70132 1.60287 +vn 0.661893 -0.291941 0.690412 +v 1.27314 2.27041 1.52787 +vn 0.656714 0.303831 0.690227 +v 1.23891 2.27509 1.55766 +vn 0.645543 0.305298 0.700048 +v 1.1916 2.27708 1.60009 +vn 0.642074 0.301687 0.704788 +v 1.16561 2.39237 1.56518 +vn 0.627302 0.397545 0.669664 +v 1.15595 2.66884 1.3396 +vn 0.569066 0.631914 0.526164 +v 1.13351 2.68036 1.3497 +vn 0.563436 0.639502 0.523045 +v 1.10156 2.69835 1.36197 +vn 0.561673 0.647945 0.51448 +v 0.995041 2.41789 -1.39807 +vn 0.730872 0.56293 -0.385923 +v 1.02047 2.39829 -1.38606 +vn 0.637732 0.625873 -0.448979 +v 0.932176 2.33959 -1.62648 +vn 0.848392 0.342616 -0.403542 +v 0.951323 2.23481 -1.66704 +vn 0.837974 0.29637 -0.458219 +v 0.915289 2.44055 -1.56648 +vn 0.855979 0.386424 -0.343476 +v 1.01417 1.31724 -1.30371 +vn 0.536343 -0.708322 -0.45893 +v 1.38099 1.68401 -1.0783 +vn 0.899758 -0.267864 -0.344506 +v 1.40023 1.77078 -1.08624 +vn 0.912505 -0.185505 -0.364585 +v 1.51263 1.81928 -0.783513 +vn 0.951 -0.159245 -0.265028 +v 1.49402 1.79255 -0.83011 +vn 0.940437 -0.188833 -0.282702 +v 1.35498 1.59844 -1.0699 +vn 0.883118 -0.334391 -0.329066 +v 1.33082 1.52098 -1.04964 +vn 0.864128 -0.383606 -0.325774 +v 1.44408 1.57669 -0.766262 +vn 0.903737 -0.353635 -0.24125 +v 1.40797 1.51261 -0.802721 +vn 0.892573 -0.372023 -0.254781 +v 1.40618 1.84829 -1.09982 +vn 0.921773 -0.0697592 -0.381403 +v 1.43811 1.3454 -0.341168 +vn 0.919322 -0.369402 -0.135609 +v 1.46613 1.4188 -0.342934 +vn 0.92608 -0.352904 -0.133544 +v 1.44221 1.4364 -0.52622 +vn 0.913796 -0.36559 -0.176978 +v 1.42683 1.42178 -0.572693 +vn 0.911467 -0.364255 -0.191172 +v 1.42981 1.45032 -0.613107 +vn 0.906844 -0.370782 -0.200385 +v 1.486 1.44198 -0.257591 +vn 0.93136 -0.347256 -0.109462 +v 1.46873 1.39495 -0.255654 +vn 0.930535 -0.348037 -0.113904 +v 1.49407 1.4375 -0.16437 +vn 0.93615 -0.340869 -0.0862092 +v 1.50587 1.45058 -0.075557 +vn 0.940561 -0.3336 -0.0636856 +v 1.4914 1.41747 -0.111547 +vn 0.939045 -0.335418 -0.0754263 +v 1.24505 1.17742 0.943415 +vn 0.536969 -0.791292 0.292441 +v 1.2935 1.344 1.20265 +vn 0.606856 -0.657675 0.446306 +v 1.22952 1.80427 -1.44548 +vn 0.820645 -0.0915731 -0.564053 +v 1.22191 1.29058 -0.976028 +vn 0.678581 -0.63107 -0.37587 +v 1.1888 1.24684 -0.955214 +vn 0.611242 -0.692135 -0.38384 +v 1.20749 1.22332 -0.879499 +vn 0.625894 -0.697574 -0.34878 +v 1.22657 1.20143 -0.799944 +vn 0.634103 -0.69823 -0.332247 +v 1.24534 1.18204 -0.717687 +vn 0.647941 -0.705912 -0.286113 +v 1.55599 1.68866 0.749349 +vn 0.964687 -0.236855 0.115237 +v 1.57401 1.8687 0.867219 +vn 0.978831 -0.127195 0.160346 +v 1.30617 1.45224 -1.02951 +vn 0.840978 -0.428496 -0.330374 +v 1.28063 1.39116 -1.01 +vn 0.803448 -0.48618 -0.343657 +v 1.25343 1.33841 -0.992361 +vn 0.749245 -0.556788 -0.358636 +v 0.272089 4.8963 2.1155 +vn 0.533113 0.580893 0.615104 +v 0 4.99722 2.07212 +vn -1.10983e-05 0.994292 -0.106698 +v 0.870648 4.51846 1.08639 +vn 0.770308 0.158277 0.617717 +v 0.682526 4.18678 1.3542 +vn 0.739721 -0.251809 0.624023 +v 0.724178 4.22277 1.31411 +vn 0.770809 -0.132758 0.623081 +v 0.581498 4.12565 1.42701 +vn 0.596498 -0.492814 0.633501 +v 0.634808 4.15445 1.39252 +vn 0.680588 -0.374989 0.629431 +v 0.760564 4.26119 1.27297 +vn 0.786756 -0.0343251 0.616309 +v 0.791083 4.30212 1.23299 +vn 0.783389 0.0482252 0.619658 +v 0.81673 4.34441 1.19465 +vn 0.781693 0.103086 0.615084 +v 0.836852 4.38831 1.1602 +vn 0.76801 0.139213 0.625124 +v 0.768442 4.37651 1.25236 +vn 0.861811 0.0231531 0.5067 +v 0.747379 4.33519 1.28804 +vn 0.855326 -0.0251121 0.517481 +v 0.785025 4.41846 1.22018 +vn 0.866835 0.0510089 0.495979 +v 0.721644 4.2949 1.32581 +vn 0.842031 -0.0914867 0.531614 +v 0.690614 4.25647 1.36442 +vn 0.818337 -0.180927 0.545517 +v 0.6541 4.22049 1.40253 +vn 0.776536 -0.287474 0.56067 +v 0.611491 4.1878 1.43878 +vn 0.710084 -0.410068 0.572385 +v 0.165198 4.03863 1.54253 +vn 0.104651 -0.754174 0.648282 +v 0.248633 4.04709 1.53456 +vn 0.181786 -0.747323 0.63911 +v 0 4.04916 1.56802 +vn 2.14282e-06 -0.770008 0.638034 +v 0 4.03404 1.55004 +vn 2.17095e-06 -0.761483 0.648185 +v 0.080968 4.03458 1.54763 +vn 0.0498088 -0.761127 0.646688 +v 0.315623 4.05262 1.52004 +vn 0.23289 -0.727195 0.645717 +v 0.388547 4.06521 1.50338 +vn 0.313338 -0.697816 0.644105 +v 0.457722 4.08132 1.48246 +vn 0.402238 -0.652804 0.641912 +v 0.522067 4.10149 1.45719 +vn 0.497846 -0.588604 0.636941 +v 0.445721 4.11464 1.52553 +vn 0.405267 -0.707992 0.578365 +v 0.379181 4.09866 1.54594 +vn 0.311361 -0.759004 0.571811 +v 0.562605 4.15898 1.47194 +vn 0.617245 -0.531003 0.580555 +v 0.50709 4.13468 1.50086 +vn 0.508808 -0.635885 0.580315 +v 0.235052 4.07362 1.56961 +vn 0.163213 -0.782406 0.601002 +v 0 4.05885 1.57984 +vn 2.07101e-19 -0.781369 0.62407 +v 0 4.06427 1.58684 +vn 1.20816e-19 -0.805841 0.592132 +v 0.597427 4.30074 1.54156 +vn 0.803699 -0.325867 0.497874 +v 0.516995 4.25183 1.61831 +vn 0.675597 -0.527936 0.514637 +v 0.662752 4.35849 1.45957 +vn 0.858724 -0.16227 0.486067 +v 0.71888 4.42298 1.37663 +vn 0.828693 -0.087328 0.552849 +v 0.711673 4.43086 1.38685 +vn 0.793911 0.0509973 0.605892 +v 0.398492 4.2551 1.75992 +vn 0.471334 -0.73998 0.479868 +v 0.12672 4.1762 1.76125 +vn 0.0824958 -0.86443 0.495939 +v 0.189981 4.17922 1.75272 +vn 0.138475 -0.856842 0.496635 +v 0 4.2001 1.81344 +vn -5.51726e-06 -0.879789 0.475364 +v 0 4.176 1.77046 +vn -3.85618e-06 -0.868066 0.49645 +v 0.069706 4.17821 1.77156 +vn 0.0416627 -0.868751 0.493494 +v 0.312225 4.19061 1.72212 +vn 0.27403 -0.808096 0.52143 +v 0.420703 4.21546 1.68069 +vn 0.47496 -0.721485 0.503858 +v 0.635818 4.23848 1.44225 +vn 0.782745 -0.36009 0.507587 +v 0.672892 4.27288 1.40298 +vn 0.832897 -0.277235 0.478982 +v 0.544724 4.1798 1.51355 +vn 0.61559 -0.57346 0.540548 +v 0.59324 4.20717 1.47937 +vn 0.711459 -0.463034 0.528607 +v 0.704742 4.30974 1.36348 +vn 0.868031 -0.216412 0.446865 +v 0.731899 4.3484 1.32457 +vn 0.896506 -0.182148 0.403855 +v 0.773123 4.4271 1.25485 +vn 0.937958 -0.166067 0.304395 +v 0.501111 4.21969 1.60501 +vn 0.611726 -0.576463 0.54174 +v 0.151472 4.09853 1.62796 +vn 0.0979576 -0.845701 0.524589 +v 0.22525 4.1037 1.61874 +vn 0.155835 -0.835983 0.526164 +v 0 4.11121 1.66172 +vn 2.21703e-06 -0.85284 0.522172 +v 0 4.09555 1.63628 +vn 1.70886e-06 -0.851073 0.525048 +v 0.084597 4.0976 1.63562 +vn 0.0578313 -0.85143 0.52127 +v 0.29695 4.11191 1.60616 +vn 0.225316 -0.818382 0.528662 +v 0.365539 4.12316 1.58926 +vn 0.306212 -0.788271 0.533725 +v 0.430208 4.13806 1.56851 +vn 0.400437 -0.741145 0.538845 +v 0.490206 4.15676 1.54311 +vn 0.505799 -0.670177 0.543168 +v 0.415616 5.4935 0.231544 +vn 0.416087 0.889708 -0.187861 +v 0.440597 5.46009 0.14732 +vn 0.434802 0.862923 -0.25751 +v 0.576673 5.41381 0.290181 +vn 0.571252 0.814786 -0.098969 +v 0.544472 5.42691 0.242871 +vn 0.522017 0.833865 -0.179353 +v 0.534791 5.43945 0.27899 +vn 0.513565 0.850037 -0.116997 +v 0.301151 5.48833 0.052467 +vn 0.316941 0.892413 -0.321165 +v 0.157884 5.50408 -0.010657 +vn 0.175412 0.915256 -0.36268 +v 0.164856 5.60513 0.319115 +vn 0.247934 0.936127 -0.24939 +v 0 5.59248 0.201476 +vn 3.31696e-18 0.95528 -0.295703 +v 0 5.61435 0.272951 +vn 7.52977e-07 0.95637 -0.292158 +v 0.057437 5.61411 0.281425 +vn 0.0913775 0.953489 -0.287244 +v 0.213559 5.59776 0.347959 +vn 0.310493 0.925026 -0.218908 +v 0.257964 5.5891 0.383728 +vn 0.368581 0.911571 -0.182168 +v 0.299972 5.5781 0.424271 +vn 0.419898 0.897084 -0.137574 +v 0.327551 5.57023 0.471055 +vn 0.470396 0.87782 -0.0903318 +v 0 5.48557 1.03784 +vn 1.16407e-05 0.328146 0.944627 +v 0.396176 5.45128 0.800039 +vn 0.647207 0.661513 0.378846 +v 0.379199 5.41285 0.892764 +vn 0.530262 0.734289 0.423841 +v 0.497762 5.43017 0.644289 +vn 0.583757 0.777295 0.234608 +v 0.522666 5.43095 0.572513 +vn 0.578563 0.795851 0.178568 +v 0.564699 5.42519 0.403099 +vn 0.565497 0.823877 0.0379407 +v 0.353967 5.55848 0.516315 +vn 0.520379 0.853449 -0.028828 +v 0 5.68148 0.650106 +vn -5.39709e-06 0.999677 0.0254275 +v 0 5.67989 0.562393 +vn 2.83614e-18 0.997607 -0.0691392 +v 0 5.66498 0.799743 +vn 1.76266e-05 0.977697 0.210018 +v 0.049199 5.63488 0.348827 +vn 0.0853925 0.955893 -0.281029 +v 0.294537 5.43523 0.952587 +vn 0.50674 0.638082 0.579713 +v 0 4.68063 1.93399 +vn -5.66011e-06 -0.74577 0.666204 +v 0.516489 5.39827 0.702643 +vn 0.549175 0.793132 0.26334 +v 0.887776 4.98043 0.708043 +vn 0.904349 0.383721 0.186847 +v 0.643036 5.12797 0.995469 +vn 0.568726 0.598411 0.564319 +v 0.970898 4.46957 0.930491 +vn 0.928222 0.0933973 0.360113 +v 1.01286 4.46997 0.754623 +vn 0.986704 0.0823341 0.140132 +v 0.981753 4.28851 0.881209 +vn 0.950133 -0.157277 0.269278 +v 0.996235 4.31024 0.836517 +vn 0.969051 -0.127673 0.21128 +v 0.906253 4.79986 0.871452 +vn 0.885394 0.340733 0.316195 +v 0.90442 4.51023 1.0446 +vn 0.816678 0.14968 0.557345 +v 0.743351 4.02836 1.18114 +vn 0.711862 -0.446226 0.542341 +v 0.619974 3.97025 1.26558 +vn 0.565078 -0.528748 0.633334 +v 0 3.93522 1.44774 +vn 2.20955e-18 -0.660549 0.750783 +v 0.344005 3.95767 1.41413 +vn 0.25655 -0.645116 0.719727 +v 0.421049 3.97908 1.40222 +vn 0.331004 -0.634242 0.698694 +v 0.487745 3.98763 1.37518 +vn 0.399891 -0.608392 0.685526 +v 0 3.97955 1.48967 +vn 4.41883e-18 -0.709607 0.704597 +v 0 4.07188 1.59816 +vn 0 -0.842558 0.538606 +v 0 4.06785 1.59197 +vn 3.79686e-19 -0.829532 0.55846 +v 0.460606 3.18089 1.39962 +vn 0.470053 0.588435 0.657871 +v 0.503649 3.14464 1.40109 +vn 0.492771 0.606511 0.623956 +v 0.874928 3.92977 0.777505 +vn 0.901569 -0.408156 0.143463 +v 0.272862 3.16599 -2.23206 +vn 0.510187 0.159166 -0.845207 +v 0.256786 3.23628 -2.22962 +vn 0.517527 0.174343 -0.837717 +v 0.277785 3.2273 -2.21663 +vn 0.604485 0.173182 -0.777564 +v 0.545646 5.21709 0.99227 +vn 0.521519 0.61261 0.593908 +v 0.480633 5.25495 1.00774 +vn 0.483082 0.618812 0.619437 +v 0.423044 5.28924 1.01658 +vn 0.453432 0.633731 0.626725 +v 0.39571 5.32078 1.00354 +vn 0.437294 0.654066 0.617229 +v 0.359716 5.30629 1.04213 +vn 0.410501 0.63966 0.649864 +v 0.32828 5.33993 1.02841 +vn 0.406918 0.645763 0.646071 +v 0.289066 5.32523 1.0655 +vn 0.370011 0.635078 0.678062 +v 0.283651 5.2754 1.11363 +vn 0.354416 0.616864 0.702758 +v 0.275914 5.22367 1.16111 +vn 0.343151 0.593853 0.727726 +v 0.256177 5.17108 1.21129 +vn 0.317854 0.574646 0.754155 +v 0.252386 5.11217 1.257 +vn 0.28309 0.578236 0.765181 +v 0.238432 5.06416 1.2988 +vn 0.251176 0.598551 0.760689 +v 0.234047 5.02323 1.33355 +vn 0.242649 0.62922 0.738379 +v 0.351772 5.25735 1.09289 +vn 0.395611 0.613795 0.683189 +v 0.321363 5.29083 1.0797 +vn 0.382588 0.626935 0.678659 +v 0.347128 5.20288 1.14243 +vn 0.381423 0.592635 0.709436 +v 0.315248 5.23954 1.12844 +vn 0.368293 0.603091 0.70756 +v 0.335688 5.14412 1.19616 +vn 0.359759 0.584709 0.72711 +v 0.305119 5.18505 1.17831 +vn 0.349824 0.585128 0.731607 +v 0.293845 5.12836 1.228 +vn 0.323054 0.581301 0.74681 +v 0.283355 5.0728 1.27592 +vn 0.291925 0.596271 0.747824 +v 0.311972 5.02955 1.29961 +vn 0.30379 0.61261 0.729671 +v 0.300612 4.98634 1.34169 +vn 0.287132 0.632849 0.719068 +v 0.420047 5.23347 1.07223 +vn 0.440992 0.609027 0.659251 +v 0.389312 5.27153 1.05695 +vn 0.42436 0.623076 0.657035 +v 0.383779 5.21751 1.10928 +vn 0.410146 0.599464 0.687331 +v 0.376911 5.15877 1.1627 +vn 0.391441 0.58519 0.71016 +v 0.32619 5.08424 1.24859 +vn 0.334532 0.592106 0.733143 +v 0.367386 5.09789 1.21754 +vn 0.370837 0.586998 0.719662 +v 0.356959 5.03869 1.27162 +vn 0.347575 0.602791 0.718216 +v 0.388565 4.99191 1.29588 +vn 0.37178 0.613851 0.696396 +v 0.345466 4.9857 1.32307 +vn 0.32779 0.625422 0.708097 +v 0.373482 4.94702 1.34408 +vn 0.348901 0.622429 0.700607 +v 0.414283 5.1739 1.12836 +vn 0.422142 0.588442 0.689588 +v 0.449025 5.18936 1.09274 +vn 0.449133 0.59306 0.668251 +v 0.407293 5.11255 1.1837 +vn 0.406498 0.583292 0.703228 +v 0.445095 5.12842 1.14757 +vn 0.436234 0.578966 0.688838 +v 0.39862 5.0507 1.23993 +vn 0.389246 0.593228 0.704676 +v 0.439021 5.06496 1.20448 +vn 0.423316 0.582247 0.694112 +v 0.430721 5.00236 1.26286 +vn 0.409678 0.59874 0.68824 +v 0.464105 4.95266 1.28624 +vn 0.437131 0.602667 0.667615 +v 0.421088 4.9448 1.3203 +vn 0.394417 0.616772 0.681196 +v 0.450848 4.90401 1.33959 +vn 0.418439 0.605601 0.676873 +v 0.48552 5.20062 1.05668 +vn 0.474842 0.604488 0.639625 +v 0.480689 5.14488 1.11003 +vn 0.46108 0.581477 0.67029 +v 0.512802 5.16066 1.07334 +vn 0.48071 0.586484 0.651885 +v 0.478732 5.0806 1.16595 +vn 0.452042 0.576313 0.680824 +v 0.517115 5.09738 1.12531 +vn 0.474688 0.572358 0.668638 +v 0.472463 5.01533 1.2255 +vn 0.443209 0.585509 0.678782 +v 0.51862 5.02786 1.18343 +vn 0.469127 0.572968 0.672033 +v 0.507076 4.96329 1.24739 +vn 0.467151 0.582551 0.665135 +v 0.543499 4.9086 1.26908 +vn 0.504192 0.571313 0.647605 +v 0.498007 4.90328 1.30849 +vn 0.46667 0.594397 0.654914 +v 0.528457 4.86127 1.32374 +vn 0.501198 0.573424 0.648063 +v 0.595768 5.15524 1.01176 +vn 0.530883 0.601689 0.596769 +v 0.537432 5.17316 1.04283 +vn 0.500646 0.598585 0.625339 +v 0.552925 5.1167 1.08232 +vn 0.496853 0.578482 0.646913 +v 0.557778 5.04759 1.13858 +vn 0.487121 0.567896 0.663481 +v 0.602556 5.06089 1.0934 +vn 0.517975 0.563422 0.643628 +v 0.65208 4.94197 1.15026 +vn 0.600929 0.506486 0.61835 +v 0.601978 4.99544 1.14946 +vn 0.526291 0.546238 0.651646 +v 0.601094 4.95508 1.18421 +vn 0.530019 0.549626 0.645749 +v 0.621076 4.88044 1.22869 +vn 0.57338 0.509002 0.641991 +v 0.587743 4.92792 1.2179 +vn 0.522738 0.545596 0.655034 +v 0.586928 4.87052 1.26616 +vn 0.551189 0.541039 0.635191 +v 0.575851 4.85476 1.28948 +vn 0.550893 0.540842 0.635615 +v 0.635835 5.08816 1.04158 +vn 0.546606 0.567858 0.615434 +v 0.655179 4.89113 1.18842 +vn 0.616439 0.484938 0.620354 +v 0.660907 5.01121 1.08617 +vn 0.586518 0.51452 0.625513 +v 0.549395 4.97521 1.20657 +vn 0.486998 0.570361 0.661454 +v 0.609157 5.02861 1.11598 +vn 0.526655 0.550434 0.647809 +v 0.624864 4.91823 1.19532 +vn 0.564394 0.523883 0.63797 +v -1.10469 2.29441 -1.40199 +vn -0.677106 0.52434 -0.516329 +v -1.1359 2.2569 -1.39604 +vn -0.716603 0.475 -0.51074 +v -1.14712 2.2885 -1.34533 +vn -0.729873 0.525553 -0.437126 +v -1.12447 2.22061 -1.44086 +vn -0.690405 0.433131 -0.579429 +v -1.15526 2.18413 -1.42835 +vn -0.734226 0.394059 -0.552837 +v -1.16698 2.21931 -1.38411 +vn -0.752385 0.433 -0.496416 +v -1.1844 2.24658 -1.32848 +vn -0.770537 0.476946 -0.422843 +v -1.19273 2.28035 -1.26952 +vn -0.771641 0.514495 -0.373985 +v -1.20329 2.1822 -1.357 +vn -0.79407 0.395118 -0.461881 +v -1.19344 2.21672 -1.34337 +vn -0.786536 0.429056 -0.444154 +v -1.094 2.26422 -1.44188 +vn -0.639261 0.480173 -0.60065 +v -1.06627 2.30434 -1.43677 +vn -0.618695 0.51882 -0.589951 +v -1.05454 2.23869 -1.49722 +vn -0.636304 0.437553 -0.635346 +v -1.08689 2.22402 -1.47785 +vn -0.617609 0.433895 -0.655968 +v -1.11419 2.18608 -1.47554 +vn -0.651805 0.393273 -0.648449 +v -1.14518 2.14969 -1.46337 +vn -0.706035 0.358756 -0.61058 +v -1.07481 2.15395 -1.52893 +vn -0.63626 0.363024 -0.680725 +v -1.10979 2.13972 -1.50532 +vn -0.642535 0.348256 -0.682545 +v -1.07696 2.33926 -1.38968 +vn -0.649465 0.573328 -0.49949 +v -1.07535 2.40304 -1.29984 +vn -0.618474 0.694259 -0.368096 +v -1.05199 2.43696 -1.26839 +vn -0.593468 0.74272 -0.3101 +v -1.05861 2.40495 -1.32266 +vn -0.606134 0.68703 -0.400739 +v -1.05927 2.34547 -1.40366 +vn -0.616617 0.580383 -0.531921 +v -1.04176 2.35503 -1.41331 +vn -0.608344 0.585837 -0.535456 +v -1.03627 2.42004 -1.32951 +vn -0.597306 0.700133 -0.391201 +v -1.02018 2.4556 -1.28399 +vn -0.622733 0.719602 -0.307207 +v -1.02053 2.42943 -1.33679 +vn -0.61378 0.689127 -0.385198 +v -1.09309 2.36111 -1.33897 +vn -0.67017 0.604324 -0.430889 +v -1.1345 2.35044 -1.28208 +vn -0.715174 0.59555 -0.365849 +v -1.09649 2.38553 -1.29494 +vn -0.670919 0.649089 -0.358541 +v -1.17934 2.33299 -1.21708 +vn -0.742291 0.584045 -0.328475 +v -1.13197 2.39156 -1.20894 +vn -0.681565 0.666233 -0.30266 +v -0.788744 1.0796 -1.08547 +vn -0.347133 -0.889953 -0.295774 +v -0.811953 1.11314 -1.15121 +vn -0.398208 -0.855444 -0.33113 +v -0.7682 1.09765 -1.16212 +vn -0.369724 -0.874862 -0.312924 +v -0.866554 1.1042 -1.062 +vn -0.388903 -0.862524 -0.323738 +v -0.889028 1.14098 -1.12617 +vn -0.427135 -0.830308 -0.357973 +v -0.854631 1.12917 -1.13968 +vn -0.421711 -0.836505 -0.349884 +v -0.761118 1.12243 -1.23582 +vn -0.403752 -0.8492 -0.340357 +v -0.792096 1.16367 -1.29388 +vn -0.450888 -0.807735 -0.379822 +v -0.742857 1.14099 -1.302 +vn -0.420058 -0.831853 -0.362729 +v -0.83407 1.15108 -1.21557 +vn -0.443619 -0.818568 -0.364895 +v -0.867543 1.19572 -1.26796 +vn -0.484025 -0.778249 -0.40006 +v -0.832309 1.18032 -1.28029 +vn -0.470968 -0.791385 -0.389742 +v -0.795678 1.05495 -0.999604 +vn -0.311719 -0.909803 -0.274027 +v -0.809257 1.03516 -0.916514 +vn -0.289817 -0.921562 -0.258321 +v -0.842578 1.06664 -0.982403 +vn -0.341595 -0.89476 -0.287606 +v -0.824826 1.01612 -0.828734 +vn -0.268623 -0.935455 -0.229706 +v -0.875058 1.0286 -0.815887 +vn -0.306304 -0.920985 -0.240757 +v -0.858481 1.04792 -0.903381 +vn -0.322799 -0.906915 -0.270749 +v -0.888303 1.08251 -0.975272 +vn -0.362419 -0.880885 -0.304458 +v -0.909395 1.06458 -0.895511 +vn -0.343344 -0.895401 -0.2835 +v -0.922289 1.09326 -0.965478 +vn -0.368076 -0.875251 -0.313778 +v -0.923263 1.04203 -0.802863 +vn -0.325641 -0.912323 -0.248242 +v -0.944047 1.02859 -0.719226 +vn -0.311689 -0.928651 -0.201139 +v -0.9582 1.05197 -0.7929 +vn -0.332518 -0.909041 -0.251149 +v -0.741657 1.04228 -1.01685 +vn -0.283422 -0.923954 -0.256866 +v -0.755765 1.02326 -0.930622 +vn -0.252518 -0.937131 -0.240873 +v -0.625108 1.01853 -1.04418 +vn -0.210199 -0.955251 -0.208115 +v -0.637358 1.00302 -0.957553 +vn -0.17595 -0.965553 -0.191699 +v -0.684814 1.02972 -1.03067 +vn -0.246129 -0.940825 -0.232957 +v -0.770475 1.00502 -0.842049 +vn -0.223309 -0.951026 -0.213735 +v -0.785104 0.989816 -0.751432 +vn -0.194803 -0.967128 -0.16345 +v -0.650089 0.988242 -0.868205 +vn -0.13941 -0.976147 -0.166441 +v -0.662759 0.975928 -0.776487 +vn -0.105265 -0.986326 -0.126811 +v -0.712069 0.995658 -0.855332 +vn -0.176514 -0.965428 -0.19181 +v -0.71601 1.08227 -1.17907 +vn -0.343536 -0.891093 -0.296541 +v -0.728169 1.06174 -1.09986 +vn -0.314 -0.909328 -0.272998 +v -0.698726 1.12902 -1.32429 +vn -0.396379 -0.846041 -0.356509 +v -0.705789 1.10438 -1.25405 +vn -0.370741 -0.87077 -0.322971 +v -0.661434 1.06704 -1.19362 +vn -0.308989 -0.909851 -0.276942 +v -0.603892 1.05289 -1.2077 +vn -0.270888 -0.927389 -0.258012 +v -0.613814 1.03493 -1.12768 +vn -0.242105 -0.94271 -0.229526 +v -0.645981 1.11211 -1.34049 +vn -0.362222 -0.866542 -0.343367 +v -0.590051 1.09605 -1.35577 +vn -0.321373 -0.88685 -0.331988 +v -0.595817 1.0731 -1.28385 +vn -0.297246 -0.90878 -0.292854 +v -0.349125 1.0138 -1.25391 +vn -0.117151 -0.972456 -0.201506 +v -0.344726 1.03096 -1.33177 +vn -0.131209 -0.960596 -0.245029 +v -0.283023 1.00895 -1.26446 +vn -0.0922687 -0.975979 -0.197361 +v -0.480714 1.02954 -1.23328 +vn -0.187081 -0.956326 -0.224593 +v -0.474474 1.04796 -1.31035 +vn -0.208089 -0.941441 -0.265307 +v -0.415817 1.02078 -1.24428 +vn -0.149592 -0.965793 -0.211815 +v -0.341724 1.05141 -1.40608 +vn -0.145734 -0.944049 -0.295859 +v -0.340391 1.0756 -1.4767 +vn -0.160601 -0.921623 -0.353297 +v -0.275117 1.04521 -1.41497 +vn -0.111251 -0.950508 -0.2901 +v -0.470117 1.06948 -1.38359 +vn -0.22826 -0.922281 -0.311923 +v -0.468018 1.09447 -1.45277 +vn -0.247231 -0.898235 -0.363387 +v -0.406824 1.05944 -1.39558 +vn -0.184793 -0.934793 -0.303337 +v -0.290711 0.982936 -1.09603 +vn -0.0628832 -0.990543 -0.121943 +v -0.362523 0.987563 -1.08986 +vn -0.0904036 -0.986443 -0.13696 +v -0.323187 0.99044 -1.13515 +vn -0.0814471 -0.986329 -0.143256 +v -0.302608 0.96681 -0.916974 +vn -0.0352967 -0.99723 -0.0654724 +v -0.376004 0.969347 -0.909864 +vn -0.0484525 -0.995757 -0.0782275 +v -0.336021 0.97145 -0.959427 +vn -0.0500658 -0.995055 -0.0857871 +v -0.432121 0.993491 -1.08147 +vn -0.11784 -0.98139 -0.151613 +v -0.49739 1.00003 -1.06856 +vn -0.143319 -0.975972 -0.164127 +v -0.488475 1.01374 -1.1526 +vn -0.165775 -0.967467 -0.191121 +v -0.447809 0.972635 -0.901384 +vn -0.0647801 -0.993345 -0.0952357 +v -0.518803 0.977115 -0.893153 +vn -0.0901184 -0.988384 -0.122377 +v -0.478169 0.979369 -0.942132 +vn -0.0894715 -0.98859 -0.121179 +v -0.218887 0.97987 -1.10216 +vn -0.0433418 -0.9925 -0.114304 +v -0.223232 0.97127 -1.01395 +vn -0.0343624 -0.995804 -0.084816 +v -0.257402 0.976567 -1.05563 +vn -0.0469903 -0.993592 -0.102795 +v -0.072931 0.976762 -1.10986 +vn -0.0101574 -0.994205 -0.107019 +v -0.07618 0.968764 -1.0228 +vn -0.0100663 -0.996883 -0.0782472 +v -0.110582 0.97284 -1.06514 +vn -0.017585 -0.995513 -0.0929794 +v -0.227918 0.964954 -0.922639 +vn -0.0242179 -0.998115 -0.0563916 +v -0.232728 0.96112 -0.828283 +vn -0.0139519 -0.999537 -0.0270303 +v -0.268184 0.963381 -0.873255 +vn -0.0231974 -0.998672 -0.0460059 +v -0.075892 0.963159 -0.933712 +vn -0.00800792 -0.998786 -0.048613 +v -0.077566 0.959964 -0.839122 +vn -0.00502357 -0.999782 -0.0202517 +v -0.115295 0.961386 -0.882052 +vn -0.00931367 -0.999355 -0.0346846 +v -0.213005 1.00468 -1.27037 +vn -0.0657351 -0.979666 -0.189562 +v -0.248373 0.998879 -1.22547 +vn -0.0689435 -0.983177 -0.169142 +v -0.207304 1.04067 -1.42212 +vn -0.0813022 -0.954894 -0.285599 +v -0.211125 1.02146 -1.3494 +vn -0.0757672 -0.968595 -0.23682 +v -0.141413 1.00168 -1.2739 +vn -0.0383473 -0.982861 -0.180316 +v -0.070641 1.00031 -1.27717 +vn -0.014609 -0.984002 -0.177556 +v -0.106801 0.994021 -1.23557 +vn -0.0251312 -0.987045 -0.158461 +v -0.138588 1.03849 -1.43136 +vn -0.0602509 -0.957 -0.28376 +v -0.069376 1.03569 -1.4314 +vn -0.0200213 -0.960113 -0.278896 +v -0.104371 1.02621 -1.39298 +vn -0.0361851 -0.967213 -0.251375 +v -0.933199 0.989247 -0.453195 +vn -0.217327 -0.972906 -0.0788864 +v -0.920459 0.994532 -0.544808 +vn -0.241164 -0.965163 -0.101487 +v -0.880494 0.979033 -0.462368 +vn -0.179827 -0.981669 -0.0631534 +v -0.999957 0.996932 -0.355178 +vn -0.214099 -0.974451 -0.0678785 +v -1.02142 1.00845 -0.432712 +vn -0.230767 -0.968019 -0.0984118 +v -0.983747 1.00044 -0.443854 +vn -0.232357 -0.968318 -0.0914939 +v -0.906469 1.00182 -0.635901 +vn -0.267515 -0.953583 -0.138259 +v -0.891286 1.01269 -0.726365 +vn -0.289383 -0.938483 -0.188435 +v -0.854817 0.989863 -0.647405 +vn -0.224971 -0.96657 -0.123008 +v -0.974706 1.00846 -0.539785 +vn -0.257721 -0.958734 -0.120036 +v -0.991958 1.02445 -0.615251 +vn -0.285436 -0.944814 -0.160787 +v -0.956036 1.01488 -0.624215 +vn -0.286548 -0.945928 -0.152019 +v -0.901219 0.973677 -0.279804 +vn -0.152983 -0.987626 -0.0344987 +v -0.954808 0.982697 -0.268975 +vn -0.187289 -0.981396 -0.0422535 +v -0.944672 0.985337 -0.361221 +vn -0.19915 -0.978213 -0.0586421 +v -0.917553 0.971696 -0.086974 +vn -0.137726 -0.990401 -0.0117486 +v -0.970561 0.980483 -0.088286 +vn -0.183062 -0.982976 -0.0157199 +v -0.941438 0.97603 -0.132222 +vn -0.164636 -0.986168 -0.0191584 +v -1.00385 0.992326 -0.260086 +vn -0.204814 -0.977753 -0.0452746 +v -1.01984 0.992302 -0.171072 +vn -0.203356 -0.978653 -0.0297532 +v -1.04327 1.00073 -0.257465 +vn -0.213073 -0.975835 -0.048424 +v -1.01616 0.989395 -0.073901 +vn -0.202222 -0.97924 -0.0139766 +v -1.03116 0.991805 0.012504 +vn -0.207105 -0.978307 -0.00473826 +v -1.06158 0.999146 -0.075884 +vn -0.21159 -0.977265 -0.0135514 +v -0.843903 0.966585 -0.281748 +vn -0.0977107 -0.99497 -0.0220687 +v -0.852148 0.965635 -0.18587 +vn -0.0899526 -0.995842 -0.0143911 +v -0.877827 0.969107 -0.231038 +vn -0.119698 -0.992557 -0.0224135 +v -0.714768 0.960454 -0.294438 +vn -0.0141521 -0.999888 -0.00477678 +v -0.72222 0.960174 -0.195085 +vn -0.0103482 -0.999942 -0.00287649 +v -0.752553 0.96081 -0.242161 +vn -0.0244261 -0.999682 -0.00624837 +v -0.859111 0.965176 -0.0898 +vn -0.0865463 -0.996216 -0.00798503 +v -0.864801 0.965176 0.006252 +vn -0.087405 -0.99617 -0.00235941 +v -0.891961 0.96808 -0.040819 +vn -0.112328 -0.993652 -0.00615795 +v -0.731443 0.95993 -0.045446 +vn -0.00570422 -0.999983 -0.000811847 +v -0.733912 0.959961 0.006462 +vn -0.00802387 -0.999968 2.63706e-05 +v -0.762796 0.96028 -0.044626 +vn -0.019264 -0.999813 -0.00154698 +v -0.825056 0.970858 -0.474695 +vn -0.134695 -0.989571 -0.0510545 +v -0.835336 0.968345 -0.378943 +vn -0.115523 -0.99265 -0.0360557 +v -0.798903 0.979821 -0.659356 +vn -0.170099 -0.979476 -0.108134 +v -0.811681 0.974093 -0.566132 +vn -0.149665 -0.986341 -0.0687858 +v -0.763273 0.964692 -0.483439 +vn -0.0793035 -0.996278 -0.033771 +v -0.696839 0.961676 -0.491025 +vn -0.0296611 -0.999431 -0.0160896 +v -0.735045 0.962139 -0.437996 +vn -0.0412467 -0.999022 -0.0159493 +v -0.738757 0.972503 -0.671273 +vn -0.113718 -0.989295 -0.0914552 +v -0.676661 0.968191 -0.685507 +vn -0.076306 -0.994099 -0.0771055 +v -0.687502 0.963765 -0.589402 +vn -0.0497758 -0.997905 -0.0413355 +v -0.401439 0.960327 -0.571004 +vn -0.00183758 -0.999995 -0.00268984 +v -0.397947 0.960494 -0.623105 +vn -0.00436796 -0.999979 -0.00486239 +v -0.362595 0.960271 -0.573766 +vn -0.00162622 -0.999997 -0.00163907 +v -0.555738 0.960389 -0.509519 +vn -0.00390715 -0.999977 -0.00562577 +v -0.547282 0.961249 -0.606479 +vn -0.0104171 -0.999825 -0.0155347 +v -0.511848 0.96055 -0.561354 +vn -0.00487972 -0.999961 -0.00737347 +v -0.391087 0.961194 -0.719824 +vn -0.0129263 -0.999776 -0.0167746 +v -0.383673 0.963755 -0.816197 +vn -0.0283456 -0.998567 -0.0453965 +v -0.34987 0.96156 -0.771741 +vn -0.0170378 -0.999572 -0.0237733 +v -0.537958 0.963355 -0.703694 +vn -0.0258245 -0.998964 -0.0374776 +v -0.528031 0.968171 -0.798843 +vn -0.0519141 -0.995657 -0.0772732 +v -0.497423 0.964387 -0.756198 +vn -0.031497 -0.998392 -0.0471217 +v -0.410465 0.960178 -0.417878 +vn -1.81911e-05 -1 -5.61857e-05 +v -0.373363 0.960178 -0.368084 +vn 0 -1 0 +v -0.41328 0.960178 -0.366144 +vn 0 -1 0 +v -0.420618 0.960178 -0.209297 +vn 0 -1 0 +v -0.382058 0.960178 -0.157643 +vn 0 -1 0 +v -0.422823 0.960178 -0.156658 +vn 0 -1 0 +v -0.563788 0.960214 -0.40711 +vn -0.00141851 -0.999999 -0.000568977 +v -0.529818 0.960182 -0.359148 +vn -0.000296587 -1 -0.000144818 +v -0.567526 0.960199 -0.356465 +vn -0.000763074 -1 -0.000299962 +v -0.585017 0.960162 -0.048652 +vn 0.000776567 -1 -2.48263e-05 +v -0.587008 0.960157 0.002926 +vn 0.000912324 -1 6.9872e-06 +v -0.622839 0.960117 -0.047921 +vn 0.00165862 -0.999999 -6.92914e-05 +v -0.254483 0.960178 -0.266871 +vn 0 -1 0 +v -0.255897 0.960178 -0.213531 +vn 0 -1 0 +v -0.296019 0.960178 -0.265814 +vn 0 -1 0 +v -0.085227 0.960178 -0.273743 +vn 0 -1 0 +v -0.085741 0.960178 -0.22079 +vn 0 -1 0 +v -0.127863 0.960178 -0.269742 +vn 0 -1 0 +v -0.259679 0.960178 -0.052695 +vn 0 -1 0 +v -0.260658 0.960178 0.001058 +vn 0 -1 0 +v -0.302004 0.960178 -0.05235 +vn 0 -1 0 +v -0.087089 0.960178 -0.057834 +vn 0 -1 0 +v -0.087457 0.960178 -0.004431 +vn 0 -1 0 +v -0.130588 0.960178 -0.054092 +vn 0 -1 0 +v -0.249532 0.960178 -0.425297 +vn -5.23394e-06 -1 -4.5899e-07 +v -0.288261 0.960179 -0.475773 +vn -8.34478e-05 -1 -7.06426e-05 +v -0.247767 0.960178 -0.477473 +vn -2.23714e-05 -1 5.73562e-05 +v -0.241806 0.96005 -0.631241 +vn -0.00202114 -0.999995 0.00223943 +v -0.275631 0.960045 -0.67944 +vn -0.00534778 -0.999986 -0.000457891 +v -0.239683 0.959894 -0.681503 +vn -0.00357433 -0.999993 0.00130124 +v -0.083505 0.960178 -0.434102 +vn 1.38975e-06 -1 3.18144e-05 +v -0.124389 0.960175 -0.481661 +vn -2.05727e-05 -1 0.00028602 +v -0.082874 0.960175 -0.485842 +vn 3.69442e-05 -1 0.000344958 +v -0.080784 0.959822 -0.641273 +vn -0.000567266 -0.999986 0.00530815 +v -0.120171 0.959582 -0.686771 +vn -0.00177767 -0.999988 0.00466833 +v -0.080002 0.959498 -0.691038 +vn -0.0013561 -0.999984 0.0054612 +v -0.986775 0.989789 0.372883 +vn -0.210036 -0.976591 0.0464167 +v -0.98679 0.986344 0.282186 +vn -0.199546 -0.979423 0.0301955 +v -0.959912 0.982429 0.32872 +vn -0.190173 -0.981173 0.0336857 +v -1.05065 0.997494 0.18668 +vn -0.212971 -0.976839 0.0206954 +v -1.03313 0.995852 0.268664 +vn -0.212803 -0.976565 0.032179 +v -1.07787 1.00582 0.269188 +vn -0.217965 -0.975367 0.0339167 +v -0.981979 0.981782 0.097909 +vn -0.187475 -0.982242 0.00735771 +v -0.977686 0.980898 0.006709 +vn -0.184378 -0.982842 -0.0050623 +v -0.953482 0.976446 0.054068 +vn -0.167244 -0.985915 0.000501457 +v -1.07371 1.0013 0.100877 +vn -0.214444 -0.97669 0.00947011 +v -1.02784 0.991297 0.103939 +vn -0.208248 -0.978028 0.00971894 +v -0.983707 0.99372 0.460232 +vn -0.22282 -0.973107 0.05843 +v -1.0288 1.00349 0.445913 +vn -0.229638 -0.971222 0.0631997 +v -0.977241 1.00564 0.637829 +vn -0.269247 -0.958637 0.0923081 +v -1.02615 1.01822 0.624018 +vn -0.267198 -0.958036 0.103785 +v -0.981341 0.999172 0.5496 +vn -0.243394 -0.967105 0.0739363 +v -1.07467 1.01427 0.443348 +vn -0.230676 -0.97064 0.0681682 +v -1.10546 1.02902 0.53044 +vn -0.23935 -0.966169 0.0960696 +v -1.11556 1.02441 0.450434 +vn -0.225548 -0.971141 0.0775401 +v -1.06565 1.02836 0.617003 +vn -0.260225 -0.958794 0.114005 +v -1.09439 1.0467 0.69368 +vn -0.27432 -0.950221 0.147741 +v -1.1018 1.03721 0.611097 +vn -0.251687 -0.959932 0.123226 +v -0.87335 0.970304 0.384483 +vn -0.124482 -0.991935 0.0238612 +v -0.872051 0.972674 0.477898 +vn -0.143759 -0.989115 0.0313738 +v -0.902749 0.975736 0.427446 +vn -0.161229 -0.986343 0.033644 +v -0.741947 0.961334 0.397938 +vn -0.0263958 -0.999633 0.00603855 +v -0.740825 0.961927 0.494874 +vn -0.0349012 -0.999362 0.00752074 +v -0.775967 0.962855 0.44283 +vn -0.0492293 -0.998731 0.0106257 +v -0.870626 0.975926 0.571825 +vn -0.173728 -0.983746 0.0454172 +v -0.867338 0.979745 0.663658 +vn -0.20356 -0.977368 0.0575827 +v -0.923672 0.992009 0.649241 +vn -0.245264 -0.966665 0.0735184 +v -0.738645 0.96263 0.590558 +vn -0.0453071 -0.998928 0.00952204 +v -0.735337 0.963451 0.684752 +vn -0.0584377 -0.998212 0.0125708 +v -0.771447 0.965043 0.632533 +vn -0.0788773 -0.996717 0.018284 +v -0.876087 0.968611 0.290225 +vn -0.111968 -0.993524 0.0193202 +v -0.812778 0.963215 0.29517 +vn -0.0606962 -0.998085 0.0119584 +v -0.842719 0.966122 0.340388 +vn -0.0915918 -0.995655 0.0168189 +v -0.930284 0.97289 0.100765 +vn -0.14554 -0.989335 0.00585461 +v -0.871832 0.965848 0.101817 +vn -0.0939814 -0.995564 0.00437009 +v -0.909263 0.970348 0.147908 +vn -0.129315 -0.991554 0.00996321 +v -0.745001 0.960842 0.300003 +vn -0.0201678 -0.999777 0.00619564 +v -0.672631 0.960334 0.306617 +vn -0.00386973 -0.99999 0.00202216 +v -0.70696 0.960609 0.351845 +vn -0.00956918 -0.999948 0.00361305 +v -0.808581 0.961557 0.102853 +vn -0.0448025 -0.998992 0.00260933 +v -0.740917 0.960043 0.103869 +vn -0.0101805 -0.999948 0.00108515 +v -0.783716 0.960837 0.151948 +vn -0.0305466 -0.999525 0.00397905 +v -0.433815 0.960178 0.419572 +vn -6.96395e-06 -1 -1.91403e-07 +v -0.434234 0.960178 0.367916 +vn 0 -1 0 +v -0.392561 0.960178 0.369629 +vn 0 -1 0 +v -0.594216 0.96023 0.409997 +vn -0.00201341 -0.999998 0.000304701 +v -0.594656 0.960213 0.35956 +vn -0.00136271 -0.999999 0.000275519 +v -0.555551 0.960184 0.36185 +vn -0.000470886 -1 0.000136863 +v -0.429908 0.960178 0.054643 +vn 0 -1 0 +v -0.428124 0.960178 0.001811 +vn 0 -1 0 +v -0.388572 0.960178 0.054687 +vn 0 -1 0 +v -0.589214 0.96016 0.054455 +vn 0.000831879 -1 5.14981e-05 +v -0.550353 0.960175 0.054498 +vn 0.000245623 -1 1.54718e-05 +v -0.433655 0.960178 0.470947 +vn 0 -1 0 +v -0.474686 0.960178 0.468526 +vn -1.33527e-05 -1 5.49017e-06 +v -0.429684 0.960178 0.721446 +vn -1.37953e-05 -1 2.02646e-05 +v -0.510554 0.960182 0.713978 +vn -0.000683627 -1 4.45455e-05 +v -0.471656 0.960178 0.668914 +vn -4.98636e-05 -1 1.1058e-06 +v -0.594013 0.960233 0.460177 +vn -0.00230052 -0.999997 0.000282181 +v -0.628995 0.960351 0.457269 +vn -0.00472719 -0.999988 0.00107064 +v -0.58877 0.960327 0.705329 +vn -0.00628449 -0.99998 0.000815499 +v -0.663856 0.961172 0.695551 +vn -0.0212437 -0.999766 0.00410563 +v -0.628314 0.960567 0.652685 +vn -0.010038 -0.999948 0.00188261 +v -0.2644 0.960178 0.426348 +vn 0 -1 0 +v -0.26429 0.960178 0.478537 +vn 0 -1 0 +v -0.307266 0.960178 0.47694 +vn 0 -1 0 +v -0.08893 0.960178 0.434913 +vn 0 -1 0 +v -0.088868 0.960178 0.486705 +vn 0 -1 0 +v -0.133121 0.960178 0.482548 +vn 0 -1 0 +v -0.263088 0.960178 0.632526 +vn 0 -1 0 +v -0.26252 0.960178 0.682934 +vn 0 -1 0 +v -0.301652 0.960178 0.680892 +vn 0 -1 0 +v -0.088385 0.960178 0.642492 +vn 0 -1 0 +v -0.088164 0.960178 0.69245 +vn 0 -1 0 +v -0.132133 0.960178 0.688174 +vn 0 -1 0 +v -0.264811 0.960178 0.373861 +vn 0 -1 0 +v -0.221399 0.960178 0.374925 +vn 0 -1 0 +v -0.28669 0.960178 0.21479 +vn 0 -1 0 +v -0.317612 0.960178 0.161301 +vn 0 -1 0 +v -0.274874 0.960178 0.161754 +vn 0 -1 0 +v -0.089154 0.960178 0.381043 +vn 0 -1 0 +v -0.044612 0.960178 0.392392 +vn 0 -1 0 +v -0.118716 0.960178 0.216591 +vn 0 -1 0 +v -0.144175 0.960178 0.162595 +vn 0 -1 0 +v -0.094634 0.960178 0.167012 +vn 0 -1 0 +v -0.945126 1.06099 1.05358 +vn -0.435483 -0.864575 0.250727 +v -0.951706 1.04471 0.975194 +vn -0.412696 -0.889867 0.194469 +v -0.898852 1.02381 0.991581 +vn -0.386571 -0.904513 0.180052 +v -1.01403 1.05313 0.882726 +vn -0.36566 -0.912325 0.184273 +v -1.00229 1.06468 0.958543 +vn -0.405757 -0.889001 0.212225 +v -1.03882 1.07798 0.945914 +vn -0.387045 -0.893858 0.226306 +v -0.958612 1.03215 0.893822 +vn -0.375452 -0.913424 0.157139 +v -0.965569 1.0219 0.810144 +vn -0.337464 -0.9321 0.13156 +v -0.912353 1.00474 0.824265 +vn -0.31467 -0.943167 0.106857 +v -1.02863 1.03008 0.714135 +vn -0.293967 -0.946538 0.132853 +v -1.01646 1.03837 0.795802 +vn -0.33192 -0.930947 0.152209 +v -1.05321 1.04934 0.78489 +vn -0.314646 -0.934588 0.165963 +v -0.940097 1.08376 1.12855 +vn -0.442508 -0.839167 0.316206 +v -0.982023 1.09758 1.10458 +vn -0.448078 -0.840441 0.304772 +v -0.936684 1.14234 1.26765 +vn -0.437523 -0.811899 0.386515 +v -0.978179 1.15302 1.24158 +vn -0.450307 -0.809417 0.376918 +v -0.937071 1.11192 1.20023 +vn -0.439074 -0.823729 0.358727 +v -1.02189 1.11963 1.10718 +vn -0.436532 -0.841317 0.318788 +v -1.0596 1.16041 1.15939 +vn -0.439256 -0.823676 0.358626 +v -1.06073 1.1303 1.0831 +vn -0.423174 -0.849241 0.315774 +v -1.02425 1.1734 1.23002 +vn -0.453029 -0.804377 0.384374 +v -1.06142 1.21758 1.27421 +vn -0.476902 -0.770888 0.422252 +v -1.05912 1.18615 1.21589 +vn -0.453595 -0.801632 0.389407 +v -0.835525 1.02059 1.08918 +vn -0.342113 -0.903467 0.258276 +v -0.830727 1.04562 1.16677 +vn -0.355379 -0.871928 0.33682 +v -0.887857 1.06419 1.14774 +vn -0.410723 -0.850964 0.327364 +v -0.707835 0.994781 1.12411 +vn -0.178329 -0.951852 0.249354 +v -0.703366 1.0195 1.20383 +vn -0.210958 -0.919154 0.332645 +v -0.769083 1.03032 1.18565 +vn -0.281845 -0.897279 0.339786 +v -0.827747 1.0762 1.24077 +vn -0.362309 -0.850918 0.380355 +v -0.827252 1.10868 1.31083 +vn -0.36817 -0.838015 0.402718 +v -0.884424 1.12541 1.28927 +vn -0.409613 -0.822226 0.395172 +v -0.700557 1.0497 1.28014 +vn -0.240518 -0.894869 0.375979 +v -0.700012 1.08132 1.35278 +vn -0.268901 -0.879908 0.391731 +v -0.765626 1.09387 1.33222 +vn -0.316826 -0.858453 0.403336 +v -0.841479 1.0041 1.00841 +vn -0.322289 -0.930943 0.17168 +v -0.779505 0.988593 1.02515 +vn -0.230432 -0.959244 0.163559 +v -0.854535 0.988182 0.83884 +vn -0.262504 -0.961542 0.0807963 +v -0.792024 0.974638 0.853364 +vn -0.180939 -0.981858 0.0567009 +v -0.848005 0.994375 0.924834 +vn -0.295741 -0.948744 0.111453 +v -0.713332 0.97888 1.04129 +vn -0.146406 -0.977507 0.151807 +v -0.645546 0.97376 1.0587 +vn -0.0953882 -0.984478 0.147323 +v -0.727294 0.966573 0.869895 +vn -0.103068 -0.993735 0.0432136 +v -0.656046 0.962455 0.882374 +vn -0.0465938 -0.998504 0.028609 +v -0.719295 0.97037 0.955619 +vn -0.118618 -0.989709 0.0800421 +v -0.412036 0.978758 1.17812 +vn -0.0464946 -0.983121 0.176948 +v -0.415679 0.967648 1.09233 +vn -0.0226216 -0.99545 0.0925587 +v -0.373897 0.971655 1.14015 +vn -0.0289297 -0.991803 0.124459 +v -0.565323 0.984898 1.15874 +vn -0.10139 -0.970099 0.22052 +v -0.571704 0.970533 1.07165 +vn -0.0588173 -0.98991 0.128911 +v -0.530304 0.974781 1.11924 +vn -0.0565178 -0.986252 0.155283 +v -0.419601 0.962448 1.00365 +vn -0.00832471 -0.999214 0.0387638 +v -0.423424 0.960501 0.912194 +vn -0.00185095 -0.999934 0.0113557 +v -0.380969 0.961115 0.962323 +vn -0.00386457 -0.999788 0.0202102 +v -0.57549 0.963423 0.98285 +vn -0.0250568 -0.998298 0.0526684 +v -0.580522 0.960831 0.89276 +vn -0.0134906 -0.999782 0.0159462 +v -0.539893 0.961466 0.943728 +vn -0.0097187 -0.999577 0.0273966 +v -0.409037 0.997475 1.26092 +vn -0.0739006 -0.963821 0.256102 +v -0.486541 1.00114 1.2496 +vn -0.0974034 -0.956584 0.274698 +v -0.449557 0.988661 1.21463 +vn -0.0695458 -0.970281 0.231773 +v -0.406719 1.04672 1.41706 +vn -0.113728 -0.935547 0.334391 +v -0.483856 1.05282 1.40437 +vn -0.147247 -0.927014 0.344911 +v -0.445547 1.03628 1.37335 +vn -0.119799 -0.9384 0.324119 +v -0.561512 1.00716 1.24009 +vn -0.138403 -0.943987 0.299556 +v -0.634046 1.01197 1.22074 +vn -0.162754 -0.934757 0.315817 +v -0.55874 1.06206 1.39285 +vn -0.194777 -0.91302 0.358408 +v -0.630886 1.07028 1.37188 +vn -0.228594 -0.899163 0.373163 +v -0.559149 1.03396 1.31818 +vn -0.169454 -0.925942 0.337516 +v -0.250525 0.97582 1.19398 +vn -0.0241645 -0.98774 0.154225 +v -0.248582 0.992561 1.2776 +vn -0.0387004 -0.972137 0.231199 +v -0.290297 0.984149 1.23283 +vn -0.0380339 -0.978568 0.20238 +v -0.083878 0.974919 1.20611 +vn -0.00970266 -0.988901 0.148258 +v -0.083221 0.991155 1.28999 +vn -0.0132403 -0.974437 0.224271 +v -0.125285 0.981974 1.24381 +vn -0.0164267 -0.981715 0.189648 +v -0.247359 1.0143 1.35819 +vn -0.0506921 -0.95823 0.281469 +v -0.247119 1.03872 1.43571 +vn -0.0600905 -0.945432 0.320232 +v -0.287558 1.02762 1.39364 +vn -0.0664704 -0.950369 0.303943 +v -0.082877 1.01237 1.37089 +vn -0.0163527 -0.961285 0.275072 +v -0.082902 1.0364 1.4488 +vn -0.0192923 -0.948517 0.316138 +v -0.12416 1.02363 1.40571 +vn -0.0263465 -0.955161 0.294914 +v -0.252865 0.966231 1.1074 +vn -0.0116127 -0.996942 0.0772754 +v -0.16926 0.965815 1.11233 +vn -0.00781144 -0.997308 0.0729153 +v -0.210194 0.969852 1.15376 +vn -0.0141001 -0.994044 0.108061 +v -0.257781 0.960428 0.925579 +vn -0.000915676 -0.999961 0.00878591 +v -0.172648 0.960406 0.930001 +vn -0.000667718 -0.999968 0.00800167 +v -0.214377 0.960923 0.974528 +vn -0.00185941 -0.999869 0.0160538 +v -0.084688 0.965743 1.11929 +vn -0.00537707 -0.997347 0.0725968 +v 0 0.966849 1.13916 +vn -1.38105e-19 -0.99641 0.0846582 +v -0.042111 0.970226 1.17266 +vn -0.00492764 -0.993515 0.113598 +v -0.086442 0.960398 0.936922 +vn -0.000718972 -0.999969 0.00783264 +v 0 0.960485 0.957929 +vn 1.38048e-19 -0.999946 0.0103583 +v -0.04299 0.960965 0.99371 +vn -0.000922135 -0.999853 0.0171282 +v -0.893948 3.03417 0.87466 +vn -0.627803 0.767827 0.127693 +v -0.897828 3.0434 0.787487 +vn -0.639263 0.764738 0.0807407 +v -0.927829 3.00964 0.865372 +vn -0.589393 0.798802 0.120545 +v -0.90347 3.04478 0.701427 +vn -0.632047 0.7741 0.0358567 +v -0.909121 3.04215 0.612475 +vn -0.629503 0.776898 -0.0124598 +v -0.936033 3.02011 0.696049 +vn -0.592792 0.804666 0.0333146 +v -0.96395 2.98371 0.869469 +vn -0.555457 0.822365 0.123219 +v -0.959907 2.99781 0.77698 +vn -0.570064 0.818134 0.0753869 +v -0.989703 2.97041 0.84422 +vn -0.537849 0.835746 0.110664 +v -0.964723 2.99975 0.696289 +vn -0.565326 0.824029 0.0371796 +v -0.965535 3.00085 0.6258 +vn -0.570567 0.821251 -0.000396627 +v -0.992014 2.98183 0.692116 +vn -0.545867 0.83728 0.031504 +v -0.885363 3.02562 0.957479 +vn -0.624344 0.762292 0.170604 +v -0.860959 3.06178 0.880952 +vn -0.669954 0.730052 0.134852 +v -0.818756 3.08175 0.973969 +vn -0.699572 0.68784 0.193585 +v -0.795403 3.12945 0.89279 +vn -0.776469 0.610286 0.156992 +v -0.828181 3.09238 0.886796 +vn -0.72181 0.677272 0.142451 +v -0.872368 3.07151 0.707468 +vn -0.67549 0.736374 0.0382958 +v -0.835826 3.10033 0.798782 +vn -0.734513 0.672971 0.08718 +v -0.809977 3.13798 0.712894 +vn -0.787809 0.615006 0.0335464 +v -0.840528 3.10241 0.705786 +vn -0.728971 0.683708 0.0338369 +v -0.878322 3.01098 1.03648 +vn -0.609837 0.762863 0.2148 +v -0.879151 2.98849 1.10935 +vn -0.588301 0.76801 0.253105 +v -0.844836 3.03443 1.05151 +vn -0.636548 0.736241 0.229686 +v -0.867756 2.96775 1.19097 +vn -0.579298 0.757944 0.299892 +v -0.82357 2.99614 1.20636 +vn -0.598973 0.736735 0.313772 +v -0.832818 3.01846 1.12974 +vn -0.61999 0.737288 0.268366 +v -0.806602 3.06472 1.06472 +vn -0.676795 0.694892 0.243051 +v -0.791147 3.05091 1.14103 +vn -0.654688 0.699889 0.285551 +v -0.769379 3.10159 1.07038 +vn -0.718285 0.643676 0.264099 +v -0.77503 3.02908 1.22383 +vn -0.617416 0.707387 0.344094 +v -0.723871 3.07024 1.23465 +vn -0.641015 0.666197 0.381159 +v -0.748654 3.08825 1.15207 +vn -0.685798 0.656061 0.315063 +v -0.914885 2.98527 1.02924 +vn -0.577651 0.788871 0.209767 +v -0.947956 2.98115 0.946953 +vn -0.564347 0.808825 0.165269 +v -0.977625 2.94691 1.01057 +vn -0.53556 0.819731 0.203016 +v -0.947953 2.96439 1.01953 +vn -0.553481 0.807187 0.205202 +v -0.91178 2.94146 1.17463 +vn -0.560507 0.774737 0.292598 +v -0.907998 2.91628 1.24276 +vn -0.555189 0.759031 0.340055 +v -0.944515 2.94632 1.0932 +vn -0.55119 0.797134 0.246511 +v -0.975368 2.90666 1.14937 +vn -0.533245 0.795041 0.289067 +v -0.944613 2.92289 1.16211 +vn -0.545443 0.786651 0.289262 +v -0.293969 3.31532 1.38831 +vn -0.326509 0.541903 0.774424 +v -0.221425 3.3208 1.411 +vn -0.24661 0.554936 0.7945 +v -0.221007 3.37507 1.37524 +vn -0.249505 0.510716 0.822749 +v -0.309971 3.20164 1.46767 +vn -0.323056 0.596511 0.734717 +v -0.23314 3.20979 1.49048 +vn -0.246457 0.601057 0.760256 +v -0.269628 3.23416 1.45833 +vn -0.287375 0.589654 0.7548 +v -0.147733 3.32595 1.42638 +vn -0.163712 0.563879 0.809468 +v -0.073058 3.32418 1.43898 +vn -0.0836425 0.572156 0.815869 +v -0.074734 3.37742 1.40307 +vn -0.0831887 0.53407 0.841338 +v -0.07448 3.22214 1.51471 +vn -0.0838462 0.60988 0.788046 +v -0.052629 3.27475 1.47692 +vn -0.0667424 0.595263 0.800754 +v -0.364195 3.30896 1.35898 +vn -0.406587 0.52687 0.746388 +v -0.376824 3.25038 1.39536 +vn -0.406975 0.560322 0.721395 +v -0.33667 3.28333 1.39172 +vn -0.367746 0.549875 0.749933 +v -0.493865 3.29649 1.2777 +vn -0.582437 0.487761 0.650274 +v -0.510888 3.23363 1.31328 +vn -0.569148 0.540889 0.619281 +v -0.472416 3.26912 1.31693 +vn -0.529252 0.523577 0.667652 +v -0.386186 3.19216 1.4373 +vn -0.396793 0.592197 0.701325 +v -0.393732 3.13435 1.4836 +vn -0.376778 0.619303 0.688841 +v -0.350859 3.168 1.47649 +vn -0.350969 0.605884 0.713951 +v -0.592403 3.16648 1.29244 +vn -0.63197 0.57658 0.517851 +v -0.531554 3.17085 1.35205 +vn -0.548821 0.583426 0.598673 +v -0.55193 3.20145 1.30242 +vn -0.60322 0.553804 0.573957 +v -0.286873 3.42609 1.32317 +vn -0.327991 0.435158 0.838487 +v -0.353317 3.42308 1.29506 +vn -0.412226 0.41136 0.812929 +v -0.359451 3.36635 1.32369 +vn -0.413296 0.475196 0.776772 +v -0.283033 3.53233 1.28105 +vn -0.316763 0.244733 0.916388 +v -0.348577 3.53213 1.25494 +vn -0.405829 0.220497 0.886952 +v -0.349505 3.47838 1.27195 +vn -0.408599 0.329499 0.851162 +v -0.416058 3.42019 1.26069 +vn -0.499491 0.382453 0.777328 +v -0.474258 3.41768 1.22005 +vn -0.589753 0.346955 0.729256 +v -0.482605 3.3585 1.24541 +vn -0.58909 0.4217 0.689306 +v -0.410579 3.53171 1.22338 +vn -0.489753 0.185684 0.851859 +v -0.468462 3.53192 1.18633 +vn -0.576227 0.142235 0.804818 +v -0.469599 3.47552 1.20012 +vn -0.585871 0.255384 0.769112 +v -0.217636 3.42885 1.34511 +vn -0.246117 0.454636 0.855998 +v -0.215319 3.48143 1.32028 +vn -0.24207 0.380459 0.892554 +v -0.073744 3.42955 1.37199 +vn -0.0811928 0.482832 0.871941 +v -0.072881 3.48053 1.34603 +vn -0.0788505 0.413274 0.907186 +v -0.146389 3.43093 1.36095 +vn -0.164235 0.46976 0.867383 +v -0.214783 3.53256 1.30148 +vn -0.240475 0.277936 0.930012 +v -0.224165 3.57638 1.28859 +vn -0.246614 0.152879 0.95698 +v -0.072737 3.53037 1.32597 +vn -0.0796956 0.316082 0.945379 +v -0.082111 3.57368 1.3132 +vn -0.0890227 0.192078 0.977334 +v -0.144545 3.5327 1.31629 +vn -0.155085 0.290312 0.944281 +v -0.802817 2.77355 -1.21122 +vn -0.780715 0.623123 -0.0469236 +v -0.84631 2.72007 -1.18635 +vn -0.792779 0.605 -0.0740079 +v -0.80927 2.77082 -1.12357 +vn -0.755216 0.654764 -0.0305411 +v -0.791973 2.76697 -1.37839 +vn -0.830044 0.547274 -0.107322 +v -0.835077 2.70794 -1.34651 +vn -0.832487 0.538024 -0.132266 +v -0.797255 2.77263 -1.2956 +vn -0.805857 0.587546 -0.0733797 +v -0.88483 2.6717 -1.16388 +vn -0.801753 0.58971 -0.0971296 +v -0.919493 2.62763 -1.14336 +vn -0.80536 0.581024 -0.117501 +v -0.893221 2.67315 -1.07907 +vn -0.78062 0.619502 -0.0827686 +v -0.871851 2.65733 -1.31993 +vn -0.834958 0.529639 -0.149424 +v -0.900129 2.62064 -1.29187 +vn -0.835377 0.526963 -0.15638 +v -0.877389 2.66731 -1.24457 +vn -0.819605 0.560787 -0.117324 +v -0.706887 2.88209 -1.17364 +vn -0.709686 0.703413 0.0394476 +v -0.702156 2.89183 -1.26482 +vn -0.741757 0.670127 0.026933 +v -0.754603 2.83123 -1.23766 +vn -0.764476 0.644512 -0.0134483 +v -0.590628 2.99397 -1.22178 +vn -0.629928 0.766563 0.124784 +v -0.585566 3.01492 -1.31874 +vn -0.666397 0.735014 0.125179 +v -0.646091 2.95328 -1.29146 +vn -0.708427 0.702069 0.0723178 +v -0.69548 2.90214 -1.35551 +vn -0.771609 0.636054 0.00745965 +v -0.695451 2.89845 -1.44172 +vn -0.808988 0.585173 -0.0557757 +v -0.722728 2.86629 -1.38213 +vn -0.802256 0.595407 -0.0433111 +v -0.641692 2.96866 -1.47388 +vn -0.794799 0.60673 -0.0131762 +v -0.611717 3.00489 -1.44572 +vn -0.755414 0.653469 0.0482534 +v -0.611365 3.0074 -1.49173 +vn -0.781487 0.623905 0.0044667 +v -0.711751 2.87181 -1.08133 +vn -0.681522 0.730703 0.0400197 +v -0.654198 2.92511 -1.10509 +vn -0.646266 0.759256 0.0766187 +v -0.720913 2.85709 -0.896987 +vn -0.641012 0.767527 -0.00238496 +v -0.661541 2.90505 -0.919719 +vn -0.608723 0.792992 0.0248966 +v -0.716515 2.86285 -0.988801 +vn -0.658447 0.752162 0.0264644 +v -0.593962 2.97644 -1.12756 +vn -0.602582 0.789899 0.113823 +v -0.531712 3.02521 -1.15249 +vn -0.552561 0.819822 0.150226 +v -0.599687 2.95135 -0.941797 +vn -0.569268 0.820519 0.0517945 +v -0.534525 2.99587 -0.965245 +vn -0.521969 0.849212 0.0799206 +v -0.596997 2.96177 -1.03398 +vn -0.58264 0.807723 0.0900837 +v -0.81612 2.76662 -1.0338 +vn -0.730379 0.682561 -0.025642 +v -0.765948 2.81845 -1.0573 +vn -0.708952 0.705233 0.00567465 +v -0.902137 2.67319 -0.991481 +vn -0.758354 0.647037 -0.0790139 +v -0.861642 2.71783 -1.01158 +vn -0.746622 0.66308 -0.0536802 +v -0.822944 2.763 -0.942978 +vn -0.707502 0.705911 -0.0336313 +v -0.829274 2.762 -0.852232 +vn -0.687482 0.724035 -0.0560477 +v -0.777074 2.80894 -0.874277 +vn -0.666959 0.744506 -0.0295928 +v -0.910995 2.67386 -0.90237 +vn -0.735823 0.671849 -0.0847534 +v -0.919153 2.67712 -0.812912 +vn -0.714258 0.692093 -0.104134 +v -0.876784 2.71771 -0.831524 +vn -0.703185 0.706377 -0.0810038 +v -0.844713 2.80931 -0.508411 +vn -0.630895 0.747192 -0.208985 +v -0.893774 2.77396 -0.485293 +vn -0.639603 0.73596 -0.22197 +v -0.848243 2.83229 -0.421787 +vn -0.620002 0.748076 -0.236599 +v -0.838888 2.77536 -0.674923 +vn -0.656018 0.742426 -0.13581 +v -0.887683 2.73528 -0.655084 +vn -0.668402 0.727616 -0.154316 +v -0.843715 2.78881 -0.590954 +vn -0.643343 0.745157 -0.175645 +v -0.937307 2.74118 -0.46766 +vn -0.644606 0.727829 -0.233982 +v -0.972485 2.7166 -0.447359 +vn -0.644326 0.723628 -0.2474 +v -0.939346 2.76729 -0.384946 +vn -0.63057 0.732824 -0.255636 +v -0.931067 2.69891 -0.636804 +vn -0.675981 0.716557 -0.172034 +v -0.966318 2.67083 -0.615511 +vn -0.676985 0.710942 -0.190399 +v -0.934672 2.71805 -0.551425 +vn -0.65925 0.723273 -0.205584 +v -0.735312 2.91037 -0.462189 +vn -0.59279 0.774075 -0.222278 +v -0.732866 2.88967 -0.547004 +vn -0.598885 0.778453 -0.188009 +v -0.763548 2.87963 -0.493519 +vn -0.604806 0.767976 -0.210765 +v -0.60989 2.98802 -0.509448 +vn -0.546319 0.80975 -0.214104 +v -0.607786 2.96941 -0.59388 +vn -0.547748 0.819327 -0.169339 +v -0.640982 2.95899 -0.539556 +vn -0.561898 0.803603 -0.196196 +v -0.730587 2.8731 -0.632187 +vn -0.607233 0.781083 -0.145528 +v -0.729177 2.86055 -0.719824 +vn -0.618154 0.780093 -0.0966485 +v -0.758736 2.84514 -0.6639 +vn -0.623664 0.770748 -0.130347 +v -0.605976 2.95582 -0.678424 +vn -0.551237 0.826112 -0.116946 +v -0.605821 2.94699 -0.761371 +vn -0.556419 0.828694 -0.0605221 +v -0.637026 2.93053 -0.70957 +vn -0.570789 0.81538 -0.0967231 +v -0.738444 2.93403 -0.377059 +vn -0.589782 0.768966 -0.246675 +v -0.676903 2.97311 -0.39937 +vn -0.572209 0.781749 -0.24788 +v -0.706377 2.94151 -0.43089 +vn -0.582743 0.777913 -0.235078 +v -0.750894 2.98314 -0.203738 +vn -0.59322 0.76066 -0.263603 +v -0.689898 3.02442 -0.221139 +vn -0.586872 0.762867 -0.271323 +v -0.716364 2.99144 -0.25692 +vn -0.588252 0.763559 -0.266341 +v -0.612589 3.01102 -0.423984 +vn -0.547705 0.798218 -0.250735 +v -0.546272 3.04614 -0.451569 +vn -0.516139 0.81823 -0.25318 +v -0.578337 3.01709 -0.479985 +vn -0.531558 0.814225 -0.233418 +v -0.62314 3.06697 -0.243419 +vn -0.569033 0.769964 -0.288715 +v -0.55261 3.10455 -0.2763 +vn -0.538937 0.783523 -0.309256 +v -0.585279 3.07153 -0.303604 +vn -0.546838 0.784816 -0.291602 +v -0.848662 2.859 -0.339644 +vn -0.610831 0.750027 -0.253663 +v -0.822254 2.86424 -0.388511 +vn -0.610705 0.753474 -0.243547 +v -0.941247 2.79514 -0.302951 +vn -0.618445 0.737988 -0.269998 +v -0.897264 2.82516 -0.321812 +vn -0.616879 0.742611 -0.260749 +v -0.853354 2.88353 -0.25785 +vn -0.604531 0.751733 -0.263514 +v -0.858356 2.90905 -0.174046 +vn -0.599197 0.755685 -0.264392 +v -0.830336 2.91498 -0.220552 +vn -0.59924 0.755796 -0.263975 +v -0.943584 2.82349 -0.2213 +vn -0.606718 0.745126 -0.276913 +v -0.948839 2.84885 -0.141694 +vn -0.596272 0.753328 -0.277412 +v -0.905685 2.87862 -0.153962 +vn -0.598366 0.754669 -0.269134 +v -0.899555 2.98518 0.172915 +vn -0.586411 0.784668 -0.201042 +v -0.931671 2.94286 0.103423 +vn -0.575922 0.7861 -0.224411 +v -0.935383 2.96123 0.182215 +vn -0.574744 0.793792 -0.198905 +v -0.875247 2.95469 0.001498 +vn -0.590798 0.769842 -0.241458 +v -0.915963 2.92941 0.019382 +vn -0.583096 0.775643 -0.241612 +v -0.886078 2.97241 0.088169 +vn -0.588591 0.777345 -0.222026 +v -0.970549 2.93863 0.192074 +vn -0.565512 0.800239 -0.199535 +v -0.991648 2.90284 0.115071 +vn -0.566402 0.791122 -0.230902 +v -0.999275 2.91947 0.195744 +vn -0.558113 0.804102 -0.204766 +v -0.956986 2.9011 0.026949 +vn -0.579361 0.776777 -0.246899 +v -0.982399 2.85746 -0.045915 +vn -0.584214 0.765475 -0.269705 +v -0.988361 2.8797 0.032824 +vn -0.574692 0.778317 -0.252886 +v -0.829986 3.05859 0.249092 +vn -0.635878 0.750188 -0.181321 +v -0.812574 3.04921 0.156508 +vn -0.625793 0.751625 -0.208427 +v -0.856657 3.01665 0.167795 +vn -0.605713 0.770064 -0.20028 +v -0.754144 3.13066 0.253431 +vn -0.705022 0.677309 -0.21023 +v -0.728523 3.12631 0.160525 +vn -0.683119 0.690541 -0.2377 +v -0.761177 3.1084 0.203841 +vn -0.677416 0.703752 -0.214103 +v -0.793619 3.03838 0.065867 +vn -0.615638 0.753778 -0.229802 +v -0.777789 3.02294 -0.02371 +vn -0.606396 0.756122 -0.246096 +v -0.810723 3.01283 0.027187 +vn -0.60432 0.761162 -0.235435 +v -0.700732 3.11791 0.062155 +vn -0.655163 0.708635 -0.261912 +v -0.683286 3.11467 0.011155 +vn -0.641153 0.716741 -0.274236 +v -0.710178 3.09114 0.011675 +vn -0.635375 0.727171 -0.259849 +v -0.846358 3.06444 0.33922 +vn -0.646345 0.747835 -0.151594 +v -0.809549 3.0963 0.332483 +vn -0.683462 0.711017 -0.165331 +v -0.819691 3.07888 0.297316 +vn -0.658739 0.73285 -0.170274 +v -0.864923 3.07493 0.524574 +vn -0.66957 0.739687 -0.0673808 +v -0.84162 3.10333 0.611119 +vn -0.723865 0.689537 -0.0236408 +v -0.835533 3.10502 0.548135 +vn -0.715928 0.695725 -0.058423 +v -0.776013 3.13415 0.346485 +vn -0.726161 0.663539 -0.180014 +v -0.735174 3.17324 0.319576 +vn -0.75721 0.616767 -0.215013 +v -0.832108 3.10432 0.507557 +vn -0.711957 0.697215 -0.0837229 +v -0.80343 3.13866 0.529748 +vn -0.764218 0.639479 -0.0838908 +v -0.892451 3.04234 0.437156 +vn -0.62522 0.773987 -0.100223 +v -0.882039 3.03621 0.346813 +vn -0.617762 0.773995 -0.138932 +v -0.917735 3.00957 0.350156 +vn -0.591044 0.794891 -0.13717 +v -0.960709 2.99266 0.445199 +vn -0.570522 0.815556 -0.0968169 +v -0.950851 2.98684 0.357624 +vn -0.571977 0.809101 -0.134898 +v -0.983309 2.9645 0.356845 +vn -0.553277 0.821487 -0.137998 +v -0.898581 3.0463 0.528941 +vn -0.63081 0.773736 -0.0584095 +v -0.931726 3.02068 0.525611 +vn -0.590147 0.805228 -0.0577386 +v -1.01763 2.96234 0.521558 +vn -0.536972 0.841364 -0.0613846 +v -1.01454 2.96829 0.60188 +vn -0.540343 0.841242 -0.0184792 +v -0.995447 2.97616 0.51476 +vn -0.548718 0.833469 -0.0651013 +v -0.332923 3.18954 -1.36591 +vn -0.367776 0.872327 0.322159 +v -0.398312 3.1569 -1.36064 +vn -0.44649 0.849969 0.279641 +v -0.367347 3.15856 -1.31958 +vn -0.397115 0.873659 0.281106 +v -0.321838 3.26433 -1.52144 +vn -0.416347 0.795872 0.439595 +v -0.387563 3.22885 -1.52985 +vn -0.533165 0.767275 0.356403 +v -0.357277 3.22848 -1.48849 +vn -0.457872 0.808931 0.36876 +v -0.462718 3.11687 -1.35149 +vn -0.524267 0.819765 0.230497 +v -0.524204 3.07065 -1.33933 +vn -0.601959 0.777845 0.180561 +v -0.496149 3.08088 -1.29783 +vn -0.547746 0.811997 0.20158 +v -0.453541 3.18051 -1.53569 +vn -0.630167 0.73252 0.257496 +v -0.517266 3.11958 -1.53124 +vn -0.712094 0.688785 0.136007 +v -0.489897 3.13471 -1.48609 +vn -0.639667 0.742757 0.197834 +v -0.202379 3.20326 -1.28958 +vn -0.206116 0.926418 0.315064 +v -0.200357 3.23438 -1.37122 +vn -0.207746 0.903198 0.3756 +v -0.234928 3.20939 -1.32934 +vn -0.244457 0.909866 0.335239 +v -0.067459 3.22441 -1.29497 +vn -0.0632192 0.942266 0.328844 +v -0.066646 3.25516 -1.37442 +vn -0.0615911 0.917216 0.3936 +v -0.10074 3.23621 -1.33485 +vn -0.0969628 0.928813 0.357637 +v -0.200253 3.26944 -1.44755 +vn -0.215729 0.869729 0.443883 +v -0.192095 3.31062 -1.51656 +vn -0.213526 0.823081 0.526256 +v -0.256106 3.29199 -1.51889 +vn -0.308839 0.812201 0.494923 +v -0.066947 3.29123 -1.45033 +vn -0.0601642 0.880814 0.469623 +v -0.063506 3.33235 -1.51931 +vn -0.0539591 0.829426 0.556004 +v -0.127816 3.32315 -1.51576 +vn -0.128473 0.829273 0.543876 +v -0.203609 3.17699 -1.2048 +vn -0.206912 0.943316 0.259506 +v -0.135926 3.1905 -1.20936 +vn -0.136757 0.95421 0.266048 +v -0.169349 3.19691 -1.24958 +vn -0.170439 0.941448 0.290906 +v -0.204645 3.14008 -1.0332 +vn -0.215765 0.965458 0.146071 +v -0.136641 3.1538 -1.03998 +vn -0.145578 0.977909 0.150003 +v -0.170567 3.15476 -1.0792 +vn -0.178469 0.9677 0.178062 +v -0.067972 3.19846 -1.21222 +vn -0.0650593 0.960886 0.269193 +v -0.068378 3.162 -1.04423 +vn -0.0700629 0.985873 0.152136 +v -0.068245 3.17757 -1.12803 +vn -0.0674145 0.975079 0.211367 +v -0.335724 3.15905 -1.27895 +vn -0.351998 0.894236 0.276475 +v -0.337497 3.13323 -1.18993 +vn -0.34462 0.909525 0.232383 +v -0.303537 3.15872 -1.23856 +vn -0.312404 0.912443 0.264296 +v -0.46585 3.08992 -1.25833 +vn -0.497098 0.841246 0.212598 +v -0.468214 3.06657 -1.16505 +vn -0.479595 0.857774 0.184967 +v -0.434901 3.097 -1.21856 +vn -0.45211 0.865566 0.215389 +v -0.338629 3.11234 -1.10054 +vn -0.34337 0.920892 0.184538 +v -0.337693 3.09788 -1.01456 +vn -0.344483 0.92947 0.131974 +v -0.30561 3.11672 -1.06195 +vn -0.312343 0.935735 0.163833 +v -0.470046 3.04751 -1.0724 +vn -0.469781 0.870298 0.147941 +v -0.468238 3.03538 -0.982197 +vn -0.462852 0.880511 0.10232 +v -0.438177 3.05778 -1.03486 +vn -0.435431 0.889926 0.135761 +v -0.341443 3.09585 -0.687303 +vn -0.367081 0.91953 -0.140417 +v -0.408954 3.06987 -0.6659 +vn -0.421192 0.895086 -0.146351 +v -0.34187 3.10987 -0.612531 +vn -0.373914 0.904733 -0.204077 +v -0.340401 3.08426 -0.843638 +vn -0.35686 0.934157 -0.00128967 +v -0.40737 3.05637 -0.826458 +vn -0.414172 0.910115 -0.0123376 +v -0.340939 3.08719 -0.76417 +vn -0.361729 0.929498 -0.0720119 +v -0.475952 3.03995 -0.64268 +vn -0.469541 0.86943 -0.153694 +v -0.542422 3.00709 -0.614218 +vn -0.511697 0.843404 -0.163818 +v -0.478959 3.05597 -0.559331 +vn -0.473458 0.855503 -0.209649 +v -0.473733 3.02415 -0.807235 +vn -0.467301 0.883736 -0.0253104 +v -0.541043 2.98698 -0.783629 +vn -0.515692 0.855688 -0.0431293 +v -0.474807 3.0291 -0.724138 +vn -0.468244 0.878844 -0.0915517 +v -0.205445 3.14754 -0.651411 +vn -0.247206 0.947391 -0.203321 +v -0.205436 3.13518 -0.721355 +vn -0.239868 0.961681 -0.13279 +v -0.273574 3.11771 -0.705987 +vn -0.306858 0.942006 -0.135877 +v -0.068585 3.16649 -0.676557 +vn -0.0853559 0.976014 -0.20028 +v -0.068584 3.15523 -0.744153 +vn -0.0819974 0.988652 -0.12587 +v -0.137085 3.14797 -0.733096 +vn -0.164701 0.977628 -0.130834 +v -0.205276 3.12794 -0.794226 +vn -0.233609 0.970473 -0.0600699 +v -0.205043 3.12614 -0.870364 +vn -0.227655 0.973657 0.0128551 +v -0.272925 3.10759 -0.85838 +vn -0.294552 0.95561 0.00695933 +v -0.068535 3.14893 -0.814942 +vn -0.0790082 0.995572 -0.0509311 +v -0.068463 3.14789 -0.889233 +vn -0.0759459 0.996862 0.0223202 +v -0.136853 3.13966 -0.879485 +vn -0.154602 0.987834 0.016787 +v -0.20522 3.16466 -0.584047 +vn -0.25638 0.92822 -0.269587 +v -0.136852 3.1763 -0.599128 +vn -0.177681 0.945353 -0.273382 +v -0.203477 3.21187 -0.45621 +vn -0.281131 0.878994 -0.385142 +v -0.135583 3.222 -0.47517 +vn -0.19628 0.896783 -0.396552 +v -0.204649 3.18621 -0.518994 +vn -0.26784 0.905055 -0.330359 +v -0.06849 3.18237 -0.611854 +vn -0.0892129 0.958078 -0.272265 +v -0.067881 3.22675 -0.489898 +vn -0.0992019 0.910559 -0.401299 +v -0.068272 3.20256 -0.549733 +vn -0.0938606 0.935853 -0.33966 +v -0.342163 3.12885 -0.539331 +vn -0.383461 0.885785 -0.261425 +v -0.273644 3.14875 -0.563993 +vn -0.324438 0.90793 -0.265335 +v -0.478816 3.0787 -0.477456 +vn -0.478517 0.839448 -0.257581 +v -0.410614 3.10511 -0.511249 +vn -0.434601 0.862801 -0.258257 +v -0.34196 3.15248 -0.467768 +vn -0.39627 0.863218 -0.312769 +v -0.340515 3.18057 -0.398539 +vn -0.41188 0.837771 -0.358461 +v -0.271761 3.19797 -0.430507 +vn -0.352505 0.858682 -0.372029 +v -0.479847 3.10503 -0.397191 +vn -0.488876 0.820135 -0.297284 +v -0.480537 3.13644 -0.315142 +vn -0.505634 0.797491 -0.329154 +v -0.409716 3.15957 -0.361739 +vn -0.462026 0.817604 -0.343592 +v -0.316837 3.33195 -0.159152 +vn -0.497049 0.678907 -0.540397 +v -0.377368 3.3228 -0.110029 +vn -0.556691 0.652869 -0.51367 +v -0.310894 3.37662 -0.113625 +vn -0.526038 0.603523 -0.599203 +v -0.331866 3.24923 -0.268887 +vn -0.4517 0.775764 -0.440633 +v -0.39953 3.23502 -0.218305 +vn -0.507618 0.751915 -0.420652 +v -0.324463 3.28918 -0.211074 +vn -0.473192 0.733276 -0.488258 +v -0.434799 3.31491 -0.052872 +vn -0.613078 0.623056 -0.485733 +v -0.487995 3.30946 0.01212 +vn -0.667546 0.585516 -0.459949 +v -0.42501 3.36403 -0.008607 +vn -0.644631 0.539622 -0.541534 +v -0.468051 3.21607 -0.16344 +vn -0.556392 0.731415 -0.394284 +v -0.53042 3.20308 -0.092723 +vn -0.603575 0.707328 -0.367946 +v -0.488706 3.23592 -0.098017 +vn -0.594539 0.696851 -0.40115 +v -0.188743 3.38945 -0.189089 +vn -0.368135 0.657427 -0.657469 +v -0.191441 3.34884 -0.233067 +vn -0.345833 0.728196 -0.591718 +v -0.254493 3.34103 -0.200188 +vn -0.428237 0.704068 -0.566481 +v -0.063371 3.39502 -0.231839 +vn -0.134648 0.702195 -0.699136 +v -0.064262 3.35644 -0.274795 +vn -0.12561 0.768373 -0.627555 +v -0.128012 3.35473 -0.257404 +vn -0.245243 0.749846 -0.614481 +v -0.194936 3.31028 -0.282933 +vn -0.327048 0.7796 -0.534101 +v -0.198554 3.27428 -0.337492 +vn -0.310578 0.819008 -0.48246 +v -0.264949 3.26309 -0.307187 +vn -0.386968 0.797735 -0.462466 +v -0.065334 3.31988 -0.323364 +vn -0.117994 0.816318 -0.565422 +v -0.066422 3.28579 -0.376223 +vn -0.111302 0.853281 -0.509435 +v -0.132451 3.2825 -0.359735 +vn -0.218569 0.83803 -0.499933 +v -0.188197 3.43164 -0.151929 +vn -0.399828 0.55382 -0.730357 +v -0.126133 3.43514 -0.177967 +vn -0.280731 0.574073 -0.769175 +v -0.255112 3.47805 -0.083126 +vn -0.528857 0.329705 -0.782052 +v -0.194121 3.51924 -0.104843 +vn -0.454586 0.213916 -0.864634 +v -0.197466 3.46955 -0.121901 +vn -0.43863 0.414557 -0.797337 +v -0.063249 3.43539 -0.195672 +vn -0.150241 0.605476 -0.781554 +v -0.132608 3.48376 -0.145944 +vn -0.321798 0.377644 -0.868235 +v -0.065175 3.51934 -0.151 +vn -0.177871 0.269151 -0.94653 +v -0.071775 3.47246 -0.16894 +vn -0.182125 0.468972 -0.864231 +v -0.308887 3.42245 -0.074746 +vn -0.56453 0.493053 -0.66197 +v -0.249297 3.42726 -0.117221 +vn -0.484279 0.520145 -0.703508 +v -0.420941 3.41365 0.029449 +vn -0.677961 0.425057 -0.599746 +v -0.366227 3.41751 -0.025671 +vn -0.622778 0.463972 -0.629982 +v -0.314979 3.46553 -0.042417 +vn -0.605263 0.348045 -0.715906 +v -0.368068 3.46593 0.005338 +vn -0.656794 0.309853 -0.687468 +v -0.318289 3.51314 -0.023012 +vn -0.62898 0.158342 -0.761125 +v -0.423001 3.46405 0.060442 +vn -0.707917 0.269261 -0.652957 +v -0.431738 3.51537 0.083469 +vn -0.72413 0.0723095 -0.685863 +v -0.375507 3.51558 0.027707 +vn -0.677964 0.109872 -0.726838 +v -1.31801 1.10903 0.33947 +vn -0.620757 -0.782759 0.0441402 +v -1.30215 1.10278 0.422115 +vn -0.579762 -0.811584 0.0721675 +v -1.31964 1.11519 0.414791 +vn -0.618181 -0.783485 0.0632682 +v -1.28086 1.09545 0.495209 +vn -0.558455 -0.823731 0.0979527 +v -1.28107 1.08569 0.391778 +vn -0.5593 -0.826846 0.0592436 +v -1.26034 1.07497 0.426104 +vn -0.536297 -0.840493 0.0771825 +v -1.3113 1.13677 0.624933 +vn -0.608826 -0.779008 0.149923 +v -1.31537 1.12722 0.547575 +vn -0.614143 -0.78184 0.107491 +v -1.29096 1.11379 0.579157 +vn -0.57649 -0.806868 0.12893 +v -1.27135 1.11411 0.655744 +vn -0.548468 -0.820233 0.162486 +v -1.27409 1.10175 0.575851 +vn -0.54522 -0.828556 0.127396 +v -1.25606 1.09051 0.577157 +vn -0.524882 -0.841198 0.129939 +v -1.31985 1.10678 0.256759 +vn -0.623954 -0.781162 0.0216169 +v -1.31665 1.10324 0.176568 +vn -0.62454 -0.780984 0.00372628 +v -1.3027 1.09392 0.260866 +vn -0.588861 -0.807842 0.0251893 +v -1.28114 1.07705 0.150022 +vn -0.567678 -0.823245 0.00296406 +v -1.29602 1.08796 0.089895 +vn -0.591831 -0.805958 -0.0129582 +v -1.2773 1.07468 0.088566 +vn -0.563153 -0.826262 -0.0122588 +v -1.26234 1.06641 0.26189 +vn -0.539047 -0.841794 0.0284865 +v -1.25085 1.05759 0.177936 +vn -0.519413 -0.854475 0.0091072 +v -1.24863 1.05783 0.258402 +vn -0.513244 -0.857804 0.0274178 +v -1.27268 1.07348 0.009136 +vn -0.565405 -0.824423 -0.0253748 +v -1.26014 1.06344 0.09078 +vn -0.538613 -0.842499 -0.00955526 +v -1.34004 1.12376 0.256775 +vn -0.659026 -0.75184 0.0204984 +v -1.36042 1.1461 0.339368 +vn -0.705026 -0.708097 0.0391984 +v -1.37973 1.16293 0.259595 +vn -0.746786 -0.66482 0.0180029 +v -1.36034 1.14233 0.25778 +vn -0.701283 -0.712643 0.018478 +v -1.33575 1.1197 0.091758 +vn -0.659073 -0.751927 -0.0151165 +v -1.3155 1.10268 0.091584 +vn -0.623785 -0.781482 -0.0133219 +v -1.35869 1.14014 0.175489 +vn -0.704014 -0.710186 -0.000393397 +v -1.37524 1.15846 0.093316 +vn -0.745287 -0.666449 -0.0198421 +v -1.35593 1.13811 0.09217 +vn -0.700547 -0.713387 -0.0176681 +v -1.31933 1.12086 0.473007 +vn -0.619556 -0.779694 0.0907102 +v -1.33948 1.13192 0.416507 +vn -0.656705 -0.751516 0.062945 +v -1.33699 1.14973 0.579256 +vn -0.651903 -0.748264 0.122977 +v -1.35938 1.15033 0.419728 +vn -0.699712 -0.711609 0.0633645 +v -1.35395 1.15362 0.496341 +vn -0.69372 -0.714511 0.0907011 +v -1.37912 1.17145 0.422045 +vn -0.750531 -0.658022 0.0609119 +v -1.36033 1.1697 0.567613 +vn -0.704921 -0.70144 0.105208 +v -1.35072 1.17494 0.647089 +vn -0.688023 -0.710729 0.146593 +v -1.37481 1.18675 0.579382 +vn -0.741622 -0.660368 0.117942 +v -1.17329 2.01027 -1.49617 +vn -0.734452 0.206688 -0.646421 +v -1.13645 2.00079 -1.53742 +vn -0.678528 0.20559 -0.705218 +v -1.17892 1.94097 -1.50779 +vn -0.740556 0.125248 -0.66022 +v -1.11304 1.98547 -1.56279 +vn -0.656913 0.186443 -0.730551 +v -1.14548 1.92946 -1.54436 +vn -0.69401 0.100226 -0.712955 +v -1.18642 1.87227 -1.50636 +vn -0.749402 0.0109876 -0.662024 +v -1.11701 1.92104 -1.57141 +vn -0.662889 0.0909251 -0.743177 +v -1.15006 1.85715 -1.54442 +vn -0.700519 -0.0104738 -0.713556 +v -1.13005 2.06346 -1.52157 +vn -0.666417 0.279859 -0.691062 +v -1.15824 2.0824 -1.48431 +vn -0.710605 0.298348 -0.637204 +v -1.09739 2.06475 -1.55034 +vn -0.643815 0.280476 -0.711924 +v -1.21653 2.01378 -1.44007 +vn -0.792117 0.211718 -0.572474 +v -1.18721 2.04437 -1.46703 +vn -0.75616 0.255087 -0.602622 +v -1.2428 2.01223 -1.40178 +vn -0.827062 0.215379 -0.519211 +v -1.26903 2.01336 -1.35624 +vn -0.851774 0.216807 -0.476945 +v -1.2369 2.04542 -1.39539 +vn -0.819211 0.26232 -0.509981 +v -1.20228 2.079 -1.42986 +vn -0.779293 0.297367 -0.551612 +v -1.17266 2.1134 -1.45086 +vn -0.745685 0.328765 -0.579541 +v -1.23013 2.07867 -1.38793 +vn -0.812056 0.301309 -0.499778 +v -1.25833 2.078 -1.33899 +vn -0.836211 0.30374 -0.45661 +v -1.2219 2.11275 -1.37908 +vn -0.805523 0.33569 -0.488308 +v -1.22072 1.94731 -1.45407 +vn -0.799708 0.129774 -0.586196 +v -1.20503 1.90758 -1.48188 +vn -0.784436 0.0672628 -0.616551 +v -1.24717 1.97858 -1.40684 +vn -0.834321 0.166728 -0.525461 +v -1.27939 1.94414 -1.36165 +vn -0.866256 0.111837 -0.486922 +v -1.24977 1.94456 -1.41218 +vn -0.837864 0.114268 -0.533785 +v -1.25464 1.9097 -1.40993 +vn -0.84725 0.0631973 -0.527422 +v -1.57291 1.66321 0.486996 +vn -0.963685 -0.260281 0.0597125 +v -1.5686 1.67087 0.576406 +vn -0.964213 -0.253543 0.0775254 +v -1.57962 1.70019 0.531355 +vn -0.967192 -0.244169 0.0701473 +v -1.5357 1.53671 0.487882 +vn -0.953063 -0.297666 0.0553596 +v -1.53272 1.54651 0.578836 +vn -0.953499 -0.292777 0.0715652 +v -1.5437 1.57153 0.531665 +vn -0.9554 -0.288251 0.0642116 +v -1.56305 1.67958 0.663483 +vn -0.964664 -0.24553 0.0955903 +v -1.55599 1.68866 0.749349 +vn -0.964687 -0.236855 0.115237 +v -1.56782 1.71706 0.705785 +vn -0.967901 -0.227276 0.107301 +v -1.52809 1.55443 0.662967 +vn -0.954206 -0.285822 0.0882944 +v -1.5239 1.56739 0.743208 +vn -0.955298 -0.277049 0.103197 +v -1.54556 1.61493 0.664582 +vn -0.95859 -0.269385 0.0924013 +v -1.59529 1.71698 0.301009 +vn -0.969334 -0.244363 0.0260309 +v -1.57719 1.64977 0.302855 +vn -0.962162 -0.271411 0.024082 +v -1.58587 1.68639 0.348625 +vn -0.965923 -0.256573 0.0341047 +v -1.59316 1.70283 0.112472 +vn -0.966514 -0.256409 -0.0102036 +v -1.57459 1.6367 0.114463 +vn -0.95922 -0.282388 -0.0124139 +v -1.58536 1.67307 0.160865 +vn -0.963473 -0.267799 -0.00204554 +v -1.55812 1.58518 0.303786 +vn -0.95627 -0.29166 0.0219542 +v -1.53899 1.52429 0.303575 +vn -0.951887 -0.305822 0.0195811 +v -1.54825 1.55729 0.350177 +vn -0.954192 -0.297715 0.0297137 +v -1.55511 1.57313 0.115902 +vn -0.953288 -0.301692 -0.0149661 +v -1.53567 1.51338 0.116282 +vn -0.948955 -0.31491 -0.0177459 +v -1.5468 1.5455 0.163426 +vn -0.951665 -0.307066 -0.00669696 +v -1.61153 1.78583 0.298576 +vn -0.977449 -0.209304 0.028036 +v -1.61172 1.7785 0.20464 +vn -0.976367 -0.21591 0.00946622 +v -1.60396 1.74779 0.252966 +vn -0.97264 -0.231623 0.0179404 +v -1.63504 1.92614 0.292563 +vn -0.993712 -0.108001 0.0295361 +v -1.63566 1.91545 0.199135 +vn -0.993182 -0.116153 0.00988665 +v -1.63102 1.88586 0.247459 +vn -0.989577 -0.14261 0.0200111 +v -1.60994 1.77043 0.110132 +vn -0.974857 -0.222665 -0.00857136 +v -1.60609 1.76122 0.015304 +vn -0.972737 -0.230388 -0.0265235 +v -1.60011 1.73232 0.063915 +vn -0.969397 -0.244825 -0.0181692 +v -1.63452 1.90568 0.105198 +vn -0.99227 -0.123784 -0.00876931 +v -1.63134 1.89421 0.010869 +vn -0.990841 -0.132319 -0.0269244 +v -1.62835 1.86698 0.059178 +vn -0.987245 -0.158312 -0.0168806 +v -1.59022 1.73044 0.485454 +vn -0.970744 -0.23186 0.0624323 +v -1.60526 1.798 0.483689 +vn -0.978833 -0.193372 0.0670325 +v -1.60023 1.76141 0.438939 +vn -0.974346 -0.218357 0.0544949 +v -1.57902 1.74577 0.662556 +vn -0.971373 -0.215507 0.0999593 +v -1.59292 1.81334 0.660562 +vn -0.979486 -0.173041 0.103264 +v -1.58981 1.77555 0.618625 +vn -0.975011 -0.20203 0.0923994 +v -1.62677 1.93671 0.474452 +vn -0.992919 -0.094424 0.0720848 +v -1.63334 2.00461 0.44238 +vn -0.997773 -0.0243283 0.0621077 +v -1.63356 1.9479 0.383129 +vn -0.994864 -0.08599 0.0533964 +v -1.61128 1.94694 0.653976 +vn -0.990697 -0.080907 0.109421 +v -1.61511 2.01582 0.648656 +vn -0.993491 -0.00850905 0.113588 +v -1.6187 1.98103 0.605802 +vn -0.993745 -0.0486417 0.100521 +v -1.27688 1.10316 -0.326193 +vn -0.61349 -0.781116 -0.116141 +v -1.26811 1.08597 -0.241636 +vn -0.581638 -0.808952 -0.0854009 +v -1.28782 1.10063 -0.242183 +vn -0.614095 -0.784303 -0.0880675 +v -1.23843 1.07539 -0.324669 +vn -0.552486 -0.826052 -0.111345 +v -1.23179 1.06143 -0.239753 +vn -0.527469 -0.84566 -0.0814616 +v -1.24912 1.07269 -0.241177 +vn -0.553949 -0.828363 -0.0833934 +v -1.29731 1.1003 -0.158388 +vn -0.621094 -0.781065 -0.0646582 +v -1.28529 1.08562 -0.074382 +vn -0.588037 -0.807726 -0.0423111 +v -1.30503 1.10046 -0.07481 +vn -0.620261 -0.783122 -0.0446837 +v -1.25883 1.07222 -0.157257 +vn -0.561145 -0.825524 -0.0602204 +v -1.24902 1.06092 -0.073225 +vn -0.537198 -0.842577 -0.0384892 +v -1.26629 1.0722 -0.073918 +vn -0.560734 -0.827008 -0.0404258 +v -1.26425 1.10721 -0.410282 +vn -0.601741 -0.784774 -0.148451 +v -1.25159 1.11604 -0.496789 +vn -0.60089 -0.777399 -0.185962 +v -1.24441 1.09265 -0.409642 +vn -0.571605 -0.807453 -0.145901 +v -1.23409 1.12404 -0.579199 +vn -0.585752 -0.779208 -0.223002 +v -1.21863 1.13966 -0.664616 +vn -0.584956 -0.765658 -0.267571 +v -1.21439 1.10958 -0.577887 +vn -0.558459 -0.799668 -0.220579 +v -1.2256 1.07948 -0.408227 +vn -0.542832 -0.827159 -0.145401 +v -1.21038 1.08513 -0.488495 +vn -0.539929 -0.822932 -0.176803 +v -1.21208 1.06912 -0.397347 +vn -0.519459 -0.844007 -0.133473 +v -1.19548 1.09634 -0.576431 +vn -0.531396 -0.818072 -0.219947 +v -1.17938 1.10779 -0.65132 +vn -0.529809 -0.808768 -0.255336 +v -1.18217 1.0854 -0.566407 +vn -0.509484 -0.835174 -0.20715 +v -1.28442 1.12329 -0.409164 +vn -0.637178 -0.756331 -0.148212 +v -1.31832 1.13964 -0.330308 +vn -0.694117 -0.709075 -0.124157 +v -1.3194 1.1581 -0.417762 +vn -0.725645 -0.669639 -0.158187 +v -1.30414 1.14054 -0.408954 +vn -0.679914 -0.718096 -0.14851 +v -1.25092 1.13872 -0.583857 +vn -0.624635 -0.746687 -0.228668 +v -1.26329 1.16617 -0.634176 +vn -0.657049 -0.708187 -0.258377 +v -1.27952 1.15389 -0.550336 +vn -0.670325 -0.712928 -0.20591 +v -1.29474 1.18005 -0.585326 +vn -0.704436 -0.671443 -0.230074 +v -1.308 1.1174 -0.242931 +vn -0.650564 -0.753901 -0.0916491 +v -1.31123 1.1018 0.008511 +vn -0.625601 -0.779604 -0.0290011 +v -1.32519 1.11732 -0.075112 +vn -0.656405 -0.752919 -0.0473841 +v -1.32803 1.13548 -0.243606 +vn -0.690511 -0.717028 -0.0952081 +v -1.33728 1.1352 -0.159275 +vn -0.698468 -0.712121 -0.0708903 +v -1.3471 1.15501 -0.242332 +vn -0.735228 -0.670798 -0.097319 +v -1.34525 1.13554 -0.075272 +vn -0.697597 -0.7147 -0.0506114 +v -1.35131 1.13701 0.008661 +vn -0.702875 -0.710511 -0.0337737 +v -1.36448 1.1557 -0.075152 +vn -0.742176 -0.668007 -0.0542363 +v -1.45655 1.29044 0.290152 +vn -0.916438 -0.399737 0.0187746 +v -1.45684 1.29069 0.197348 +vn -0.915851 -0.401487 -0.00505967 +v -1.44463 1.26381 0.27863 +vn -0.899017 -0.437797 0.0101711 +v -1.45557 1.29099 0.103591 +vn -0.918439 -0.394643 -0.0269641 +v -1.45067 1.28867 0.01494 +vn -0.914299 -0.402113 -0.0486033 +v -1.44053 1.25807 0.103502 +vn -0.899691 -0.435609 -0.0282989 +v -1.43001 1.23555 0.27108 +vn -0.873407 -0.48679 0.0139766 +v -1.42721 1.22991 0.179116 +vn -0.870772 -0.491671 -0.00400847 +v -1.41244 1.20531 0.254513 +vn -0.841966 -0.539366 0.013345 +v -1.42586 1.22938 0.099807 +vn -0.873297 -0.486501 -0.0258753 +v -1.42119 1.22803 0.013696 +vn -0.86979 -0.491339 -0.0452868 +v -1.41023 1.20389 0.097163 +vn -0.837136 -0.546446 -0.0245027 +v -1.45847 1.30024 0.376147 +vn -0.916393 -0.399153 0.0299939 +v -1.47347 1.33218 0.289977 +vn -0.932768 -0.360246 0.0129197 +v -1.48491 1.36914 0.382605 +vn -0.940037 -0.339714 0.0304141 +v -1.50217 1.41312 0.304038 +vn -0.946339 -0.322648 0.0184641 +v -1.48813 1.37212 0.294558 +vn -0.94155 -0.336617 0.0131283 +v -1.46941 1.32498 0.110175 +vn -0.931731 -0.36229 -0.0249608 +v -1.48678 1.36765 0.203904 +vn -0.939139 -0.343485 -0.00594379 +v -1.49967 1.40758 0.11732 +vn -0.943688 -0.330197 -0.0205571 +v -1.48426 1.3644 0.112909 +vn -0.939179 -0.342512 -0.0250896 +v -1.45744 1.30582 0.458344 +vn -0.917239 -0.394674 0.0538975 +v -1.45617 1.31528 0.541179 +vn -0.915556 -0.396591 0.0668805 +v -1.47248 1.34396 0.464036 +vn -0.933273 -0.355966 0.047852 +v -1.45431 1.32598 0.621222 +vn -0.916811 -0.389848 0.0864675 +v -1.45158 1.33835 0.699882 +vn -0.912961 -0.395444 0.100632 +v -1.4679 1.36218 0.63139 +vn -0.93174 -0.353648 0.0824297 +v -1.48632 1.38301 0.468826 +vn -0.942984 -0.329528 0.0468294 +v -1.50192 1.43031 0.478198 +vn -0.947312 -0.316476 0.0494196 +v -1.50331 1.42308 0.389015 +vn -0.946876 -0.319969 0.0323502 +v -1.48046 1.3992 0.64013 +vn -0.940176 -0.330513 0.0826445 +v -1.49641 1.44896 0.649395 +vn -0.947319 -0.309976 0.0806363 +v -1.49951 1.43875 0.565076 +vn -0.947243 -0.3139 0.0647924 +v -1.44421 1.27482 0.448244 +vn -0.900081 -0.432991 0.0487151 +v -1.43034 1.24015 0.356734 +vn -0.873805 -0.485291 0.0309556 +v -1.4144 1.21881 0.432049 +vn -0.842491 -0.535301 0.0605104 +v -1.42947 1.24547 0.440184 +vn -0.873416 -0.483982 0.0539056 +v -1.44044 1.29237 0.610981 +vn -0.89728 -0.432646 0.0877829 +v -1.42786 1.25319 0.521821 +vn -0.869169 -0.489269 0.071849 +v -1.4101 1.23456 0.592934 +vn -0.830033 -0.548969 0.0983793 +v -1.42568 1.26232 0.601516 +vn -0.867755 -0.487859 0.0948448 +v -1.37131 2.2693 1.41529 +vn -0.805671 0.293189 0.514718 +v -1.34401 2.31682 1.42719 +vn -0.755828 0.341499 0.558662 +v -1.35867 2.31866 1.40513 +vn -0.78951 0.33866 0.511843 +v -1.31561 2.36713 1.43154 +vn -0.718145 0.386715 0.578549 +v -1.32919 2.30744 1.45162 +vn -0.725002 0.331894 0.603505 +v -1.31303 2.32488 1.46043 +vn -0.698192 0.354819 0.621797 +v -1.31195 2.4604 1.36235 +vn -0.748775 0.45932 0.477872 +v -1.32959 2.41206 1.37921 +vn -0.762785 0.417473 0.493837 +v -1.31312 2.41652 1.39906 +vn -0.729413 0.42513 0.535931 +v -1.2803 2.46941 1.39808 +vn -0.689155 0.466778 0.554241 +v -1.29792 2.4198 1.4162 +vn -0.697847 0.429197 0.57341 +v -1.28468 2.42162 1.43006 +vn -0.672839 0.43117 0.60115 +v -1.3821 2.21911 1.42493 +vn -0.815916 0.244023 0.524151 +v -1.39143 2.16815 1.43105 +vn -0.827883 0.192542 0.526817 +v -1.36739 2.21727 1.44711 +vn -0.787324 0.242785 0.566725 +v -1.3984 2.11702 1.43672 +vn -0.836452 0.139775 0.529917 +v -1.40277 2.06775 1.43976 +vn -0.844192 0.0856175 0.529159 +v -1.38342 2.11465 1.45928 +vn -0.80614 0.139149 0.575131 +v -1.35353 2.21558 1.46616 +vn -0.754965 0.242168 0.609412 +v -1.36223 2.16497 1.47309 +vn -0.77057 0.192721 0.60752 +v -1.34049 2.21563 1.48132 +vn -0.727761 0.24622 0.640109 +v -1.36932 2.11223 1.47871 +vn -0.777071 0.137666 0.614173 +v -1.37458 2.05939 1.48118 +vn -0.789316 0.0807911 0.608649 +v -1.35633 2.1105 1.49465 +vn -0.752961 0.138097 0.643412 +v -1.39797 2.22069 1.39757 +vn -0.844105 0.24416 0.47736 +v -1.40387 2.27096 1.35616 +vn -0.857464 0.28983 0.425152 +v -1.43202 2.22131 1.32819 +vn -0.889673 0.241794 0.387321 +v -1.41456 2.22197 1.36596 +vn -0.868743 0.24353 0.431252 +v -1.41437 2.11951 1.4088 +vn -0.865112 0.138432 0.482097 +v -1.43655 2.06803 1.37845 +vn -0.894723 0.0845405 0.438548 +v -1.43084 2.12332 1.37654 +vn -0.888326 0.141699 0.436805 +v -1.44878 2.11999 1.33829 +vn -0.908964 0.13339 0.394959 +v -1.34613 2.36479 1.39116 +vn -0.778467 0.381498 0.498445 +v -1.37435 2.31965 1.3781 +vn -0.820787 0.335872 0.462059 +v -1.34395 2.41569 1.35172 +vn -0.791873 0.419574 0.443729 +v -1.39064 2.32067 1.34679 +vn -0.844829 0.33478 0.417357 +v -1.37602 2.36922 1.33376 +vn -0.830637 0.377731 0.409099 +v -1.40797 2.32065 1.30869 +vn -0.866348 0.331741 0.373349 +v -1.35929 2.41797 1.32052 +vn -0.815783 0.418042 0.399674 +v -1.34155 2.4654 1.30367 +vn -0.800917 0.453837 0.390595 +v -1.37604 2.41807 1.28315 +vn -0.837535 0.414151 0.35639 +v -1.53592 1.65044 -0.452021 +vn -0.939907 -0.31165 -0.139463 +v -1.51567 1.59136 -0.449833 +vn -0.930583 -0.336113 -0.145062 +v -1.53398 1.62492 -0.40524 +vn -0.938446 -0.320511 -0.128809 +v -1.48297 1.59385 -0.631819 +vn -0.918328 -0.343126 -0.197326 +v -1.46486 1.54446 -0.627592 +vn -0.910997 -0.360856 -0.19967 +v -1.47965 1.56075 -0.587818 +vn -0.917714 -0.351091 -0.18584 +v -1.479 1.49111 -0.440641 +vn -0.921534 -0.35877 -0.148525 +v -1.46134 1.44207 -0.431772 +vn -0.921366 -0.358313 -0.150651 +v -1.48679 1.4754 -0.349065 +vn -0.926784 -0.352005 -0.13101 +v -1.44676 1.49542 -0.619862 +vn -0.908254 -0.368474 -0.198245 +v -1.42981 1.45032 -0.613107 +vn -0.906844 -0.370782 -0.200385 +v -1.44558 1.46851 -0.574148 +vn -0.910798 -0.367649 -0.187836 +v -1.55351 1.70835 -0.456333 +vn -0.94966 -0.280433 -0.139654 +v -1.53584 1.70065 -0.550545 +vn -0.942326 -0.288807 -0.169149 +v -1.53521 1.67271 -0.503113 +vn -0.941464 -0.298932 -0.155836 +v -1.58146 1.82255 -0.459948 +vn -0.972184 -0.185484 -0.14302 +v -1.56398 1.81124 -0.553374 +vn -0.966584 -0.18775 -0.174544 +v -1.56722 1.78893 -0.50631 +vn -0.96314 -0.219091 -0.156077 +v -1.51582 1.69422 -0.64225 +vn -0.93429 -0.293903 -0.201797 +v -1.49057 1.68304 -0.735069 +vn -0.92508 -0.298506 -0.234779 +v -1.49186 1.6425 -0.672392 +vn -0.922045 -0.323941 -0.211886 +v -1.54372 1.80195 -0.646065 +vn -0.957969 -0.196556 -0.208955 +v -1.52024 1.79637 -0.739379 +vn -0.950029 -0.19143 -0.246577 +v -1.52582 1.77041 -0.693581 +vn -0.948663 -0.22156 -0.225721 +v -1.56361 1.6665 -0.265906 +vn -0.95206 -0.29213 -0.0907877 +v -1.5813 1.72822 -0.268563 +vn -0.961448 -0.260464 -0.0881788 +v -1.56657 1.69236 -0.314308 +vn -0.953739 -0.283167 -0.100985 +v -1.58278 1.68553 -0.077155 +vn -0.961031 -0.272248 -0.0479539 +v -1.60006 1.75072 -0.079511 +vn -0.969822 -0.239533 -0.0454871 +v -1.58777 1.71285 -0.125674 +vn -0.963282 -0.262476 -0.0565154 +v -1.59659 1.79007 -0.270788 +vn -0.971825 -0.218899 -0.0874028 +v -1.6086 1.85107 -0.272402 +vn -0.982328 -0.164431 -0.0894154 +v -1.59712 1.81378 -0.318794 +vn -0.974689 -0.199987 -0.0999348 +v -1.61478 1.81618 -0.081721 +vn -0.979363 -0.197144 -0.0445311 +v -1.62603 1.88083 -0.083603 +vn -0.988769 -0.142212 -0.0459437 +v -1.61729 1.84188 -0.130008 +vn -0.98256 -0.177725 -0.0546721 +v -1.54434 1.60588 -0.263089 +vn -0.944049 -0.315899 -0.0947587 +v -1.55514 1.6136 -0.169096 +vn -0.949211 -0.306218 -0.0723067 +v -1.55975 1.6402 -0.21748 +vn -0.950339 -0.30047 -0.0810808 +v -1.504 1.49057 -0.257885 +vn -0.93339 -0.343276 -0.104618 +v -1.51542 1.49659 -0.1645 +vn -0.938769 -0.334886 -0.0810221 +v -1.52008 1.52177 -0.212164 +vn -0.937817 -0.335323 -0.089765 +v -1.56381 1.62166 -0.074833 +vn -0.953452 -0.297147 -0.05131 +v -1.57029 1.62952 0.019732 +vn -0.95679 -0.289089 -0.0313241 +v -1.57692 1.65769 -0.028664 +vn -0.958645 -0.281863 -0.039397 +v -1.52437 1.50234 -0.071333 +vn -0.943066 -0.327312 -0.0590965 +v -1.53098 1.50759 0.02247 +vn -0.946394 -0.32078 -0.0379407 +v -1.53773 1.53376 -0.024876 +vn -0.94661 -0.319015 -0.0464559 +v -1.16383 2.86219 0.867921 +vn -0.581504 0.803047 0.130263 +v -1.14937 2.88094 0.804861 +vn -0.537132 0.837872 0.0972661 +v -1.16573 2.8706 0.797935 +vn -0.577387 0.811096 0.0935311 +v -1.13316 2.87996 0.882558 +vn -0.514677 0.846082 0.138755 +v -1.12166 2.89592 0.815995 +vn -0.477885 0.872578 0.101161 +v -1.13488 2.88905 0.810447 +vn -0.504559 0.85752 0.100401 +v -1.16949 2.87485 0.721058 +vn -0.576721 0.815083 0.0550626 +v -1.15424 2.88792 0.655566 +vn -0.523373 0.851831 0.0215619 +v -1.16665 2.88015 0.644045 +vn -0.557732 0.829992 0.00693554 +v -1.13752 2.89424 0.736082 +vn -0.505614 0.860882 0.0568978 +v -1.12678 2.90325 0.664706 +vn -0.465823 0.884723 0.0165411 +v -1.14 2.89611 0.660387 +vn -0.493081 0.869785 0.0185844 +v -1.16284 2.85023 0.935825 +vn -0.586147 0.792248 0.169629 +v -1.16135 2.83718 0.995169 +vn -0.586399 0.783436 0.205826 +v -1.14674 2.85991 0.943913 +vn -0.546161 0.819007 0.175886 +v -1.16729 2.81465 1.05623 +vn -0.603637 0.757706 0.247999 +v -1.17122 2.79161 1.11177 +vn -0.60808 0.740023 0.287411 +v -1.15187 2.82253 1.06796 +vn -0.564397 0.782665 0.262471 +v -1.13242 2.86727 0.951525 +vn -0.514355 0.83753 0.184345 +v -1.13391 2.85018 1.01681 +vn -0.527428 0.818727 0.226949 +v -1.11922 2.87353 0.958789 +vn -0.490141 0.850921 0.188934 +v -1.13756 2.829 1.07775 +vn -0.534712 0.798881 0.275451 +v -1.14193 2.80417 1.13523 +vn -0.545962 0.773 0.323103 +v -1.12417 2.83464 1.08658 +vn -0.510881 0.811432 0.283864 +v -1.18004 2.83918 0.925776 +vn -0.623026 0.764862 0.16378 +v -1.19786 2.81135 0.977924 +vn -0.663112 0.723982 0.190085 +v -1.1991 2.8268 0.906071 +vn -0.661175 0.736946 0.140564 +v -1.22148 2.80083 0.928876 +vn -0.697627 0.69851 0.159375 +v -1.18516 2.80629 1.03653 +vn -0.63562 0.736756 0.230602 +v -1.22995 2.76164 1.03607 +vn -0.723992 0.655102 0.216048 +v -1.20273 2.79017 1.03644 +vn -0.684372 0.695477 0.218968 +v -1.18354 2.85842 0.789012 +vn -0.61721 0.781678 0.0896118 +v -1.17435 2.87432 0.571911 +vn -0.564835 0.82489 -0.0227744 +v -1.1863 2.86583 0.65507 +vn -0.608671 0.79307 0.023666 +v -1.22617 2.81902 0.801142 +vn -0.69323 0.714207 0.0966441 +v -1.2482 2.80432 0.732542 +vn -0.722182 0.688219 0.0693367 +v -1.246 2.79878 0.80096 +vn -0.729872 0.67688 0.0954982 +v -1.23376 2.8247 0.658385 +vn -0.68843 0.724468 0.0347876 +v -1.25592 2.8045 0.585532 +vn -0.713193 0.700945 0.00558073 +v -1.25449 2.80399 0.658412 +vn -0.72437 0.688389 0.0375328 +v -1.42431 1.90401 1.40468 +vn -0.873231 -0.0719295 0.481969 +v -1.44222 1.95646 1.37488 +vn -0.899969 -0.0200724 0.435492 +v -1.44133 1.90104 1.3718 +vn -0.897652 -0.0687734 0.435306 +v -1.42356 2.01345 1.41083 +vn -0.876306 0.0320235 0.48069 +v -1.44076 2.01145 1.37801 +vn -0.899535 0.0308985 0.435755 +v -1.45833 1.89913 1.33331 +vn -0.919291 -0.0665248 0.387917 +v -1.47445 1.95666 1.29926 +vn -0.933082 -0.0175738 0.359233 +v -1.47781 1.90219 1.28431 +vn -0.937893 -0.0627063 0.341211 +v -1.45837 2.01044 1.33873 +vn -0.919708 0.0302619 0.391435 +v -1.47032 2.06815 1.30044 +vn -0.92774 0.0834096 0.363789 +v -1.47842 2.01491 1.28813 +vn -0.937129 0.0314932 0.347558 +v -1.40436 1.85065 1.42783 +vn -0.840041 -0.128301 0.527133 +v -1.39187 1.90291 1.457 +vn -0.818998 -0.0811565 0.568028 +v -1.40776 1.9078 1.43381 +vn -0.846897 -0.0710341 0.52699 +v -1.37448 1.85331 1.47134 +vn -0.787939 -0.137722 0.600155 +v -1.36315 1.89572 1.49351 +vn -0.765013 -0.094409 0.637058 +v -1.3768 1.89923 1.47726 +vn -0.789541 -0.0871175 0.607484 +v -1.40885 1.96284 1.4365 +vn -0.851068 -0.0219848 0.524595 +v -1.39183 2.01018 1.46235 +vn -0.819161 0.0264375 0.572954 +v -1.40694 2.01641 1.43948 +vn -0.848124 0.0365526 0.528535 +v -1.37851 1.95209 1.48001 +vn -0.796757 -0.0330236 0.603397 +v -1.36428 2.00291 1.49848 +vn -0.768342 0.0199932 0.639727 +v -1.37751 2.00543 1.48215 +vn -0.79167 0.0214752 0.610572 +v -1.38368 1.79612 1.44306 +vn -0.79798 -0.187401 0.572808 +v -1.36373 1.74952 1.45242 +vn -0.763831 -0.243222 0.597834 +v -1.36584 1.80373 1.46927 +vn -0.769841 -0.185713 0.610619 +v -1.36889 1.69147 1.41938 +vn -0.760768 -0.292968 0.579139 +v -1.34211 1.63845 1.42365 +vn -0.717585 -0.356581 0.598265 +v -1.3502 1.69805 1.44633 +vn -0.736683 -0.295322 0.608345 +v -1.35135 1.78346 1.4802 +vn -0.74475 -0.217298 0.630975 +v -1.33313 1.67772 1.45597 +vn -0.710227 -0.327136 0.623346 +v -1.39369 1.74153 1.40773 +vn -0.814029 -0.22981 0.533428 +v -1.39984 1.79457 1.41911 +vn -0.82663 -0.179973 0.533191 +v -1.41683 1.79381 1.39061 +vn -0.856013 -0.169588 0.488346 +v -1.42755 1.73867 1.34813 +vn -0.872226 -0.206223 0.443502 +v -1.43391 1.792 1.3584 +vn -0.883955 -0.159845 0.4394 +v -1.45047 1.78908 1.3208 +vn -0.908558 -0.153444 0.388557 +v -1.378 1.64383 1.38051 +vn -0.775207 -0.32905 0.53924 +v -1.38595 1.69072 1.39577 +vn -0.792344 -0.279181 0.542447 +v -1.40307 1.68966 1.36828 +vn -0.826548 -0.265275 0.496435 +v -1.4108 1.6374 1.32318 +vn -0.839649 -0.302374 0.451176 +v -1.41997 1.68725 1.33728 +vn -0.857838 -0.25214 0.447816 +v -1.4363 1.68326 1.30061 +vn -0.886518 -0.241943 0.394398 +v -1.06479 1.67092 -1.58049 +vn -0.636623 -0.299115 -0.710803 +v -1.0736 1.7522 -1.59953 +vn -0.663469 -0.182914 -0.725501 +v -1.03485 1.67826 -1.61139 +vn -0.667662 -0.288037 -0.686485 +v -1.0736 1.83924 -1.61387 +vn -0.701005 -0.0515775 -0.711289 +v -1.04257 1.76668 -1.63335 +vn -0.702629 -0.164091 -0.692377 +v -1.01747 1.72235 -1.64579 +vn -0.688982 -0.237044 -0.684919 +v -1.04151 1.84752 -1.64782 +vn -0.730696 -0.0583706 -0.680203 +v -0.99832 1.77013 -1.67977 +vn -0.711617 -0.179949 -0.679131 +v -1.08711 1.68654 -1.56739 +vn -0.623314 -0.272925 -0.732797 +v -1.11176 1.69565 -1.54969 +vn -0.64113 -0.257183 -0.723056 +v -1.09815 1.75159 -1.57792 +vn -0.648555 -0.180178 -0.739535 +v -1.09796 1.82098 -1.58972 +vn -0.665824 -0.0785605 -0.741962 +v -1.11954 1.77036 -1.56334 +vn -0.661165 -0.144522 -0.736189 +v -1.07221 1.61234 -1.54654 +vn -0.599998 -0.379287 -0.704375 +v -1.04748 1.6054 -1.56389 +vn -0.612217 -0.387099 -0.689452 +v -1.05213 1.5408 -1.51916 +vn -0.57304 -0.478707 -0.66518 +v -1.09783 1.62205 -1.53001 +vn -0.613918 -0.362423 -0.701252 +v -1.07865 1.55086 -1.50365 +vn -0.586812 -0.467829 -0.660899 +v -1.00622 1.63684 -1.61982 +vn -0.657441 -0.347481 -0.668602 +v -1.01642 1.59217 -1.58499 +vn -0.635572 -0.400553 -0.660004 +v -1.02693 1.53252 -1.53495 +vn -0.586637 -0.484784 -0.648723 +v -0.974728 1.59381 -1.62631 +vn -0.64046 -0.397777 -0.656951 +v -0.988242 1.55698 -1.58947 +vn -0.622893 -0.446825 -0.642146 +v -1.1182 2.48642 -0.896687 +vn -0.501134 0.84808 -0.172118 +v -1.11171 2.50554 -0.817437 +vn -0.466093 0.867195 -0.1753 +v -1.10024 2.49552 -0.902321 +vn -0.484237 0.859038 -0.166038 +v -1.13926 2.51107 -0.726046 +vn -0.443543 0.871326 -0.209908 +v -1.13027 2.53523 -0.646413 +vn -0.420793 0.876031 -0.235591 +v -1.12184 2.51841 -0.731729 +vn -0.433152 0.878182 -0.202918 +v -1.08361 2.50366 -0.907977 +vn -0.481497 0.86227 -0.157008 +v -1.08085 2.51965 -0.827618 +vn -0.487113 0.857867 -0.16366 +v -1.06906 2.51093 -0.913175 +vn -0.50107 0.851397 -0.155084 +v -1.10551 2.52513 -0.736735 +vn -0.428622 0.882394 -0.19407 +v -1.10022 2.54673 -0.655557 +vn -0.440382 0.868915 -0.225944 +v -1.09132 2.53111 -0.741325 +vn -0.447921 0.873357 -0.191349 +v -1.15077 2.48718 -0.802143 +vn -0.509247 0.838517 -0.193795 +v -1.13794 2.47548 -0.891024 +vn -0.529199 0.828547 -0.182917 +v -1.15831 2.46339 -0.885248 +vn -0.554765 0.808702 -0.195543 +v -1.19859 2.45704 -0.793737 +vn -0.590029 0.778753 -0.213097 +v -1.17636 2.45361 -0.87252 +vn -0.584952 0.787339 -0.19475 +v -1.19919 2.43186 -0.886039 +vn -0.637853 0.742075 -0.206079 +v -1.16899 2.52024 -0.630724 +vn -0.470941 0.846294 -0.249 +v -1.15476 2.50626 -0.712579 +vn -0.468269 0.856881 -0.215592 +v -1.17659 2.49009 -0.725962 +vn -0.520921 0.82607 -0.215057 +v -1.22975 2.45354 -0.721839 +vn -0.608303 0.760143 -0.228364 +v -1.20166 2.47032 -0.737764 +vn -0.562792 0.797069 -0.218967 +v -1.13495 2.44362 -1.03988 +vn -0.593163 0.779123 -0.202793 +v -1.14579 2.41961 -1.0939 +vn -0.646589 0.728127 -0.227496 +v -1.1518 2.43369 -1.02694 +vn -0.619743 0.759372 -0.198171 +v -1.11731 2.42005 -1.17159 +vn -0.633039 0.730723 -0.255549 +v -1.1343 2.40961 -1.15718 +vn -0.667078 0.704394 -0.242561 +v -1.1729 2.41273 -1.03608 +vn -0.667098 0.713386 -0.214618 +v -1.18731 2.38392 -1.07941 +vn -0.706644 0.663191 -0.246644 +v -1.2021 2.39202 -1.01005 +vn -0.698374 0.682461 -0.215685 +v -1.16883 2.37297 -1.15974 +vn -0.716865 0.64305 -0.269427 +v -1.10544 2.44508 -1.11963 +vn -0.590365 0.778633 -0.212605 +v -1.11522 2.45596 -1.04834 +vn -0.569735 0.798911 -0.192728 +v -1.09576 2.46748 -1.05647 +vn -0.545886 0.817153 -0.185119 +v -1.068 2.46692 -1.13781 +vn -0.560932 0.802019 -0.205233 +v -1.07762 2.47762 -1.06378 +vn -0.533619 0.826186 -0.180741 +v -1.06069 2.48695 -1.07068 +vn -0.533738 0.827636 -0.173617 +v -1.09113 2.414 -1.24611 +vn -0.63632 0.708441 -0.3053 +v -1.09787 2.43162 -1.18461 +vn -0.607156 0.752517 -0.255106 +v -1.07842 2.44285 -1.19648 +vn -0.5847 0.770373 -0.254266 +v -1.06009 2.45332 -1.2059 +vn -0.574966 0.778184 -0.252672 +v -1.04288 2.46322 -1.2142 +vn -0.574451 0.78012 -0.247829 +v -1.22977 2.65282 1.26664 +vn -0.680523 0.604179 0.414556 +v -1.19919 2.69849 1.24635 +vn -0.625497 0.656119 0.42221 +v -1.21363 2.69182 1.23413 +vn -0.666868 0.635747 0.388731 +v -1.1689 2.73335 1.23392 +vn -0.585746 0.696286 0.414834 +v -1.19023 2.68646 1.27677 +vn -0.612527 0.643666 0.458807 +v -1.16745 2.70773 1.27559 +vn -0.580119 0.672788 0.45915 +v -1.19537 2.72898 1.20044 +vn -0.643916 0.674958 0.360284 +v -1.17004 2.77035 1.16342 +vn -0.59318 0.728563 0.34254 +v -1.18992 2.75621 1.15654 +vn -0.647738 0.68944 0.324202 +v -1.14129 2.77707 1.19419 +vn -0.546433 0.745417 0.38179 +v -1.16014 2.76692 1.18629 +vn -0.57601 0.726244 0.375208 +v -1.25082 2.60784 1.29479 +vn -0.702969 0.564242 0.432972 +v -1.26877 2.56169 1.3226 +vn -0.714545 0.531995 0.454321 +v -1.23655 2.61286 1.30998 +vn -0.668179 0.576876 0.469842 +v -1.27603 2.51403 1.36328 +vn -0.702718 0.49965 0.506496 +v -1.26149 2.51683 1.37981 +vn -0.671201 0.504352 0.543248 +v -1.21038 2.61218 1.34453 +vn -0.616435 0.582126 0.530224 +v -1.21686 2.57151 1.37888 +vn -0.616845 0.548725 0.564272 +v -1.19698 2.61885 1.35213 +vn -0.59581 0.591142 0.543655 +v -1.25228 2.51336 1.39354 +vn -0.644749 0.49943 0.578678 +v -1.25685 2.46749 1.42604 +vn -0.646349 0.467514 0.603046 +v -1.23637 2.52277 1.40258 +vn -0.628274 0.510702 0.586904 +v -1.2665 2.60539 1.27064 +vn -0.730911 0.556853 0.394567 +v -1.26276 2.64355 1.21836 +vn -0.738239 0.583555 0.33833 +v -1.29778 2.6029 1.20703 +vn -0.779182 0.54363 0.311996 +v -1.28232 2.60378 1.24195 +vn -0.757057 0.549575 0.353317 +v -1.30674 2.51201 1.31682 +vn -0.761298 0.491667 0.422715 +v -1.29225 2.5096 1.34418 +vn -0.73433 0.492196 0.467443 +v -1.30222 2.55944 1.26451 +vn -0.771164 0.518719 0.369103 +v -1.33835 2.51302 1.24939 +vn -0.809041 0.482034 0.336296 +v -1.32217 2.51325 1.28589 +vn -0.78668 0.487211 0.379157 +v -1.22892 2.68697 1.21373 +vn -0.701775 0.622453 0.346503 +v -1.19837 2.75922 1.13153 +vn -0.673145 0.682275 0.285266 +v -1.25081 2.67616 1.18538 +vn -0.737419 0.604921 0.300472 +v -1.28677 2.64753 1.15009 +vn -0.7679 0.579388 0.273202 +v -1.22781 2.71724 1.15593 +vn -0.712484 0.637743 0.292663 +v -1.2047 2.77169 1.08365 +vn -0.683349 0.684082 0.255081 +v -1.25842 2.70938 1.09045 +vn -0.743424 0.621761 0.246444 +v -1.17382 2.83839 0.276495 +vn -0.513313 0.839267 -0.179277 +v -1.15948 2.82775 0.196515 +vn -0.45338 0.862418 -0.225129 +v -1.17517 2.82142 0.205837 +vn -0.501315 0.839535 -0.209438 +v -1.14043 2.85646 0.276178 +vn -0.438907 0.8775 -0.193272 +v -1.12756 2.84614 0.207567 +vn -0.40417 0.885485 -0.229264 +v -1.14179 2.83915 0.206436 +vn -0.429316 0.875344 -0.222398 +v -1.17351 2.80099 0.128564 +vn -0.488539 0.837291 -0.245507 +v -1.15938 2.78353 0.048593 +vn -0.430702 0.854563 -0.290202 +v -1.17524 2.77824 0.057978 +vn -0.475504 0.836295 -0.272957 +v -1.13908 2.81809 0.126221 +vn -0.416242 0.870911 -0.261261 +v -1.12786 2.7979 0.047443 +vn -0.380483 0.874167 -0.301769 +v -1.14472 2.79644 0.06591 +vn -0.412467 0.867 -0.279609 +v -1.1756 2.85226 0.353695 +vn -0.526088 0.839365 -0.136738 +v -1.17651 2.86144 0.423184 +vn -0.542419 0.83371 -0.103483 +v -1.16046 2.85972 0.345375 +vn -0.47878 0.864723 -0.151734 +v -1.17017 2.87297 0.494133 +vn -0.539156 0.838945 -0.0740449 +v -1.15772 2.88146 0.504735 +vn -0.505511 0.86068 -0.0607243 +v -1.14341 2.87066 0.356813 +vn -0.454443 0.878599 -0.146782 +v -1.14367 2.88181 0.432629 +vn -0.469091 0.87608 -0.111522 +v -1.12968 2.8779 0.359356 +vn -0.426259 0.891659 -0.152469 +v -1.14329 2.88976 0.50835 +vn -0.475291 0.877328 -0.0662831 +v -1.14211 2.89452 0.584143 +vn -0.490302 0.871111 -0.0277436 +v -1.12992 2.89698 0.511459 +vn -0.447882 0.891341 -0.0700984 +v -1.19472 2.83929 0.353421 +vn -0.572928 0.808919 -0.131919 +v -1.21691 2.80963 0.281685 +vn -0.602742 0.782639 -0.155494 +v -1.23915 2.80395 0.353757 +vn -0.654981 0.747545 -0.110346 +v -1.2157 2.82367 0.353157 +vn -0.615985 0.778187 -0.122426 +v -1.19024 2.86016 0.506487 +vn -0.589433 0.806163 -0.0516626 +v -1.21279 2.84442 0.551331 +vn -0.644844 0.76413 -0.0168016 +v -1.20849 2.84441 0.482386 +vn -0.622886 0.779447 -0.0668991 +v -1.23619 2.82174 0.499645 +vn -0.672036 0.739313 -0.0422459 +v -1.19531 2.80884 0.207509 +vn -0.548103 0.812086 -0.200247 +v -1.17611 2.75197 -0.015468 +vn -0.468913 0.829935 -0.302207 +v -1.19594 2.76626 0.060132 +vn -0.52124 0.812149 -0.26215 +v -1.21737 2.79362 0.208948 +vn -0.590354 0.784912 -0.188135 +v -1.21829 2.77351 0.13553 +vn -0.57798 0.78599 -0.219451 +v -1.24163 2.77446 0.210167 +vn -0.630783 0.755783 -0.175797 +v -1.21862 2.7516 0.061832 +vn -0.56386 0.787294 -0.24946 +v -1.21997 2.7255 -0.012093 +vn -0.552512 0.786156 -0.276929 +v -1.24393 2.73287 0.063841 +vn -0.605805 0.760325 -0.234319 +v -0.964536 1.28891 1.49382 +vn -0.507787 -0.697943 0.505004 +v -0.937324 1.24236 1.45204 +vn -0.475708 -0.746125 0.465831 +v -0.910303 1.27114 1.52203 +vn -0.478551 -0.71538 0.509137 +v -1.03669 1.35761 1.50654 +vn -0.561784 -0.626946 0.539757 +v -1.05496 1.32113 1.44188 +vn -0.546425 -0.666815 0.506732 +v -1.01001 1.30973 1.47511 +vn -0.535142 -0.676357 0.506128 +v -0.943231 1.20938 1.38993 +vn -0.459149 -0.772165 0.439254 +v -0.890033 1.19288 1.41475 +vn -0.431336 -0.789702 0.436256 +v -0.992068 1.19023 1.30166 +vn -0.463234 -0.786068 0.409281 +v -0.985177 1.21896 1.362 +vn -0.475286 -0.763171 0.437804 +v -1.03217 1.23982 1.34589 +vn -0.494392 -0.745738 0.446599 +v -0.941341 1.36523 1.60756 +vn -0.524921 -0.615286 0.588116 +v -0.995991 1.383 1.57535 +vn -0.552626 -0.600434 0.578 +v -0.98096 1.33483 1.53631 +vn -0.533392 -0.647897 0.543803 +v -0.970551 1.4709 1.67734 +vn -0.558449 -0.504311 0.658639 +v -1.02603 1.48725 1.64087 +vn -0.586113 -0.492904 0.643053 +v -1.01095 1.43376 1.61031 +vn -0.570328 -0.547961 0.611935 +v -1.04082 1.4039 1.55274 +vn -0.576171 -0.582734 0.573104 +v -1.05998 1.45004 1.5776 +vn -0.593344 -0.535234 0.601222 +v -1.083 1.41361 1.51923 +vn -0.589084 -0.577518 0.565202 +v -1.07562 1.50299 1.60624 +vn -0.607721 -0.482694 0.630621 +v -1.11905 1.51794 1.57479 +vn -0.623075 -0.473887 0.622261 +v -1.10326 1.46533 1.54751 +vn -0.608365 -0.525675 0.594607 +v -0.881483 1.34776 1.64067 +vn -0.492508 -0.63165 0.598711 +v -0.895699 1.39954 1.67973 +vn -0.511466 -0.575562 0.638068 +v -0.747721 1.31568 1.70588 +vn -0.402085 -0.669546 0.624528 +v -0.760707 1.36731 1.74811 +vn -0.42384 -0.605112 0.673943 +v -0.789496 1.34809 1.71113 +vn -0.441595 -0.628689 0.640113 +v -0.909579 1.45452 1.71453 +vn -0.526934 -0.515829 0.675471 +v -0.922547 1.51257 1.74516 +vn -0.538806 -0.453799 0.709756 +v -0.773192 1.42366 1.78677 +vn -0.4384 -0.54031 0.718242 +v -0.784824 1.48371 1.82093 +vn -0.449951 -0.471481 0.758452 +v -0.815287 1.46015 1.78658 +vn -0.471729 -0.501142 0.725485 +v -0.850219 1.25181 1.54902 +vn -0.442646 -0.734957 0.513715 +v -0.866587 1.29863 1.59707 +vn -0.468193 -0.685189 0.557953 +v -0.832112 1.17622 1.43948 +vn -0.397834 -0.808598 0.433471 +v -0.770273 1.15971 1.46265 +vn -0.358942 -0.829473 0.427942 +v -0.822244 1.20624 1.50259 +vn -0.410298 -0.78438 0.465192 +v -0.724167 1.22166 1.60314 +vn -0.36776 -0.765793 0.527555 +v -0.653942 1.20815 1.62878 +vn -0.317211 -0.780086 0.539298 +v -0.715001 1.26266 1.66521 +vn -0.367171 -0.729246 0.577396 +v -0.705934 1.14532 1.48541 +vn -0.316144 -0.846813 0.42774 +v -0.638044 1.13455 1.51141 +vn -0.283322 -0.858353 0.427736 +v -0.712192 1.18087 1.54694 +vn -0.339439 -0.81463 0.470276 +v -0.398778 1.22142 1.75251 +vn -0.167683 -0.771659 0.613534 +v -0.422244 1.17938 1.68825 +vn -0.172195 -0.813915 0.55488 +v -0.340333 1.17365 1.7021 +vn -0.132118 -0.820135 0.556707 +v -0.560267 1.23709 1.7157 +vn -0.260988 -0.755642 0.600742 +v -0.579441 1.19646 1.6516 +vn -0.264774 -0.794421 0.546618 +v -0.502083 1.18692 1.67141 +vn -0.216343 -0.80554 0.551636 +v -0.416406 1.14003 1.62596 +vn -0.156783 -0.861684 0.482618 +v -0.411504 1.10541 1.55987 +vn -0.142452 -0.895291 0.422091 +v -0.373914 1.1192 1.59992 +vn -0.130674 -0.883523 0.449789 +v -0.571501 1.15682 1.59186 +vn -0.244376 -0.842009 0.480937 +v -0.564978 1.12166 1.52821 +vn -0.225656 -0.875752 0.426775 +v -0.5304 1.13386 1.56971 +vn -0.210984 -0.866746 0.451925 +v -0.350896 1.26683 1.81696 +vn -0.150629 -0.722173 0.675113 +v -0.435657 1.27249 1.80135 +vn -0.19484 -0.717197 0.669079 +v -0.364048 1.38017 1.91278 +vn -0.168602 -0.573337 0.801784 +v -0.451647 1.38507 1.8952 +vn -0.21662 -0.570114 0.792494 +v -0.404584 1.35231 1.88262 +vn -0.187719 -0.609207 0.770473 +v -0.518168 1.2799 1.78225 +vn -0.242927 -0.710228 0.660729 +v -0.598001 1.28933 1.75975 +vn -0.294962 -0.700918 0.649393 +v -0.536872 1.39164 1.87375 +vn -0.268149 -0.565714 0.779784 +v -0.619191 1.40013 1.84848 +vn -0.323395 -0.559466 0.76316 +v -0.573582 1.36609 1.84085 +vn -0.289405 -0.598514 0.747011 +v -0.263884 1.26108 1.82744 +vn -0.110549 -0.726043 0.678705 +v -0.26852 1.31635 1.87979 +vn -0.117467 -0.651787 0.74925 +v -0.310225 1.29087 1.84953 +vn -0.13319 -0.685527 0.715761 +v -0.084388 1.21109 1.78916 +vn -0.0316367 -0.782094 0.622357 +v -0.088666 1.25745 1.84202 +vn -0.0336413 -0.722011 0.691063 +v -0.128823 1.22787 1.80695 +vn -0.0503841 -0.759095 0.649027 +v -0.274101 1.3769 1.92668 +vn -0.120477 -0.574751 0.809411 +v -0.283144 1.44105 1.96662 +vn -0.130769 -0.498791 0.8568 +v -0.322375 1.40969 1.94093 +vn -0.148973 -0.536331 0.830757 +v -0.094233 1.3728 1.94153 +vn -0.0370289 -0.579026 0.814468 +v -0.118572 1.43762 1.98193 +vn -0.052391 -0.492954 0.868477 +v -0.150246 1.40304 1.95884 +vn -0.0617059 -0.543132 0.837377 +v -0.25681 1.16945 1.71283 +vn -0.0963073 -0.825351 0.556346 +v -0.172823 1.16604 1.71968 +vn -0.0640211 -0.831337 0.552069 +v -0.230195 1.21027 1.77358 +vn -0.0933213 -0.782767 0.615278 +v -0.250241 1.09605 1.58124 +vn -0.0768424 -0.905373 0.417606 +v -0.167656 1.09351 1.58809 +vn -0.0493437 -0.907988 0.416081 +v -0.210325 1.11117 1.61939 +vn -0.0660094 -0.892032 0.447125 +v -0.08707 1.16721 1.72873 +vn -0.033242 -0.831006 0.555269 +v 0 1.17551 1.7435 +vn -9.67133e-19 -0.822692 0.568487 +v -0.043671 1.1925 1.76658 +vn -0.0164034 -0.802924 0.595856 +v -0.084226 1.09347 1.59543 +vn -0.0250594 -0.908176 0.417838 +v 0 1.09987 1.61183 +vn 1.52281e-06 -0.902804 0.430053 +v -0.042486 1.11318 1.63812 +vn -0.0140006 -0.890009 0.455727 +v -1.07142 1.7235 1.72727 +vn -0.619951 -0.246904 0.744781 +v -1.06277 1.66176 1.71114 +vn -0.615155 -0.310208 0.724814 +v -1.01464 1.71272 1.76946 +vn -0.594158 -0.250651 0.764297 +v -1.16625 1.74433 1.65073 +vn -0.656007 -0.240278 0.715486 +v -1.15731 1.68576 1.63659 +vn -0.65142 -0.30041 0.696711 +v -1.12205 1.73403 1.68721 +vn -0.641368 -0.243285 0.72764 +v -1.05225 1.60163 1.69135 +vn -0.608193 -0.372707 0.70085 +v -1.03994 1.54336 1.66794 +vn -0.598608 -0.434044 0.673256 +v -0.995987 1.58749 1.73114 +vn -0.582288 -0.379669 0.718882 +v -1.14639 1.6284 1.61923 +vn -0.644464 -0.360829 0.674143 +v -1.13357 1.57236 1.59864 +vn -0.635346 -0.417893 0.649385 +v -1.10248 1.61529 1.65358 +vn -0.629593 -0.366301 0.685155 +v -1.02785 1.84192 1.79048 +vn -0.60245 -0.127321 0.787936 +v -1.08288 1.85064 1.74844 +vn -0.626012 -0.118253 0.770796 +v -1.07815 1.78655 1.73971 +vn -0.62343 -0.183322 0.760084 +v -1.0312 1.97647 1.79749 +vn -0.601243 0.013747 0.798948 +v -1.08968 1.98054 1.75192 +vn -0.625711 0.0109577 0.779978 +v -1.0858 1.91547 1.75324 +vn -0.62611 -0.0532557 0.777914 +v -1.13368 1.85731 1.70703 +vn -0.645707 -0.116326 0.754672 +v -1.17797 1.86413 1.66925 +vn -0.660136 -0.114814 0.742319 +v -1.17316 1.80383 1.66162 +vn -0.658953 -0.177125 0.731032 +v -1.14002 1.98301 1.71027 +vn -0.645862 0.0117473 0.763363 +v -1.18381 1.98602 1.6723 +vn -0.659635 0.0128598 0.751476 +v -1.18081 1.92496 1.67345 +vn -0.660134 -0.0502496 0.749466 +v -0.964399 1.83631 1.8359 +vn -0.566591 -0.12596 0.814315 +v -0.967389 1.90705 1.84161 +vn -0.561529 -0.0535448 0.825723 +v -0.997381 1.8741 1.81764 +vn -0.583879 -0.0901787 0.806816 +v -0.822071 1.82214 1.92197 +vn -0.476747 -0.126691 0.869863 +v -0.845791 1.89694 1.91711 +vn -0.495191 -0.0604453 0.866679 +v -0.894509 1.83019 1.88093 +vn -0.521391 -0.121418 0.844636 +v -0.967443 1.97553 1.84314 +vn -0.560926 0.0169919 0.827692 +v -0.984711 2.04587 1.82735 +vn -0.574521 0.0757224 0.814979 +v -0.825633 1.97256 1.93028 +vn -0.477251 0.00823155 0.878728 +v -0.900416 1.95335 1.88695 +vn -0.526572 -0.0071281 0.8501 +v -0.952002 1.69867 1.81181 +vn -0.56706 -0.257755 0.782308 +v -0.958494 1.76567 1.82616 +vn -0.570069 -0.19199 0.79885 +v -0.935921 1.57179 1.76973 +vn -0.552356 -0.393604 0.734833 +v -0.943775 1.63336 1.79326 +vn -0.562343 -0.323952 0.760806 +v -0.884543 1.69185 1.85529 +vn -0.51846 -0.258766 0.815009 +v -0.811169 1.68331 1.89638 +vn -0.466074 -0.260528 0.845518 +v -0.851927 1.72192 1.88418 +vn -0.496996 -0.227822 0.837312 +v -0.868391 1.55866 1.81069 +vn -0.511853 -0.400064 0.760234 +v -0.795149 1.54729 1.85058 +vn -0.458341 -0.401095 0.793125 +v -0.836588 1.58582 1.84439 +vn -0.488109 -0.364114 0.793203 +v -0.479377 1.74175 2.03928 +vn -0.234663 -0.19556 0.952202 +v -0.479051 1.66351 2.02016 +vn -0.240558 -0.267459 0.933058 +v -0.433703 1.70262 2.04127 +vn -0.211699 -0.229872 0.949917 +v -0.652073 1.66576 1.96572 +vn -0.353329 -0.267981 0.896295 +v -0.648786 1.5975 1.94369 +vn -0.348942 -0.341429 0.872735 +v -0.609199 1.62227 1.96796 +vn -0.321098 -0.307852 0.895613 +v -0.469743 1.51699 1.96783 +vn -0.231013 -0.417903 0.87863 +v -0.459114 1.44874 1.93461 +vn -0.224038 -0.4933 0.840513 +v -0.418585 1.48035 1.96219 +vn -0.201566 -0.454819 0.867474 +v -0.637385 1.52846 1.91813 +vn -0.338604 -0.409672 0.847063 +v -0.628967 1.46209 1.88562 +vn -0.333196 -0.486112 0.807883 +v -0.592217 1.49078 1.91625 +vn -0.309113 -0.451193 0.837182 +v -0.483018 1.82299 2.05189 +vn -0.241146 -0.124844 0.962425 +v -0.57436 1.82054 2.0259 +vn -0.296621 -0.127679 0.946422 +v -0.528997 1.77707 2.0328 +vn -0.269001 -0.157415 0.950189 +v -0.484813 1.98748 2.06074 +vn -0.244847 0.0154555 0.969439 +v -0.575459 1.98251 2.03524 +vn -0.299452 0.0137482 0.954012 +v -0.530459 1.94405 2.04846 +vn -0.270551 -0.0205998 0.962485 +v -0.661331 1.82006 1.99569 +vn -0.356762 -0.128914 0.925258 +v -0.744922 1.80448 1.95831 +vn -0.411712 -0.14218 0.900155 +v -0.680744 1.74206 1.97435 +vn -0.375335 -0.199837 0.90509 +v -0.662738 1.97812 2.00503 +vn -0.357667 0.0113213 0.93378 +v -0.746911 1.97415 1.96969 +vn -0.417919 0.00876731 0.908442 +v -0.706524 1.93576 1.98708 +vn -0.388219 -0.021474 0.921317 +v -0.292966 1.74469 2.07593 +vn -0.137532 -0.192259 0.971659 +v -0.294409 1.82796 2.08907 +vn -0.139157 -0.121611 0.982775 +v -0.341553 1.78511 2.0757 +vn -0.162577 -0.157337 0.974071 +v -0.100569 1.75074 2.09514 +vn -0.0515683 -0.18721 0.980965 +v -0.101024 1.83552 2.10813 +vn -0.052263 -0.116839 0.991775 +v -0.147982 1.78961 2.099 +vn -0.0693828 -0.15393 0.985643 +v -0.295282 1.91251 2.09637 +vn -0.140931 -0.051733 0.988667 +v -0.295483 1.99751 2.09778 +vn -0.142856 0.018503 0.989571 +v -0.343611 1.95289 2.09027 +vn -0.166431 -0.0174288 0.985899 +v -0.101251 1.92152 2.11519 +vn -0.0531099 -0.0471439 0.997475 +v -0.101245 2.00786 2.11624 +vn -0.0541022 0.0230581 0.998269 +v -0.148736 1.96087 2.11349 +vn -0.0715985 -0.0143004 0.997331 +v -0.294051 1.66317 2.0565 +vn -0.137007 -0.264323 0.954653 +v -0.196124 1.66347 2.0681 +vn -0.0906531 -0.264708 0.960058 +v -0.244265 1.70425 2.07347 +vn -0.112663 -0.227841 0.967159 +v -0.379733 1.51381 1.98723 +vn -0.181494 -0.417187 0.890514 +v -0.286858 1.50914 2.00133 +vn -0.13427 -0.417405 0.898746 +v -0.345499 1.5489 2.00925 +vn -0.162706 -0.378814 0.911058 +v -0.049078 1.67616 2.08054 +vn -0.0238092 -0.252023 0.967428 +v -0.049245 1.71749 2.09033 +vn -0.0243543 -0.214928 0.976326 +v -0.096616 1.51159 2.02065 +vn -0.0476469 -0.415131 0.908513 +v -0.049135 1.51906 2.02579 +vn -0.0228144 -0.407174 0.913066 +v -0.048675 1.55765 2.04194 +vn -0.0231488 -0.365403 0.930562 +v -1.05707 2.30269 1.70672 +vn -0.601771 0.311243 0.735527 +v -1.06666 2.23865 1.72344 +vn -0.608652 0.257372 0.750535 +v -1.01238 2.24721 1.76332 +vn -0.586229 0.265461 0.765419 +v -1.14989 2.28787 1.63322 +vn -0.633577 0.306784 0.710256 +v -1.16015 2.2275 1.64777 +vn -0.639851 0.254929 0.724984 +v -1.11659 2.23289 1.68385 +vn -0.62683 0.255777 0.735978 +v -1.07474 2.17388 1.73657 +vn -0.613973 0.200673 0.763392 +v -1.08402 2.10885 1.7437 +vn -0.619289 0.141628 0.772284 +v -1.02573 2.11283 1.78835 +vn -0.596145 0.139374 0.790687 +v -1.16874 2.16662 1.65914 +vn -0.646017 0.198465 0.737071 +v -1.1777 2.10561 1.66527 +vn -0.652159 0.140448 0.744958 +v -1.13409 2.10723 1.70265 +vn -0.638876 0.141036 0.756272 +v -1.04591 2.36572 1.68671 +vn -0.595309 0.360931 0.717869 +v -1.09501 2.35626 1.64955 +vn -0.614184 0.358541 0.703012 +v -1.01965 2.48735 1.63763 +vn -0.581475 0.454036 0.675084 +v -1.06371 2.46894 1.61106 +vn -0.599646 0.445738 0.664636 +v -1.03317 2.42728 1.66387 +vn -0.588279 0.407887 0.698252 +v -1.1379 2.34745 1.61575 +vn -0.626633 0.357004 0.692733 +v -1.17188 2.33362 1.59171 +vn -0.634894 0.348757 0.689404 +v -1.10509 2.4646 1.57575 +vn -0.611416 0.448574 0.651883 +v -1.14248 2.44811 1.55158 +vn -0.618973 0.440666 0.650143 +v -1.1242 2.40616 1.59557 +vn -0.619622 0.402974 0.673558 +v -0.939932 2.32418 1.78751 +vn -0.55314 0.31912 0.769544 +v -0.929796 2.39088 1.76458 +vn -0.548087 0.370201 0.750034 +v -0.990799 2.37619 1.72584 +vn -0.57244 0.36401 0.734717 +v -0.801907 2.34193 1.86837 +vn -0.464788 0.324375 0.823865 +v -0.793191 2.41222 1.84301 +vn -0.461963 0.376486 0.803025 +v -0.83407 2.3714 1.83727 +vn -0.486586 0.34876 0.801 +v -0.920491 2.45439 1.73748 +vn -0.540276 0.421536 0.728292 +v -0.906357 2.51605 1.71008 +vn -0.531562 0.463226 0.709129 +v -0.965694 2.50153 1.67337 +vn -0.559053 0.458058 0.691117 +v -0.783455 2.48063 1.81397 +vn -0.459587 0.425526 0.779556 +v -0.772861 2.54682 1.78154 +vn -0.457105 0.472409 0.753581 +v -0.813804 2.50663 1.78058 +vn -0.481502 0.446863 0.753969 +v -0.950288 2.25407 1.80649 +vn -0.554923 0.26739 0.787758 +v -0.881928 2.26112 1.84969 +vn -0.513303 0.265426 0.81613 +v -0.912234 2.2916 1.81946 +vn -0.53279 0.292084 0.794243 +v -0.962296 2.11558 1.83357 +vn -0.562271 0.140003 0.815016 +v -0.894606 2.11727 1.87746 +vn -0.520344 0.141066 0.842225 +v -0.926218 2.15138 1.85084 +vn -0.538766 0.174235 0.824241 +v -0.809436 2.27006 1.8898 +vn -0.467558 0.268845 0.842088 +v -0.732125 2.27974 1.92671 +vn -0.414528 0.272371 0.868321 +v -0.767906 2.31136 1.89827 +vn -0.44119 0.298917 0.846168 +v -0.820363 2.12282 1.91975 +vn -0.472809 0.145354 0.869093 +v -0.74204 2.12884 1.95831 +vn -0.417013 0.148539 0.896681 +v -0.779708 2.16335 1.93356 +vn -0.445161 0.179752 0.877223 +v -0.471036 2.38767 1.9866 +vn -0.252597 0.336012 0.907354 +v -0.475608 2.31062 2.01132 +vn -0.251245 0.280544 0.926375 +v -0.427998 2.35441 2.00959 +vn -0.226204 0.309898 0.923469 +v -0.644206 2.36495 1.93602 +vn -0.358091 0.331559 0.872834 +v -0.65036 2.29001 1.95936 +vn -0.358364 0.275617 0.89197 +v -0.605199 2.33324 1.96268 +vn -0.330835 0.305616 0.892831 +v -0.479386 2.23177 2.03151 +vn -0.250014 0.220536 0.942792 +v -0.482249 2.15141 2.04675 +vn -0.248646 0.155703 0.955998 +v -0.434836 2.19588 2.05037 +vn -0.223239 0.190063 0.956055 +v -0.655426 2.21354 1.97827 +vn -0.358622 0.215577 0.908249 +v -0.659255 2.13586 1.99241 +vn -0.358597 0.15111 0.921181 +v -0.614679 2.17901 2.00113 +vn -0.330238 0.185417 0.925507 +v -0.465778 2.46261 1.95782 +vn -0.254375 0.387322 0.886157 +v -0.55308 2.45068 1.93528 +vn -0.305636 0.385983 0.870404 +v -0.512757 2.41976 1.9618 +vn -0.278999 0.361514 0.889644 +v -0.453671 2.60499 1.88972 +vn -0.260455 0.479257 0.838139 +v -0.538754 2.5917 1.86817 +vn -0.309986 0.479646 0.820883 +v -0.500064 2.56409 1.89752 +vn -0.283489 0.457549 0.842783 +v -0.637106 2.43802 1.9086 +vn -0.358062 0.383773 0.851181 +v -0.717314 2.42506 1.87779 +vn -0.411556 0.380515 0.828149 +v -0.681599 2.39556 1.90768 +vn -0.384963 0.356552 0.851278 +v -0.62066 2.57732 1.84289 +vn -0.359699 0.478709 0.800908 +v -0.698861 2.56223 1.81395 +vn -0.409705 0.476088 0.778127 +v -0.664875 2.5362 1.84634 +vn -0.384448 0.454719 0.803386 +v -0.286794 2.40647 2.02009 +vn -0.151489 0.338221 0.928794 +v -0.28354 2.4825 1.99052 +vn -0.153625 0.38818 0.908689 +v -0.33182 2.44055 1.99907 +vn -0.17757 0.363705 0.914433 +v -0.096003 2.42131 2.03545 +vn -0.0522129 0.34158 0.938401 +v -0.094865 2.49769 2.00538 +vn -0.0532501 0.390292 0.91915 +v -0.14321 2.4549 2.01943 +vn -0.077793 0.36473 0.927858 +v -0.279953 2.55597 1.95745 +vn -0.156451 0.433985 0.887232 +v -0.276099 2.62662 1.92141 +vn -0.16026 0.47612 0.864654 +v -0.323522 2.58707 1.93327 +vn -0.18354 0.456268 0.870708 +v -0.093626 2.57142 1.97198 +vn -0.0546651 0.434445 0.899038 +v -0.092304 2.64226 1.93581 +vn -0.0565211 0.474742 0.878308 +v -0.139541 2.6024 1.95305 +vn -0.0817686 0.454002 0.887241 +v -0.289635 2.32815 2.04567 +vn -0.149783 0.283652 0.947157 +v -0.193847 2.33468 2.05629 +vn -0.100244 0.284693 0.953363 +v -0.240764 2.37114 2.0392 +vn -0.125664 0.312271 0.941645 +v -0.293805 2.16573 2.08275 +vn -0.146651 0.159306 0.976276 +v -0.196726 2.17131 2.09391 +vn -0.0979782 0.160697 0.982129 +v -0.244738 2.21005 2.08148 +vn -0.122669 0.193413 0.973418 +v -0.097009 2.34254 2.06162 +vn -0.0544847 0.288298 0.955989 +v -0.048497 2.35275 2.06045 +vn -0.0266359 0.295217 0.955059 +v -0.048233 2.39139 2.04799 +vn -0.0271042 0.324963 0.945338 +v -0.049268 2.1875 2.1008 +vn -0.0263278 0.171248 0.984876 +v -0.049101 2.2291 2.09274 +vn -0.0269199 0.204233 0.978552 +v -0.94244 2.75708 1.46154 +vn -0.544314 0.654558 0.524667 +v -0.95734 2.70836 1.50366 +vn -0.550518 0.618345 0.560873 +v -0.907023 2.72675 1.53173 +vn -0.532561 0.622706 0.573251 +v -1.02594 2.63477 1.51214 +vn -0.578908 0.568812 0.584225 +v -0.999283 2.68713 1.48495 +vn -0.566676 0.608048 0.556018 +v -1.04075 2.67706 1.45288 +vn -0.575369 0.608203 0.546844 +v -0.973047 2.65678 1.54197 +vn -0.559137 0.577877 0.594496 +v -0.989043 2.60253 1.57686 +vn -0.566739 0.538215 0.623804 +v -0.936744 2.6191 1.60891 +vn -0.545381 0.54319 0.638361 +v -1.05932 2.52589 1.57417 +vn -0.596352 0.487777 0.637525 +v -1.03262 2.58214 1.55384 +vn -0.584875 0.527978 0.61576 +v -1.07576 2.5744 1.51859 +vn -0.595275 0.52851 0.605248 +v -0.927013 2.80374 1.41592 +vn -0.540935 0.68775 0.484138 +v -0.967699 2.78158 1.40142 +vn -0.550067 0.68256 0.481184 +v -0.864032 2.90791 1.32606 +vn -0.552086 0.730136 0.40262 +v -0.909621 2.88461 1.30568 +vn -0.550528 0.737583 0.391012 +v -0.903317 2.85258 1.3698 +vn -0.543606 0.712198 0.444147 +v -1.00762 2.7697 1.37202 +vn -0.555007 0.684717 0.472366 +v -1.02335 2.79939 1.30645 +vn -0.544246 0.720797 0.42924 +v -1.03971 2.75636 1.35351 +vn -0.555706 0.68451 0.471844 +v -0.945056 2.87093 1.28149 +vn -0.547776 0.745871 0.37897 +v -0.950528 2.89609 1.21924 +vn -0.544327 0.769836 0.333257 +v -0.984175 2.84906 1.26842 +vn -0.541432 0.748578 0.382731 +v -0.838849 2.79678 1.515 +vn -0.511772 0.658251 0.552083 +v -0.824994 2.84644 1.46572 +vn -0.518571 0.681951 0.515778 +v -0.878412 2.82438 1.44013 +vn -0.530944 0.685643 0.497989 +v -0.713358 2.8425 1.57001 +vn -0.466649 0.654324 0.595062 +v -0.708808 2.89216 1.516 +vn -0.47911 0.681331 0.553392 +v -0.74348 2.85509 1.53112 +vn -0.483663 0.668632 0.564803 +v -0.812977 2.93304 1.35003 +vn -0.544944 0.72214 0.426087 +v -0.816948 2.9678 1.27978 +vn -0.57117 0.733749 0.367936 +v -0.697744 2.94518 1.45799 +vn -0.502277 0.688883 0.522644 +v -0.694407 2.99503 1.39273 +vn -0.539561 0.686653 0.487217 +v -0.756058 2.95039 1.39014 +vn -0.527728 0.709511 0.467008 +v -0.851641 2.7458 1.56113 +vn -0.510739 0.626491 0.588773 +v -0.791326 2.76551 1.59077 +vn -0.486876 0.628263 0.606825 +v -0.879239 2.63606 1.64209 +vn -0.519576 0.54895 0.654748 +v -0.816686 2.65351 1.67516 +vn -0.48949 0.554591 0.672925 +v -0.865233 2.69223 1.60339 +vn -0.514069 0.589082 0.62347 +v -0.725939 2.78828 1.6178 +vn -0.462699 0.629998 0.623709 +v -0.656306 2.80589 1.64829 +vn -0.419767 0.629322 0.654026 +v -0.685691 2.82472 1.6097 +vn -0.443987 0.642598 0.624455 +v -0.749072 2.6742 1.70534 +vn -0.460334 0.559425 0.689301 +v -0.678075 2.68875 1.7375 +vn -0.410857 0.561619 0.718179 +v -0.708867 2.70979 1.70197 +vn -0.434843 0.579501 0.689268 +v -0.418543 2.91299 1.67499 +vn -0.306847 0.63529 0.708697 +v -0.426892 2.8554 1.72184 +vn -0.293897 0.617769 0.729374 +v -0.382412 2.89061 1.7092 +vn -0.27543 0.623531 0.731675 +v -0.556049 2.88328 1.63462 +vn -0.380112 0.642595 0.665272 +v -0.583379 2.82235 1.67643 +vn -0.377969 0.625697 0.68238 +v -0.50739 2.83902 1.70067 +vn -0.337845 0.623564 0.705002 +v -0.43334 2.79645 1.76731 +vn -0.28087 0.590544 0.756551 +v -0.440221 2.7355 1.81043 +vn -0.272018 0.558423 0.78369 +v -0.394837 2.7729 1.79853 +vn -0.252398 0.573179 0.77959 +v -0.592819 2.76545 1.72155 +vn -0.370803 0.59823 0.710371 +v -0.602233 2.70547 1.76488 +vn -0.365199 0.562813 0.741533 +v -0.558539 2.7439 1.7561 +vn -0.345636 0.580745 0.737069 +v -0.411081 2.96668 1.62928 +vn -0.317703 0.640016 0.699603 +v -0.49033 2.93932 1.61643 +vn -0.356171 0.646829 0.674355 +v -0.321691 3.07562 1.57029 +vn -0.289838 0.630919 0.719677 +v -0.400602 3.07829 1.53145 +vn -0.35627 0.632858 0.687432 +v -0.387369 3.02434 1.58757 +vn -0.323163 0.638009 0.698935 +v -0.564913 2.93633 1.57588 +vn -0.410551 0.657296 0.631989 +v -0.477796 3.064 1.50047 +vn -0.415136 0.642231 0.644361 +v -0.554141 3.04955 1.46055 +vn -0.477329 0.652576 0.588474 +v -0.518653 3.02746 1.51076 +vn -0.425743 0.65305 0.626314 +v -0.255135 2.9363 1.71209 +vn -0.201777 0.619127 0.758926 +v -0.251217 2.99232 1.66662 +vn -0.215671 0.629766 0.746244 +v -0.29432 2.95923 1.68149 +vn -0.237728 0.628967 0.740193 +v -0.087231 2.95066 1.73115 +vn -0.0720991 0.613781 0.786177 +v -0.083623 3.00548 1.68816 +vn -0.0688358 0.62263 0.779483 +v -0.126724 2.97587 1.70669 +vn -0.110132 0.619628 0.777131 +v -0.244994 3.0476 1.62155 +vn -0.226192 0.632083 0.741153 +v -0.241342 3.10094 1.57721 +vn -0.236555 0.628726 0.740774 +v -0.082056 3.06003 1.64436 +vn -0.0718111 0.627836 0.775026 +v -0.081058 3.11426 1.60036 +vn -0.0771055 0.629705 0.772999 +v -0.121838 3.08515 1.61885 +vn -0.120089 0.629282 0.767843 +v -0.259402 2.87908 1.75668 +vn -0.190288 0.60219 0.775344 +v -0.173411 2.88729 1.76816 +vn -0.132254 0.596487 0.791652 +v -0.214757 2.91233 1.741 +vn -0.166815 0.608973 0.775451 +v -0.267891 2.75849 1.84239 +vn -0.171994 0.549485 0.817609 +v -0.179157 2.76649 1.85275 +vn -0.118452 0.545308 0.829824 +v -0.221915 2.79389 1.82729 +vn -0.149323 0.562752 0.813027 +v -0.086605 2.89509 1.77344 +vn -0.0696141 0.594145 0.80134 +v 0 2.90928 1.76679 +vn -1.41517e-06 0.596777 0.802407 +v -0.042861 2.93102 1.74945 +vn -0.036786 0.606053 0.794573 +v -0.08952 2.7744 1.85735 +vn -0.0620558 0.543894 0.836856 +v 0 2.78961 1.85085 +vn 2.62419e-18 0.54807 0.836432 +v -0.04434 2.81311 1.83429 +vn -0.0331861 0.560348 0.827592 +v -0.645755 4.15026 -0.243796 +vn -0.638032 -0.461209 -0.616605 +v -0.692193 4.16076 -0.200417 +vn -0.680545 -0.445964 -0.581357 +v -0.663007 4.1771 -0.24522 +vn -0.658474 -0.42929 -0.61816 +v -0.610635 4.03516 -0.181545 +vn -0.608488 -0.557983 -0.564267 +v -0.656788 4.04791 -0.141642 +vn -0.643349 -0.546638 -0.535993 +v -0.620285 4.06245 -0.197214 +vn -0.616949 -0.535013 -0.577179 +v -0.818717 4.21073 -0.065605 +vn -0.786634 -0.385401 -0.482362 +v -0.852449 4.22316 -0.016368 +vn -0.824183 -0.359311 -0.437743 +v -0.83288 4.23904 -0.063855 +vn -0.808053 -0.343733 -0.478434 +v -0.780077 4.08926 -0.012415 +vn -0.741345 -0.503608 -0.443606 +v -0.815022 4.10379 0.032954 +vn -0.77302 -0.483898 -0.410223 +v -0.791111 4.11836 -0.025668 +vn -0.753982 -0.476017 -0.452679 +v -0.486676 4.10899 -0.353365 +vn -0.51403 -0.497084 -0.699058 +v -0.449607 4.12712 -0.391762 +vn -0.48212 -0.47988 -0.732991 +v -0.431136 4.1019 -0.386537 +vn -0.46123 -0.506114 -0.728777 +v -0.251016 4.07365 -0.457974 +vn -0.297267 -0.527005 -0.796177 +v -0.207901 4.09491 -0.486335 +vn -0.247575 -0.507302 -0.82544 +v -0.189703 4.07139 -0.476561 +vn -0.222977 -0.531004 -0.817506 +v -0.458868 4.00133 -0.287754 +vn -0.491687 -0.582246 -0.647482 +v -0.411735 4.01764 -0.335201 +vn -0.45134 -0.568424 -0.687886 +v -0.404833 3.99175 -0.317839 +vn -0.446807 -0.588733 -0.673615 +v -0.234597 3.96956 -0.387992 +vn -0.286396 -0.602583 -0.744897 +v -0.179314 3.98932 -0.422101 +vn -0.225056 -0.587431 -0.777351 +v -0.176037 3.96433 -0.403768 +vn -0.223555 -0.606117 -0.763312 +v -0.4991 4.21785 -0.410483 +vn -0.528995 -0.383529 -0.757014 +v -0.441915 4.20328 -0.440471 +vn -0.473541 -0.397264 -0.786091 +v -0.455721 4.18254 -0.421086 +vn -0.489648 -0.418892 -0.764705 +v -0.495661 4.33464 -0.462563 +vn -0.529334 -0.276601 -0.802058 +v -0.438274 4.32388 -0.494396 +vn -0.477404 -0.290382 -0.829315 +v -0.439709 4.29426 -0.482529 +vn -0.477349 -0.318436 -0.818985 +v -0.258785 4.18117 -0.516963 +vn -0.303194 -0.419538 -0.855605 +v -0.195712 4.17184 -0.532013 +vn -0.227089 -0.427742 -0.87491 +v -0.211524 4.1497 -0.516521 +vn -0.250454 -0.451024 -0.856651 +v -0.255888 4.29909 -0.568064 +vn -0.299462 -0.32235 -0.898005 +v -0.192724 4.29369 -0.584795 +vn -0.231905 -0.330136 -0.915003 +v -0.193491 4.26371 -0.573215 +vn -0.232131 -0.355792 -0.905278 +v -0.555082 4.22639 -0.373399 +vn -0.571995 -0.37363 -0.730221 +v -0.554679 4.25938 -0.389771 +vn -0.576235 -0.346572 -0.740163 +v -0.706679 4.27178 -0.253978 +vn -0.705784 -0.321115 -0.631469 +v -0.751862 4.28376 -0.206964 +vn -0.741104 -0.303803 -0.598723 +v -0.751508 4.31675 -0.223149 +vn -0.746781 -0.27515 -0.605483 +v -0.551132 4.3464 -0.427696 +vn -0.578276 -0.261614 -0.772758 +v -0.548406 4.37617 -0.439069 +vn -0.578136 -0.231784 -0.782326 +v -0.702042 4.38745 -0.30634 +vn -0.710709 -0.206531 -0.672486 +v -0.746578 4.40269 -0.261292 +vn -0.751019 -0.184217 -0.634062 +v -0.742925 4.43171 -0.273121 +vn -0.750526 -0.152877 -0.642914 +v -0.151867 3.75351 1.32164 +vn -0.128406 -0.343311 0.930403 +v -0.226739 3.75796 1.30956 +vn -0.192969 -0.363412 0.911425 +v -0.222638 3.71718 1.297 +vn -0.202504 -0.258369 0.944583 +v -0.147032 3.67171 1.30207 +vn -0.141533 -0.114643 0.983273 +v -0.218982 3.67448 1.28839 +vn -0.21278 -0.133193 0.96798 +v -0.217072 3.62948 1.28628 +vn -0.224554 0.00359671 0.974455 +v -0.075984 3.74997 1.32722 +vn -0.0634133 -0.336007 0.939722 +v -0.074667 3.71018 1.31591 +vn -0.0672739 -0.224078 0.972247 +v -0.073529 3.66864 1.30861 +vn -0.0708053 -0.0954032 0.992917 +v -0.073333 3.6247 1.30802 +vn -0.0761493 0.045866 0.996041 +v -0.364582 3.72709 1.25792 +vn -0.350924 -0.301807 0.886434 +v -0.429511 3.69389 1.21866 +vn -0.441424 -0.25324 0.860822 +v -0.365711 3.67613 1.24307 +vn -0.380611 -0.182536 0.90654 +v -0.493717 3.7358 1.19692 +vn -0.505455 -0.335711 0.794867 +v -0.541954 3.69674 1.14797 +vn -0.591883 -0.273164 0.758324 +v -0.491219 3.68575 1.18032 +vn -0.531741 -0.239837 0.812238 +v -0.352746 3.62868 1.24296 +vn -0.395434 -0.0405159 0.917601 +v -0.412049 3.58485 1.2149 +vn -0.478904 0.0523568 0.876305 +v -0.357554 3.57759 1.24245 +vn -0.412288 0.0995517 0.905598 +v -0.476654 3.64008 1.17935 +vn -0.540249 -0.129267 0.831517 +v -0.470731 3.58677 1.17938 +vn -0.559975 0.00893602 0.828461 +v -0.416495 3.63663 1.21368 +vn -0.458006 -0.0979742 0.883534 +v -0.439914 3.77786 1.24684 +vn -0.407758 -0.409518 0.816105 +v -0.371167 3.77022 1.27242 +vn -0.331753 -0.39599 0.856231 +v -0.378526 3.81038 1.29093 +vn -0.320355 -0.471505 0.821618 +v -0.45693 3.86092 1.28893 +vn -0.388835 -0.527459 0.755377 +v -0.385713 3.84833 1.31161 +vn -0.312722 -0.528751 0.789068 +v -0.389783 3.88142 1.33393 +vn -0.302788 -0.572259 0.762128 +v -0.565992 3.79804 1.17886 +vn -0.55241 -0.43019 0.713988 +v -0.511355 3.78256 1.20825 +vn -0.493069 -0.414756 0.764761 +v -0.514801 3.82725 1.23285 +vn -0.474374 -0.476323 0.740328 +v -0.597414 3.89841 1.22513 +vn -0.543838 -0.522638 0.656575 +v -0.533535 3.87021 1.25038 +vn -0.472808 -0.521578 0.710217 +v -0.535531 3.91065 1.2805 +vn -0.457219 -0.556457 0.693762 +v -0.231041 3.79588 1.32651 +vn -0.184921 -0.449783 0.873785 +v -0.157406 3.82611 1.35641 +vn -0.117221 -0.504233 0.855575 +v -0.235266 3.83171 1.34576 +vn -0.178245 -0.516496 0.837533 +v -0.077398 3.78696 1.34304 +vn -0.0602653 -0.427719 0.9019 +v -0.078818 3.82206 1.36127 +vn -0.0571601 -0.500784 0.863683 +v -0.238899 3.86457 1.36711 +vn -0.173564 -0.567868 0.804613 +v -0.160065 3.89134 1.40098 +vn -0.108413 -0.605582 0.788363 +v -0.242393 3.89523 1.38905 +vn -0.168994 -0.606226 0.77713 +v -0.080005 3.8543 1.3818 +vn -0.0542437 -0.557564 0.82836 +v -0.080398 3.88421 1.40296 +vn -0.0532631 -0.599828 0.798355 +v -0.740915 3.78751 0.970685 +vn -0.803651 -0.389526 0.449905 +v -0.702835 3.77814 1.0236 +vn -0.752954 -0.389966 0.530081 +v -0.722118 3.83643 1.04189 +vn -0.742406 -0.427111 0.516149 +v -0.70904 3.68162 0.945134 +vn -0.833923 -0.31101 0.4559 +v -0.670347 3.65849 0.99493 +vn -0.800193 -0.268291 0.536386 +v -0.685402 3.71923 1.00781 +vn -0.770445 -0.341115 0.538568 +v -0.658434 3.76744 1.07304 +vn -0.69847 -0.384928 0.6033 +v -0.608313 3.75786 1.11959 +vn -0.636172 -0.375477 0.674019 +v -0.622865 3.81034 1.13806 +vn -0.620402 -0.433748 0.653425 +v -0.629216 3.65108 1.04705 +vn -0.750833 -0.233918 0.617683 +v -0.583259 3.64714 1.09589 +vn -0.687947 -0.200316 0.697569 +v -0.594773 3.7033 1.10521 +vn -0.659266 -0.298581 0.690086 +v -0.77449 3.79815 0.912695 +vn -0.846199 -0.3909 0.362138 +v -0.74463 3.73118 0.913733 +vn -0.852981 -0.352189 0.385209 +v -0.850989 3.8873 0.801853 +vn -0.892568 -0.409767 0.188185 +v -0.820956 3.81348 0.784706 +vn -0.901878 -0.397806 0.168424 +v -0.809765 3.82628 0.852712 +vn -0.875802 -0.398567 0.27224 +v -0.733292 3.66731 0.88313 +vn -0.884307 -0.30609 0.352575 +v -0.791575 3.73921 0.770715 +vn -0.916126 -0.372362 0.148525 +v -0.765492 3.66478 0.754561 +vn -0.937274 -0.328071 0.117846 +v -0.753444 3.66549 0.819266 +vn -0.918864 -0.316939 0.235029 +v -0.784974 3.91185 1.01004 +vn -0.78788 -0.437397 0.433507 +v -0.824911 3.93435 0.953156 +vn -0.829627 -0.426862 0.359872 +v -0.80041 3.86723 0.930561 +vn -0.834817 -0.417171 0.359234 +v -0.823274 4.02813 1.058 +vn -0.797674 -0.419969 0.43283 +v -0.866188 4.05839 1.00171 +vn -0.839891 -0.391327 0.376093 +v -0.846574 3.99794 0.978551 +vn -0.829076 -0.422136 0.366653 +v -0.905122 4.03859 0.865123 +vn -0.892465 -0.386638 0.232418 +v -0.881762 3.9648 0.824526 +vn -0.890503 -0.407164 0.203032 +v -0.864927 3.97402 0.900502 +vn -0.863315 -0.415585 0.286315 +v -0.902826 4.08679 0.940828 +vn -0.880183 -0.364252 0.3043 +v -0.9351 4.11849 0.874961 +vn -0.910484 -0.337745 0.238634 +v -0.740989 3.89375 1.06422 +vn -0.736698 -0.450644 0.504178 +v -0.758467 3.94831 1.0885 +vn -0.73722 -0.459651 0.495205 +v -0.637891 3.86037 1.15933 +vn -0.612499 -0.475845 0.631202 +v -0.657428 3.90392 1.17434 +vn -0.619594 -0.496196 0.608189 +v -0.691926 3.87636 1.1139 +vn -0.678433 -0.46435 0.569304 +v -0.7753 4.00038 1.11183 +vn -0.744941 -0.450561 0.491994 +v -0.79723 4.05183 1.12413 +vn -0.766067 -0.416747 0.489349 +v -0.664523 3.94717 1.20348 +vn -0.616242 -0.509695 0.600381 +v -0.687816 3.99462 1.21948 +vn -0.639867 -0.49633 0.586708 +v -0.722573 3.97463 1.16137 +vn -0.686188 -0.479833 0.546724 +v -0.800231 3.79608 0.508024 +vn -0.874203 -0.43404 -0.217667 +v -0.81824 3.8038 0.578602 +vn -0.898193 -0.418428 -0.134789 +v -0.839771 3.87105 0.514094 +vn -0.876255 -0.449283 -0.174131 +v -0.730389 3.65327 0.490844 +vn -0.890429 -0.34081 -0.301636 +v -0.751262 3.65767 0.557321 +vn -0.916099 -0.340204 -0.212189 +v -0.76314 3.72329 0.500349 +vn -0.878794 -0.399222 -0.261424 +v -0.828864 3.81128 0.650467 +vn -0.911591 -0.409031 -0.0411623 +v -0.828467 3.81204 0.720363 +vn -0.912563 -0.404024 0.0631868 +v -0.846806 3.85002 0.690361 +vn -0.910715 -0.41247 0.0216045 +v -0.764384 3.66119 0.62361 +vn -0.934418 -0.338633 -0.110412 +v -0.769226 3.66362 0.689448 +vn -0.942162 -0.335152 0.0017833 +v -0.794104 3.73362 0.635707 +vn -0.920669 -0.38267 -0.0770258 +v -0.782027 3.84577 0.364493 +vn -0.810187 -0.499542 -0.306684 +v -0.740501 3.77643 0.366142 +vn -0.807521 -0.472597 -0.352934 +v -0.774199 3.78681 0.437095 +vn -0.843241 -0.452607 -0.289985 +v -0.69522 3.81782 0.220157 +vn -0.729187 -0.549065 -0.408428 +v -0.651166 3.75391 0.225371 +vn -0.729078 -0.511068 -0.455253 +v -0.699383 3.76534 0.295472 +vn -0.769138 -0.492487 -0.407288 +v -0.701631 3.70858 0.364271 +vn -0.813391 -0.421599 -0.400811 +v -0.667412 3.64279 0.358347 +vn -0.827838 -0.340393 -0.445888 +v -0.702261 3.64824 0.424438 +vn -0.860297 -0.340865 -0.379077 +v -0.612964 3.692 0.229676 +vn -0.740556 -0.443508 -0.504854 +v -0.579573 3.63153 0.22812 +vn -0.76115 -0.337248 -0.553998 +v -0.626339 3.63715 0.292826 +vn -0.79451 -0.339307 -0.503612 +v -0.826352 3.91714 0.364088 +vn -0.821408 -0.506372 -0.262444 +v -0.78413 3.89782 0.283178 +vn -0.779352 -0.538131 -0.320976 +v -0.903237 4.05727 0.343316 +vn -0.860968 -0.464161 -0.208059 +v -0.864952 4.03349 0.25663 +vn -0.822682 -0.503161 -0.264619 +v -0.866369 4.01104 0.30535 +vn -0.828114 -0.502464 -0.248508 +v -0.735051 3.88086 0.203435 +vn -0.733793 -0.568897 -0.371355 +v -0.678488 3.86316 0.127939 +vn -0.689386 -0.593314 -0.415603 +v -0.686347 3.84078 0.172976 +vn -0.706492 -0.575954 -0.411274 +v -0.786419 3.99608 0.124838 +vn -0.744492 -0.56105 -0.361875 +v -0.754904 3.98389 0.082335 +vn -0.718327 -0.574503 -0.392369 +v -0.767767 3.96507 0.135646 +vn -0.733117 -0.573828 -0.365049 +v -0.881169 3.94862 0.523041 +vn -0.884202 -0.448139 -0.131746 +v -0.857966 3.93367 0.443512 +vn -0.856823 -0.475366 -0.199703 +v -0.865109 3.88992 0.664096 +vn -0.908552 -0.417677 -0.00895424 +v -0.901056 3.96868 0.67581 +vn -0.91229 -0.409056 0.0200245 +v -0.880468 3.92493 0.631591 +vn -0.905135 -0.423373 -0.038537 +v -0.919172 4.02554 0.522344 +vn -0.898064 -0.42755 -0.103352 +v -0.954042 4.10241 0.522459 +vn -0.918962 -0.386109 -0.0801783 +v -0.927489 4.05435 0.479133 +vn -0.895844 -0.426869 -0.123477 +v -0.936591 4.0515 0.690067 +vn -0.922367 -0.383309 0.0480908 +v -0.969309 4.13706 0.702665 +vn -0.939168 -0.336976 0.0664082 +v -0.952687 4.08757 0.652597 +vn -0.928095 -0.371919 0.0177919 +v -0.936567 4.80117 0.203695 +vn -0.954407 0.237268 -0.181137 +v -0.941275 4.81709 0.255339 +vn -0.959651 0.243402 -0.140801 +v -0.93298 4.83961 0.239383 +vn -0.95355 0.258067 -0.155386 +v -0.967683 4.70225 0.262066 +vn -0.972538 0.186963 -0.138618 +v -0.970778 4.72313 0.322515 +vn -0.974222 0.203274 -0.0978333 +v -0.962879 4.74816 0.298547 +vn -0.971279 0.209943 -0.11199 +v -0.943 4.86418 0.408643 +vn -0.963918 0.263851 -0.0352685 +v -0.936478 4.89228 0.49629 +vn -0.962469 0.271086 0.0129132 +v -0.92508 4.93161 0.454997 +vn -0.956334 0.291867 -0.0154628 +v -0.965137 4.78097 0.488392 +vn -0.971664 0.236291 0.00596091 +v -0.959277 4.79971 0.541107 +vn -0.968812 0.245019 0.0370024 +v -0.945129 4.85511 0.542566 +vn -0.965425 0.256702 0.0453775 +v -0.928682 4.79077 0.153806 +vn -0.947181 0.233731 -0.219586 +v -0.936995 4.76194 0.16048 +vn -0.952466 0.214324 -0.216504 +v -0.89239 4.73861 -0.003821 +vn -0.913922 0.196188 -0.355326 +v -0.874208 4.72338 -0.055132 +vn -0.897076 0.180774 -0.403207 +v -0.884242 4.69675 -0.043718 +vn -0.904681 0.159923 -0.39494 +v -0.962139 4.68671 0.209495 +vn -0.968688 0.174277 -0.176838 +v -0.968066 4.66138 0.218655 +vn -0.972341 0.155382 -0.174382 +v -0.928246 4.63311 0.045506 +vn -0.94051 0.117225 -0.318904 +v -0.910649 4.61582 -0.007854 +vn -0.92423 0.0948091 -0.369878 +v -0.917879 4.58847 0.004422 +vn -0.929208 0.0705262 -0.362766 +v -0.898812 4.89238 0.150031 +vn -0.926883 0.303028 -0.221497 +v -0.888186 4.88489 0.100835 +vn -0.916883 0.297301 -0.266341 +v -0.898213 4.85741 0.106098 +vn -0.923993 0.276779 -0.263876 +v -0.852321 4.98226 0.100415 +vn -0.891233 0.358731 -0.277518 +v -0.827957 4.96335 0.00944 +vn -0.871051 0.353911 -0.340614 +v -0.854692 4.91613 0.032103 +vn -0.889152 0.326269 -0.320868 +v -0.847786 4.84078 -0.04733 +vn -0.880632 0.267185 -0.391279 +v -0.828788 4.82796 -0.095877 +vn -0.863471 0.256294 -0.434432 +v -0.840748 4.8021 -0.086497 +vn -0.872428 0.237704 -0.427044 +v -0.798151 4.94025 -0.07861 +vn -0.844253 0.338468 -0.415544 +v -0.777964 4.92932 -0.12568 +vn -0.825242 0.32967 -0.458578 +v -0.790955 4.90429 -0.119429 +vn -0.835491 0.310386 -0.453448 +v -0.910211 4.91601 0.240905 +vn -0.9371 0.308146 -0.163981 +v -0.889548 4.96106 0.213715 +vn -0.922904 0.33526 -0.189339 +v -0.912014 4.9688 0.417542 +vn -0.944826 0.324564 -0.0442833 +v -0.895125 5.00883 0.381043 +vn -0.929441 0.362694 -0.0677702 +v -0.913759 4.9442 0.33258 +vn -0.944704 0.312339 -0.0998938 +v -0.867955 5.00328 0.188862 +vn -0.90608 0.365886 -0.212477 +v -0.844615 5.04556 0.167181 +vn -0.887633 0.398058 -0.231642 +v -0.879292 5.04003 0.344138 +vn -0.916572 0.388815 -0.0933737 +v -0.858739 5.0808 0.324483 +vn -0.89917 0.423185 -0.111392 +v -0.876576 5.02356 0.273603 +vn -0.914158 0.375823 -0.151898 +v -0.680565 3.30643 0.39813 +vn -0.899807 0.329919 -0.285484 +v -0.702824 3.30703 0.479022 +vn -0.931307 0.289357 -0.221225 +v -0.671776 3.35588 0.416118 +vn -0.925078 0.214179 -0.313621 +v -0.668007 3.25928 0.29621 +vn -0.82627 0.476997 -0.299586 +v -0.7155 3.21641 0.362917 +vn -0.814791 0.531259 -0.232119 +v -0.692305 3.26313 0.375556 +vn -0.860343 0.436343 -0.263467 +v -0.6944 3.35677 0.492468 +vn -0.954742 0.166628 -0.24638 +v -0.717815 3.31234 0.56015 +vn -0.957996 0.237246 -0.161112 +v -0.708368 3.36339 0.560285 +vn -0.975615 0.124591 -0.180698 +v -0.719364 3.25425 0.461532 +vn -0.886334 0.420704 -0.193443 +v -0.751496 3.21754 0.542852 +vn -0.877664 0.464617 -0.117633 +v -0.730263 3.26406 0.545055 +vn -0.922559 0.357678 -0.144747 +v -0.608752 3.3554 0.264928 +vn -0.846301 0.329832 -0.418314 +v -0.619005 3.30543 0.237944 +vn -0.819102 0.434113 -0.374991 +v -0.65238 3.30618 0.317814 +vn -0.862236 0.379317 -0.33566 +v -0.525467 3.35702 0.120531 +vn -0.749297 0.448136 -0.487574 +v -0.536528 3.3065 0.083411 +vn -0.719738 0.539993 -0.436332 +v -0.580271 3.30534 0.159088 +vn -0.770892 0.488845 -0.408358 +v -0.635629 3.25753 0.210766 +vn -0.783883 0.524017 -0.333066 +v -0.659553 3.20919 0.181814 +vn -0.738455 0.607069 -0.293516 +v -0.688825 3.21418 0.272195 +vn -0.779469 0.567615 -0.265031 +v -0.556576 3.25445 0.044533 +vn -0.68838 0.614566 -0.385282 +v -0.580929 3.20402 -0.000285 +vn -0.65337 0.675606 -0.341561 +v -0.600697 3.20758 0.045747 +vn -0.677304 0.657362 -0.330354 +v -0.605241 3.40756 0.290364 +vn -0.864462 0.206709 -0.458232 +v -0.565457 3.40776 0.220965 +vn -0.821798 0.268213 -0.502702 +v -0.620298 3.51942 0.332732 +vn -0.864838 -0.080573 -0.495543 +v -0.579722 3.5177 0.26785 +vn -0.83206 -0.0426943 -0.55304 +v -0.608928 3.46216 0.313258 +vn -0.870979 0.0674448 -0.48667 +v -0.521139 3.40869 0.153869 +vn -0.776048 0.327142 -0.539192 +v -0.472817 3.41058 0.089714 +vn -0.728625 0.379815 -0.569953 +v -0.534374 3.51638 0.204423 +vn -0.798251 -0.00363965 -0.602313 +v -0.484848 3.51557 0.142768 +vn -0.763325 0.0347961 -0.645076 +v -0.523942 3.46172 0.182136 +vn -0.794458 0.174198 -0.5818 +v -0.669166 3.40838 0.433436 +vn -0.93648 0.094511 -0.337747 +v -0.639999 3.40782 0.361328 +vn -0.902952 0.147532 -0.403623 +v -0.708425 3.40991 0.579066 +vn -0.984674 0.0214385 -0.173081 +v -0.692091 3.40939 0.505978 +vn -0.963957 0.0511843 -0.261088 +v -0.673334 3.46419 0.450138 +vn -0.935858 -0.0267564 -0.35136 +v -0.684725 3.52351 0.465659 +vn -0.925145 -0.145659 -0.350558 +v -0.655499 3.5214 0.398757 +vn -0.896231 -0.115397 -0.428316 +v -0.712391 3.46687 0.590072 +vn -0.981636 -0.086923 -0.169812 +v -0.722848 3.52764 0.600906 +vn -0.969522 -0.185736 -0.159781 +v -0.707374 3.52563 0.533131 +vn -0.950255 -0.169683 -0.261195 +v -0.692158 3.30384 0.951155 +vn -0.917331 0.278863 0.284148 +v -0.666717 3.30098 1.02499 +vn -0.875949 0.318846 0.36201 +v -0.655268 3.35672 1.01107 +vn -0.888972 0.233317 0.394072 +v -0.726777 3.20353 0.974268 +vn -0.848178 0.469637 0.24502 +v -0.703779 3.19561 1.05715 +vn -0.81098 0.495348 0.311356 +v -0.682962 3.24724 1.03986 +vn -0.8518 0.403424 0.334196 +v -0.634489 3.29831 1.09606 +vn -0.821089 0.363493 0.440097 +v -0.595279 3.29644 1.16234 +vn -0.752712 0.407686 0.51693 +v -0.582198 3.35569 1.13952 +vn -0.761266 0.335885 0.554667 +v -0.674039 3.18739 1.13768 +vn -0.762517 0.524848 0.37829 +v -0.637254 3.1779 1.216 +vn -0.702507 0.554018 0.446708 +v -0.613505 3.23769 1.18681 +vn -0.73593 0.477877 0.479626 +v -0.710712 3.30796 0.87502 +vn -0.948258 0.243648 0.203575 +v -0.722813 3.26057 0.887409 +vn -0.917279 0.344853 0.199185 +v -0.721142 3.3599 0.722848 +vn -0.993799 0.105277 0.0357867 +v -0.730533 3.30388 0.720488 +vn -0.9739 0.224151 0.035708 +v -0.720298 3.32365 0.797963 +vn -0.972706 0.196445 0.123499 +v -0.743698 3.21108 0.890261 +vn -0.877242 0.441022 0.189594 +v -0.762559 3.16741 0.918081 +vn -0.821972 0.536219 0.191916 +v -0.743295 3.25848 0.722732 +vn -0.942465 0.332797 0.0317233 +v -0.742866 3.25948 0.638261 +vn -0.937666 0.343638 -0.0519225 +v -0.760253 3.21837 0.715907 +vn -0.903683 0.427341 0.0271488 +v -0.676709 3.41458 0.932578 +vn -0.935451 0.0815841 0.343912 +v -0.698123 3.41729 0.862406 +vn -0.968346 0.0303075 0.247766 +v -0.701487 3.36105 0.868969 +vn -0.964516 0.139902 0.223911 +v -0.706297 3.53543 0.864134 +vn -0.940068 -0.152509 0.304981 +v -0.722367 3.53333 0.799005 +vn -0.967224 -0.177291 0.181783 +v -0.704986 3.47494 0.842395 +vn -0.965923 -0.0805611 0.245971 +v -0.718504 3.41487 0.7258 +vn -0.999023 -0.00579117 0.0438069 +v -0.71751 3.41064 0.652892 +vn -0.997839 0.00904799 -0.0650849 +v -0.730391 3.53213 0.734575 +vn -0.979419 -0.190253 0.0673941 +v -0.73057 3.52955 0.668573 +vn -0.980154 -0.192435 -0.0476051 +v -0.721731 3.47229 0.72866 +vn -0.993094 -0.105972 0.0503441 +v -0.648633 3.41401 0.999333 +vn -0.891644 0.140843 0.430272 +v -0.647097 3.47332 0.990204 +vn -0.883221 0.040266 0.467224 +v -0.573808 3.41486 1.12013 +vn -0.762971 0.251871 0.595345 +v -0.569884 3.4737 1.1053 +vn -0.756573 0.153482 0.635641 +v -0.614398 3.41428 1.06194 +vn -0.834261 0.196566 0.51514 +v -0.650258 3.53487 0.986124 +vn -0.861422 -0.0688291 0.503205 +v -0.657962 3.59687 0.987957 +vn -0.831803 -0.173625 0.527217 +v -0.683735 3.55414 0.927679 +vn -0.893543 -0.140588 0.426399 +v -0.570287 3.53208 1.09587 +vn -0.741338 0.0405754 0.669904 +v -0.574837 3.58995 1.09257 +vn -0.717444 -0.0824775 0.691717 +v -0.61297 3.53229 1.04328 +vn -0.809354 -0.0122694 0.587192 +v -0.795821 2.64467 -1.6357 +vn -0.863967 0.403802 -0.30084 +v -0.778203 2.7071 -1.59719 +vn -0.863957 0.430933 -0.260528 +v -0.752834 2.70396 -1.67949 +vn -0.864472 0.400464 -0.303836 +v -0.872225 2.53812 -1.56136 +vn -0.860117 0.407644 -0.306636 +v -0.858063 2.59495 -1.52065 +vn -0.859883 0.434568 -0.267865 +v -0.835577 2.5881 -1.59812 +vn -0.861653 0.405102 -0.305689 +v -0.790934 2.72343 -1.52069 +vn -0.858814 0.464176 -0.216747 +v -0.745098 2.78424 -1.57379 +vn -0.861764 0.461221 -0.211278 +v -0.866408 2.61601 -1.45382 +vn -0.855916 0.46407 -0.228137 +v -0.831173 2.6653 -1.48656 +vn -0.858609 0.461313 -0.223565 +v -0.759944 2.59614 -1.77632 +vn -0.854382 0.34081 -0.392275 +v -0.806242 2.53706 -1.72677 +vn -0.855729 0.345627 -0.385058 +v -0.782297 2.59211 -1.72992 +vn -0.857815 0.357923 -0.368843 +v -0.771113 2.46812 -1.8476 +vn -0.833961 0.280322 -0.47532 +v -0.821519 2.4132 -1.79096 +vn -0.83854 0.294384 -0.458464 +v -0.814005 2.4748 -1.76202 +vn -0.847612 0.32133 -0.422258 +v -0.849582 2.48229 -1.67987 +vn -0.854946 0.353619 -0.3795 +v -0.886986 2.43693 -1.63782 +vn -0.854582 0.359412 -0.374849 +v -0.87968 2.48836 -1.60209 +vn -0.857877 0.382858 -0.342735 +v -0.865598 2.36749 -1.73895 +vn -0.842441 0.304106 -0.444762 +v -0.904312 2.32765 -1.69238 +vn -0.844342 0.312639 -0.435137 +v -0.895292 2.383 -1.6678 +vn -0.849797 0.336212 -0.405964 +v -0.712469 2.65715 -1.82616 +vn -0.852568 0.335135 -0.401015 +v -0.715816 2.5915 -1.86921 +vn -0.840553 0.304945 -0.447749 +v -0.73884 2.59339 -1.82294 +vn -0.84768 0.324782 -0.41947 +v -0.659569 2.73142 -1.87692 +vn -0.852849 0.325603 -0.408205 +v -0.633446 2.77095 -1.90062 +vn -0.85413 0.320446 -0.409605 +v -0.632592 2.73692 -1.92699 +vn -0.843686 0.303248 -0.442984 +v -0.718059 2.52305 -1.90726 +vn -0.825741 0.265942 -0.497421 +v -0.72703 2.44883 -1.92891 +vn -0.806509 0.230548 -0.544417 +v -0.657837 2.59043 -1.96891 +vn -0.812191 0.251854 -0.526228 +v -0.626425 2.6222 -2.00166 +vn -0.79876 0.243833 -0.550025 +v -0.630042 2.58451 -2.01259 +vn -0.792812 0.222933 -0.56723 +v -0.705787 2.77407 -1.72101 +vn -0.866277 0.398232 -0.301623 +v -0.730691 2.71321 -1.72827 +vn -0.862093 0.384571 -0.33 +v -0.696531 2.86325 -1.59791 +vn -0.859269 0.478349 -0.181214 +v -0.721804 2.80654 -1.61902 +vn -0.863309 0.448462 -0.231472 +v -0.654771 2.85223 -1.76482 +vn -0.869251 0.395976 -0.295982 +v -0.629604 2.89276 -1.78551 +vn -0.872133 0.393517 -0.290738 +v -0.631458 2.86436 -1.81565 +vn -0.869571 0.375936 -0.320184 +v -0.643101 2.9452 -1.63463 +vn -0.856924 0.492458 -0.152205 +v -0.616372 2.9868 -1.65354 +vn -0.857796 0.495346 -0.137182 +v -0.62152 2.96523 -1.68787 +vn -0.865917 0.46345 -0.188155 +v -0.421065 3.28542 -1.92326 +vn -0.901149 0.382135 -0.204703 +v -0.412389 3.32547 -1.87143 +vn -0.900917 0.421915 -0.101669 +v -0.381897 3.36767 -1.94196 +vn -0.899679 0.391288 -0.193576 +v -0.460126 3.20172 -1.90656 +vn -0.897475 0.378437 -0.226548 +v -0.483581 3.15388 -1.89373 +vn -0.894639 0.378329 -0.237673 +v -0.481356 3.17856 -1.85765 +vn -0.898904 0.397204 -0.184932 +v -0.39616 3.36296 -1.82477 +vn -0.882102 0.469699 0.0357623 +v -0.371427 3.39712 -1.78543 +vn -0.822433 0.526748 0.214806 +v -0.360253 3.43287 -1.84986 +vn -0.87471 0.480693 0.0617782 +v -0.482276 3.20287 -1.75059 +vn -0.869426 0.493823 -0.0153908 +v -0.447883 3.25268 -1.7067 +vn -0.804228 0.568885 0.172008 +v -0.458713 3.24519 -1.766 +vn -0.868182 0.495088 0.0338791 +v -0.378861 3.29645 -2.04298 +vn -0.8694 0.334573 -0.3636 +v -0.399406 3.24787 -2.03747 +vn -0.873379 0.323025 -0.364506 +v -0.421139 3.24562 -1.98091 +vn -0.891185 0.347982 -0.291029 +v -0.357808 3.22211 -2.1344 +vn -0.792451 0.269083 -0.547372 +v -0.376558 3.17199 -2.13122 +vn -0.792217 0.249648 -0.556837 +v -0.383616 3.1895 -2.1113 +vn -0.825498 0.27556 -0.492564 +v -0.462329 3.10003 -2.0147 +vn -0.872303 0.309132 -0.378847 +v -0.484796 3.04984 -2.004 +vn -0.870592 0.308017 -0.383661 +v -0.487029 3.07666 -1.97561 +vn -0.880483 0.324413 -0.345696 +v -0.436113 3.00461 -2.11862 +vn -0.794404 0.224801 -0.564258 +v -0.459205 2.9445 -2.11032 +vn -0.789824 0.223603 -0.571122 +v -0.468573 2.97176 -2.08469 +vn -0.822234 0.245537 -0.513462 +v -0.343288 3.37947 -2.05047 +vn -0.863648 0.349476 -0.363289 +v -0.332487 3.34589 -2.10035 +vn -0.825282 0.326005 -0.461118 +v -0.280125 3.51586 -2.05782 +vn -0.826012 0.429587 -0.36491 +v -0.272762 3.48971 -2.09895 +vn -0.791607 0.403773 -0.458612 +v -0.309061 3.45655 -2.05496 +vn -0.854018 0.379193 -0.356182 +v -0.326487 3.30613 -2.13619 +vn -0.786754 0.311457 -0.532928 +v -0.313546 3.27123 -2.17034 +vn -0.722166 0.260217 -0.640909 +v -0.340435 3.26833 -2.13643 +vn -0.795351 0.286103 -0.534379 +v -0.267893 3.46169 -2.12906 +vn -0.766752 0.373225 -0.522298 +v -0.239424 3.48139 -2.15246 +vn -0.67415 0.404543 -0.617954 +v -0.263632 3.43219 -2.15329 +vn -0.736723 0.327012 -0.591864 +v -0.345992 3.44313 -1.9531 +vn -0.893129 0.410493 -0.183893 +v -0.34647 3.41312 -2.003 +vn -0.883335 0.3805 -0.273749 +v -0.32582 3.49744 -1.86627 +vn -0.860691 0.502618 0.0811553 +v -0.341197 3.46795 -1.90719 +vn -0.890612 0.449123 -0.0714053 +v -0.242626 3.60908 -2.01885 +vn -0.812705 0.516638 -0.269436 +v -0.273226 3.55137 -2.02784 +vn -0.829674 0.463421 -0.311258 +v -0.278473 3.56922 -1.97594 +vn -0.849405 0.492597 -0.189367 +v -0.283244 3.56116 -1.8508 +vn -0.789829 0.569521 0.227632 +v -0.249465 3.61625 -1.87768 +vn -0.743599 0.635286 0.208499 +v -0.273074 3.59024 -1.90619 +vn -0.832974 0.549703 0.0630977 +v -0.77671 5.22119 0.521306 +vn -0.777822 0.621933 0.0905086 +v -0.806463 5.18557 0.482517 +vn -0.821229 0.56913 0.0409172 +v -0.798275 5.19064 0.539043 +vn -0.801179 0.590333 0.0980756 +v -0.79023 5.21009 0.403478 +vn -0.81172 0.583697 -0.0202279 +v -0.819872 5.1609 0.361202 +vn -0.855264 0.513093 -0.0725202 +v -0.812856 5.17789 0.421311 +vn -0.838403 0.544763 -0.0177296 +v -0.817324 5.15969 0.560329 +vn -0.82395 0.556444 0.107128 +v -0.847485 5.11663 0.52398 +vn -0.866738 0.495522 0.0567732 +v -0.839341 5.12071 0.584548 +vn -0.848909 0.516724 0.111134 +v -0.834721 5.14261 0.44332 +vn -0.864023 0.503389 -0.00796991 +v -0.860754 5.09029 0.398505 +vn -0.896985 0.438864 -0.0530727 +v -0.859298 5.09827 0.467195 +vn -0.88876 0.45834 -0.00555073 +v -0.757589 5.25153 0.44855 +vn -0.76549 0.642729 0.0304023 +v -0.753304 5.25156 0.506681 +vn -0.751455 0.653944 0.0875896 +v -0.727374 5.28124 0.495678 +vn -0.721844 0.686754 0.0854979 +v -0.697258 5.30237 0.547241 +vn -0.677044 0.721471 0.145227 +v -0.669553 5.33536 0.501993 +vn -0.649231 0.752796 0.108616 +v -0.699375 5.31047 0.488809 +vn -0.68528 0.723293 0.085075 +v -0.757966 5.24531 0.320211 +vn -0.784335 0.61279 -0.0964766 +v -0.763489 5.24462 0.379541 +vn -0.782932 0.621199 -0.0336224 +v -0.731943 5.28176 0.374906 +vn -0.744438 0.667257 -0.0240902 +v -0.687173 5.32219 0.301574 +vn -0.696405 0.710831 -0.0986918 +v -0.698989 5.31603 0.361025 +vn -0.702005 0.71141 -0.0329275 +v -0.661051 5.35123 0.372742 +vn -0.656965 0.753881 -0.00777626 +v -0.745995 5.24962 0.561878 +vn -0.734317 0.663591 0.142918 +v -0.716793 5.27036 0.602965 +vn -0.695386 0.693614 0.187983 +v -0.721163 5.24689 0.661691 +vn -0.695952 0.673161 0.250009 +v -0.669823 5.27417 0.721725 +vn -0.658646 0.696749 0.284123 +v -0.684317 5.28893 0.645016 +vn -0.661546 0.712091 0.235126 +v -0.693326 5.29485 0.596349 +vn -0.671141 0.718143 0.183957 +v -0.671224 5.31271 0.604316 +vn -0.638032 0.745483 0.192794 +v -0.646422 5.30234 0.703642 +vn -0.626235 0.732187 0.267828 +v -0.736771 5.24711 0.612583 +vn -0.717886 0.668255 0.19513 +v -0.755413 5.2223 0.625733 +vn -0.736219 0.645982 0.201715 +v -0.753509 5.20122 0.68872 +vn -0.7238 0.635167 0.269585 +v -0.772878 5.19697 0.641336 +vn -0.753307 0.622683 0.211646 +v -0.78657 5.17409 0.657292 +vn -0.774319 0.590587 0.227236 +v -0.696522 5.2379 0.744774 +vn -0.683236 0.665134 0.301305 +v -0.783893 5.15098 0.718959 +vn -0.760509 0.588607 0.274169 +v -0.722115 5.19795 0.771313 +vn -0.702942 0.635578 0.319238 +v -0.856619 2.16737 -1.845 +vn -0.784572 0.144894 -0.60287 +v -0.847853 2.22746 -1.83951 +vn -0.800931 0.190143 -0.567763 +v -0.806697 2.19894 -1.90095 +vn -0.763568 0.121918 -0.634113 +v -0.941155 2.10815 -1.74494 +vn -0.811109 0.177929 -0.557174 +v -0.932025 2.16464 -1.73766 +vn -0.820439 0.221539 -0.527068 +v -0.901368 2.1384 -1.79229 +vn -0.799388 0.165036 -0.577704 +v -0.838821 2.28864 -1.82914 +vn -0.815488 0.230206 -0.531022 +v -0.829896 2.35073 -1.81321 +vn -0.827899 0.26461 -0.494535 +v -0.788548 2.33094 -1.887 +vn -0.802025 0.212532 -0.558199 +v -0.923045 2.21795 -1.7268 +vn -0.829521 0.258659 -0.494965 +v -0.913698 2.27232 -1.71188 +vn -0.837362 0.287407 -0.464996 +v -0.883749 2.25101 -1.7752 +vn -0.824475 0.24557 -0.509839 +v -0.822539 2.07327 -1.89698 +vn -0.722375 0.0189056 -0.691243 +v -0.871801 2.05109 -1.84421 +vn -0.748237 0.0414661 -0.662134 +v -0.864699 2.1086 -1.84639 +vn -0.766854 0.0950589 -0.634743 +v -0.833324 1.95372 -1.88047 +vn -0.683093 -0.0876304 -0.725055 +v -0.882024 1.93924 -1.83109 +vn -0.710585 -0.0685343 -0.700265 +v -0.877662 1.99468 -1.83896 +vn -0.729304 -0.0137808 -0.684051 +v -0.915862 2.0301 -1.79435 +vn -0.766739 0.0607801 -0.639075 +v -0.954874 2.00739 -1.74858 +vn -0.787209 0.0772686 -0.611826 +v -0.944279 2.05816 -1.75403 +vn -0.795919 0.124096 -0.592548 +v -0.925498 1.92538 -1.78435 +vn -0.730805 -0.0520257 -0.680601 +v -0.963673 1.90915 -1.74107 +vn -0.755574 -0.036011 -0.654073 +v -0.955902 1.95789 -1.75111 +vn -0.765609 0.0138176 -0.643158 +v -0.76864 2.09634 -1.95064 +vn -0.688287 -0.00548989 -0.725418 +v -0.775086 2.03163 -1.9419 +vn -0.667076 -0.0574009 -0.742775 +v -0.648797 2.14203 -2.05337 +vn -0.587628 -0.0583692 -0.807023 +v -0.655664 2.0688 -2.04106 +vn -0.566162 -0.104954 -0.817585 +v -0.710552 2.11961 -2.00343 +vn -0.644199 -0.03144 -0.764211 +v -0.779965 1.9687 -1.93061 +vn -0.647663 -0.107646 -0.754285 +v -0.783083 1.90704 -1.91721 +vn -0.630372 -0.154819 -0.760698 +v -0.660854 1.99847 -2.02654 +vn -0.547749 -0.149255 -0.823221 +v -0.66428 1.93006 -2.0101 +vn -0.53239 -0.19001 -0.824898 +v -0.722339 1.98378 -1.97986 +vn -0.60316 -0.128313 -0.787232 +v -0.751981 2.2327 -1.95847 +vn -0.73469 0.0959032 -0.67159 +v -0.760858 2.16322 -1.95635 +vn -0.710942 0.0459671 -0.701747 +v -0.733359 2.37729 -1.94721 +vn -0.78218 0.191715 -0.592824 +v -0.742526 2.30443 -1.95599 +vn -0.758682 0.145339 -0.635042 +v -0.693046 2.26727 -2.0155 +vn -0.694407 0.0679133 -0.716371 +v -0.630652 2.3003 -2.0696 +vn -0.639607 0.0383098 -0.767747 +v -0.640381 2.21898 -2.06308 +vn -0.612039 -0.0110034 -0.790751 +v -0.676525 2.42748 -2.00427 +vn -0.757279 0.165955 -0.631655 +v -0.642421 2.45135 -2.03789 +vn -0.736696 0.152202 -0.658872 +v -0.621395 2.38916 -2.07012 +vn -0.673617 0.0880481 -0.733818 +v -0.359286 2.38515 -2.22357 +vn -0.314706 -0.080083 -0.945805 +v -0.348578 2.48023 -2.23374 +vn -0.332133 -0.051402 -0.941831 +v -0.319028 2.43769 -2.24042 +vn -0.281144 -0.0741114 -0.9568 +v -0.495884 2.40708 -2.16356 +vn -0.526187 -0.00672501 -0.850342 +v -0.486931 2.45699 -2.16848 +vn -0.521529 0.0143647 -0.853112 +v -0.46116 2.4121 -2.18288 +vn -0.456927 -0.0232083 -0.889202 +v -0.325895 2.64037 -2.24698 +vn -0.352106 -0.00717209 -0.935932 +v -0.318132 2.69864 -2.24969 +vn -0.364417 0.0075695 -0.931205 +v -0.293456 2.64333 -2.25812 +vn -0.304038 -0.0179189 -0.952491 +v -0.456695 2.6238 -2.17931 +vn -0.558487 0.0555515 -0.827651 +v -0.441362 2.68527 -2.18483 +vn -0.564262 0.0785744 -0.821848 +v -0.420344 2.6353 -2.20181 +vn -0.515176 0.0358789 -0.856333 +v -0.301672 2.2169 -2.21798 +vn -0.218273 -0.16098 -0.962519 +v -0.37457 2.21157 -2.19775 +vn -0.297987 -0.145161 -0.943468 +v -0.335419 2.25518 -2.21569 +vn -0.257537 -0.140061 -0.956064 +v -0.309908 2.05362 -2.18352 +vn -0.205386 -0.220394 -0.953543 +v -0.384411 2.04949 -2.1639 +vn -0.277915 -0.209641 -0.937451 +v -0.345749 2.08953 -2.18323 +vn -0.240866 -0.20274 -0.949147 +v -0.446444 2.19539 -2.17019 +vn -0.363953 -0.131457 -0.922094 +v -0.516278 2.18055 -2.13762 +vn -0.439178 -0.110126 -0.891625 +v -0.507981 2.26456 -2.15037 +vn -0.460984 -0.0699643 -0.884646 +v -0.457304 2.03603 -2.13704 +vn -0.338014 -0.201556 -0.919305 +v -0.527925 2.02493 -2.10589 +vn -0.407679 -0.187556 -0.893656 +v -0.522931 2.10106 -2.12271 +vn -0.421765 -0.150151 -0.894186 +v -0.227094 2.22416 -2.23344 +vn -0.154545 -0.168921 -0.973438 +v -0.230833 2.14084 -2.21708 +vn -0.150138 -0.197996 -0.968636 +v -0.266781 2.17885 -2.2184 +vn -0.181937 -0.180689 -0.966566 +v -0.075637 2.23284 -2.25 +vn -0.0409016 -0.175589 -0.983613 +v -0.077048 2.14919 -2.23379 +vn -0.0402336 -0.202871 -0.978379 +v -0.114713 2.18966 -2.23978 +vn -0.0690776 -0.1886 -0.979622 +v -0.233619 2.05988 -2.19889 +vn -0.147043 -0.22467 -0.963277 +v -0.235509 1.98042 -2.17899 +vn -0.145296 -0.248561 -0.957657 +v -0.273119 2.01727 -2.18208 +vn -0.173678 -0.235529 -0.956223 +v -0.078118 2.06765 -2.21571 +vn -0.0398733 -0.227891 -0.97287 +v -0.078865 1.98734 -2.19587 +vn -0.039758 -0.250224 -0.967371 +v -0.117799 2.02649 -2.2036 +vn -0.0674202 -0.23896 -0.968686 +v -0.288229 2.3944 -2.24479 +vn -0.237016 -0.0975228 -0.966599 +v -0.216442 2.4014 -2.26029 +vn -0.166369 -0.108645 -0.98006 +v -0.255949 2.35217 -2.24724 +vn -0.196247 -0.118717 -0.973341 +v -0.209381 2.49491 -2.27052 +vn -0.172288 -0.0825556 -0.981581 +v -0.239374 2.54391 -2.2683 +vn -0.211555 -0.0605462 -0.975489 +v -0.205092 2.54672 -2.2753 +vn -0.174255 -0.0660309 -0.982484 +v -0.144131 2.40651 -2.27065 +vn -0.103037 -0.114897 -0.988019 +v -0.071671 2.40981 -2.27638 +vn -0.0428546 -0.118162 -0.992069 +v -0.10952 2.36307 -2.26831 +vn -0.0722323 -0.131015 -0.988745 +v -0.067679 2.50562 -2.28659 +vn -0.0452098 -0.0939798 -0.994547 +v -0.101844 2.55322 -2.2885 +vn -0.0761174 -0.0745812 -0.994306 +v -0.067509 2.5576 -2.29106 +vn -0.0502099 -0.0749146 -0.995925 +v -1.02554 4.40323 0.535711 +vn -0.999305 -0.0265307 -0.0261982 +v -1.02605 4.4188 0.58515 +vn -0.999957 0.000465135 0.00920784 +v -1.02538 4.43643 0.528567 +vn -0.999494 0.0172145 -0.0267289 +v -1.00935 4.26384 0.561134 +vn -0.976564 -0.213272 -0.0289561 +v -1.01238 4.27643 0.609984 +vn -0.981477 -0.191563 0.00255196 +v -1.01597 4.29968 0.555972 +vn -0.98592 -0.164973 -0.0273021 +v -1.02239 4.44675 0.673396 +vn -0.996916 0.0444987 0.0646375 +v -1.01286 4.46997 0.754623 +vn -0.986704 0.0823346 0.140131 +v -1.01589 4.49394 0.709161 +vn -0.989536 0.107616 0.0961133 +v -1.01318 4.30231 0.707355 +vn -0.985929 -0.146212 0.0810308 +v -1.00725 4.33179 0.790055 +vn -0.982588 -0.0994759 0.156922 +v -1.01563 4.35411 0.740584 +vn -0.991577 -0.0703895 0.108718 +v -1.01052 4.35598 0.386454 +vn -0.985155 -0.115696 -0.126822 +v -1.00606 4.37424 0.341499 +vn -0.98278 -0.0892136 -0.161815 +v -1.00165 4.34506 0.33555 +vn -0.97637 -0.134527 -0.169127 +v -0.956303 4.2905 0.183054 +vn -0.933156 -0.233234 -0.273536 +v -0.945764 4.30717 0.135878 +vn -0.926706 -0.213455 -0.309277 +v -0.936413 4.27753 0.131434 +vn -0.910051 -0.264478 -0.319152 +v -0.986561 4.22278 0.414602 +vn -0.950143 -0.28431 -0.128051 +v -0.983715 4.24183 0.358896 +vn -0.949589 -0.269214 -0.160637 +v -0.974773 4.20838 0.365983 +vn -0.937135 -0.309387 -0.161422 +v -0.923413 4.16366 0.220841 +vn -0.882259 -0.388131 -0.266409 +v -0.911766 4.17981 0.162942 +vn -0.873244 -0.380367 -0.304573 +v -0.901098 4.14861 0.173101 +vn -0.858692 -0.414399 -0.301531 +v -1.011 4.46354 0.360083 +vn -0.990113 0.0263704 -0.137768 +v -1.00237 4.45298 0.304292 +vn -0.985601 -0.00419969 -0.169034 +v -1.0006 4.39598 0.302681 +vn -0.980651 -0.0614252 -0.185877 +v -0.995437 4.58573 0.322367 +vn -0.982404 0.136315 -0.127676 +v -0.9883 4.57415 0.264289 +vn -0.979347 0.114752 -0.166469 +v -0.993039 4.54443 0.274249 +vn -0.981963 0.0879458 -0.167372 +v -0.963183 4.40878 0.143231 +vn -0.95555 -0.0811022 -0.283454 +v -0.944409 4.387 0.092274 +vn -0.935066 -0.121568 -0.332975 +v -0.949664 4.36721 0.115003 +vn -0.93903 -0.134171 -0.316576 +v -0.952503 4.52374 0.095199 +vn -0.955697 0.0235729 -0.293407 +v -0.934681 4.50536 0.041185 +vn -0.93935 -0.00760251 -0.342875 +v -0.938337 4.47721 0.053255 +vn -0.940193 -0.036102 -0.338724 +v -1.01782 4.46419 0.418148 +vn -0.995233 0.0327849 -0.0918554 +v -1.01548 4.49136 0.408516 +vn -0.992592 0.0680521 -0.100647 +v -1.01559 4.55016 0.559173 +vn -0.988785 0.149289 0.00406331 +v -1.01676 4.53576 0.611684 +vn -0.99049 0.132769 0.0360779 +v -1.01227 4.56569 0.607735 +vn -0.984721 0.170624 0.0348237 +v -1.00286 4.58186 0.383511 +vn -0.984601 0.147791 -0.0933781 +v -0.997206 4.61229 0.375439 +vn -0.981512 0.168715 -0.0903812 +v -0.99039 4.67498 0.536412 +vn -0.973383 0.228821 0.0128664 +v -0.992372 4.66049 0.595287 +vn -0.970426 0.238247 0.0388756 +v -0.983449 4.69667 0.590328 +vn -0.968063 0.246589 0.0452505 +v -0.881151 1.7256 -1.78044 +vn -0.647808 -0.271625 -0.711733 +v -0.884103 1.77766 -1.79576 +vn -0.661496 -0.222575 -0.716159 +v -0.833513 1.72716 -1.82312 +vn -0.622068 -0.28055 -0.730974 +v -0.960571 1.72315 -1.70328 +vn -0.689701 -0.257127 -0.676903 +v -0.959514 1.76426 -1.71865 +vn -0.696979 -0.210887 -0.685381 +v -0.923742 1.72396 -1.73991 +vn -0.667371 -0.265494 -0.695793 +v -0.885304 1.8307 -1.8093 +vn -0.67646 -0.172609 -0.715967 +v -0.884631 1.88459 -1.82109 +vn -0.692845 -0.121447 -0.710786 +v -0.837141 1.83838 -1.8553 +vn -0.649524 -0.185994 -0.737241 +v -0.965595 1.81278 -1.72514 +vn -0.721505 -0.149675 -0.676038 +v -0.961367 1.86009 -1.73863 +vn -0.73107 -0.101477 -0.674715 +v -0.92821 1.82327 -1.76579 +vn -0.696589 -0.161333 -0.699096 +v -0.823452 1.62118 -1.78351 +vn -0.598554 -0.374147 -0.708341 +v -0.870511 1.62462 -1.74409 +vn -0.622753 -0.36692 -0.691049 +v -0.876784 1.67455 -1.76304 +vn -0.635595 -0.319809 -0.702667 +v -0.811172 1.52233 -1.73391 +vn -0.579143 -0.463359 -0.670739 +v -0.858792 1.52659 -1.69412 +vn -0.604292 -0.459787 -0.650713 +v -0.863502 1.57591 -1.72247 +vn -0.61172 -0.415434 -0.673211 +v -0.907083 1.62142 -1.7085 +vn -0.639404 -0.368382 -0.674876 +v -0.911482 1.5771 -1.67812 +vn -0.631712 -0.413468 -0.655732 +v -0.945235 1.6313 -1.67682 +vn -0.658325 -0.355664 -0.663409 +v -0.930873 1.54503 -1.63757 +vn -0.633497 -0.450367 -0.629167 +v -0.771757 1.61738 -1.82359 +vn -0.567398 -0.381736 -0.729615 +v -0.76524 1.56426 -1.79884 +vn -0.55735 -0.427098 -0.712003 +v -0.655852 1.61059 -1.90126 +vn -0.481656 -0.397396 -0.781079 +v -0.650093 1.55239 -1.87311 +vn -0.47333 -0.444024 -0.76079 +v -0.715778 1.6138 -1.86327 +vn -0.528774 -0.389594 -0.754065 +v -0.760482 1.51388 -1.7703 +vn -0.549393 -0.471228 -0.690008 +v -0.767193 1.46924 -1.73222 +vn -0.547895 -0.515645 -0.658727 +v -0.70552 1.50534 -1.80633 +vn -0.511795 -0.479867 -0.712597 +v -0.645534 1.49649 -1.84106 +vn -0.464666 -0.491628 -0.736469 +v -0.655604 1.44725 -1.79944 +vn -0.468373 -0.536045 -0.702341 +v -0.781186 1.72896 -1.86664 +vn -0.589242 -0.290086 -0.754085 +v -0.777193 1.67235 -1.84611 +vn -0.578 -0.335702 -0.743787 +v -0.784271 1.84646 -1.9021 +vn -0.61509 -0.200043 -0.762658 +v -0.783594 1.78705 -1.88527 +vn -0.601491 -0.244934 -0.760405 +v -0.72451 1.731 -1.90962 +vn -0.548528 -0.299889 -0.780503 +v -0.66383 1.73325 -1.95063 +vn -0.498656 -0.309628 -0.809613 +v -0.660512 1.67094 -1.92702 +vn -0.489883 -0.35256 -0.797318 +v -0.727055 1.85474 -1.94819 +vn -0.572251 -0.214475 -0.791536 +v -0.665856 1.86301 -1.99201 +vn -0.519508 -0.228922 -0.823229 +v -0.665659 1.79734 -1.97224 +vn -0.508405 -0.26849 -0.818191 +v -0.388399 1.74372 -2.07434 +vn -0.253578 -0.332509 -0.90837 +v -0.389233 1.81707 -2.09935 +vn -0.255727 -0.297998 -0.919674 +v -0.351538 1.78179 -2.0974 +vn -0.225085 -0.315306 -0.92191 +v -0.531833 1.73836 -2.02151 +vn -0.37744 -0.325526 -0.866932 +v -0.533116 1.80767 -2.04529 +vn -0.383267 -0.288283 -0.877496 +v -0.461475 1.74456 -2.05156 +vn -0.322114 -0.327232 -0.888348 +v -0.390381 1.89339 -2.12223 +vn -0.264808 -0.262539 -0.927874 +v -0.38727 1.97198 -2.14437 +vn -0.271393 -0.237669 -0.932663 +v -0.350941 1.93319 -2.14378 +vn -0.2313 -0.255976 -0.938604 +v -0.532972 1.87865 -2.06717 +vn -0.390116 -0.253805 -0.885095 +v -0.531272 1.95108 -2.08733 +vn -0.397442 -0.220841 -0.890657 +v -0.464386 1.8878 -2.09705 +vn -0.329499 -0.255985 -0.908792 +v -0.309611 1.60275 -2.03578 +vn -0.196057 -0.413404 -0.88919 +v -0.383829 1.60337 -2.01738 +vn -0.250476 -0.413535 -0.875357 +v -0.348277 1.63758 -2.04241 +vn -0.222912 -0.391319 -0.892849 +v -0.303376 1.47057 -1.9668 +vn -0.194263 -0.513137 -0.836034 +v -0.3761 1.47387 -1.94958 +vn -0.24666 -0.512228 -0.822667 +v -0.341934 1.50364 -1.9769 +vn -0.220661 -0.485868 -0.845719 +v -0.456114 1.60762 -1.99605 +vn -0.316343 -0.409371 -0.85577 +v -0.525516 1.60587 -1.9674 +vn -0.367836 -0.409506 -0.834866 +v -0.529255 1.67101 -1.99561 +vn -0.372418 -0.365883 -0.852897 +v -0.447061 1.48106 -1.93011 +vn -0.310861 -0.507787 -0.803441 +v -0.515126 1.48327 -1.90316 +vn -0.357825 -0.507112 -0.784091 +v -0.520748 1.54321 -1.93666 +vn -0.363251 -0.456409 -0.812243 +v -0.233753 1.60244 -2.05004 +vn -0.144448 -0.412488 -0.899438 +v -0.231626 1.53363 -2.01669 +vn -0.144531 -0.460164 -0.875991 +v -0.270686 1.56804 -2.0272 +vn -0.169792 -0.435741 -0.883912 +v -0.078661 1.60286 -2.06633 +vn -0.0399856 -0.410276 -0.911085 +v -0.077992 1.53269 -2.03264 +vn -0.0399924 -0.458296 -0.8879 +v -0.117287 1.56759 -2.04755 +vn -0.069382 -0.433242 -0.898603 +v -0.229071 1.46813 -1.98023 +vn -0.144119 -0.513131 -0.846124 +v -0.226147 1.40638 -1.94042 +vn -0.142763 -0.570739 -0.808626 +v -0.264741 1.43809 -1.95463 +vn -0.168072 -0.54092 -0.82411 +v -0.077173 1.46596 -1.99576 +vn -0.0397911 -0.512034 -0.858043 +v -0.076218 1.40315 -1.95544 +vn -0.0393466 -0.571041 -0.819978 +v -0.114789 1.4346 -1.97386 +vn -0.0696603 -0.540392 -0.838525 +v -0.313246 1.74611 -2.09361 +vn -0.197024 -0.333216 -0.922035 +v -0.236432 1.7482 -2.10844 +vn -0.14403 -0.33289 -0.931901 +v -0.27448 1.71016 -2.08799 +vn -0.169943 -0.350907 -0.92086 +v -0.313575 1.89739 -2.14224 +vn -0.199775 -0.271232 -0.941554 +v -0.236567 1.9018 -2.15742 +vn -0.144469 -0.272646 -0.951206 +v -0.275499 1.86104 -2.13896 +vn -0.170813 -0.285405 -0.943063 +v -0.158373 1.74999 -2.11895 +vn -0.0934305 -0.331992 -0.938644 +v -0.07944 1.75144 -2.12517 +vn -0.0398025 -0.331336 -0.942673 +v -0.118806 1.71322 -2.10905 +vn -0.0683487 -0.348782 -0.934708 +v -0.158347 1.90523 -2.16807 +vn -0.0928987 -0.272931 -0.957538 +v -0.079321 1.90764 -2.1743 +vn -0.0397418 -0.27298 -0.961198 +v -0.11907 1.8675 -2.16039 +vn -0.0675524 -0.285351 -0.95604 +v -0.313108 4.89288 1.96966 +vn -0.552001 0.826479 -0.11058 +v -0.333743 4.86831 1.90716 +vn -0.521983 0.840069 -0.147705 +v -0.357022 4.85891 1.96068 +vn -0.645597 0.763367 -0.0217907 +v -0.348117 4.84821 1.8446 +vn -0.508946 0.851464 -0.126424 +v -0.380735 4.83379 1.89226 +vn -0.603324 0.793656 -0.0781717 +v -0.405815 4.81375 1.94075 +vn -0.712437 0.699462 0.0564556 +v -0.398263 4.81346 1.82617 +vn -0.570795 0.817777 -0.0737083 +v -0.431856 4.79041 1.86825 +vn -0.665145 0.74671 0.00251557 +v -0.287622 4.89521 1.91589 +vn -0.419922 0.883683 -0.206807 +v -0.270828 4.91769 1.97257 +vn -0.434512 0.878181 -0.199995 +v -0.238821 4.91614 1.9217 +vn -0.311382 0.916864 -0.249803 +v -0.299113 4.87654 1.85674 +vn -0.424797 0.890909 -0.160713 +v -0.247632 4.89921 1.86537 +vn -0.325599 0.928056 -0.180823 +v -0.284182 4.91848 2.02679 +vn -0.575814 0.817567 0.00481855 +v -0.244439 4.94222 2.07234 +vn -0.536487 0.82153 0.193055 +v -0.247875 4.93985 2.02197 +vn -0.453476 0.882384 -0.125526 +v -0.226243 4.93624 1.97395 +vn -0.314227 0.910288 -0.269512 +v -0.216959 4.95901 2.05979 +vn -0.432033 0.90164 0.0198068 +v -0.210463 4.95479 2.01789 +vn -0.325909 0.91679 -0.230825 +v -0.323876 4.88633 2.02702 +vn -0.668674 0.735464 0.109399 +v -0.372633 4.83841 2.01657 +vn -0.741403 0.647573 0.175987 +v -0.27556 4.91434 2.08514 +vn -0.604767 0.724024 0.331732 +v -0.320747 4.86962 2.08563 +vn -0.681812 0.588171 0.434956 +v -0.801866 1.3249 -1.55401 +vn -0.535819 -0.667394 -0.517188 +v -0.812293 1.3637 -1.59059 +vn -0.550191 -0.629469 -0.548689 +v -0.766596 1.34723 -1.61627 +vn -0.525487 -0.643156 -0.556968 +v -0.870953 1.42419 -1.59539 +vn -0.590069 -0.567839 -0.573914 +v -0.849355 1.38165 -1.57291 +vn -0.572344 -0.61267 -0.545031 +v -0.88303 1.38952 -1.5456 +vn -0.587753 -0.608507 -0.533166 +v -0.823158 1.40375 -1.62308 +vn -0.56576 -0.586787 -0.579307 +v -0.838025 1.44903 -1.65178 +vn -0.583836 -0.543398 -0.603203 +v -0.791175 1.43291 -1.68095 +vn -0.554938 -0.555988 -0.618806 +v -0.92541 1.43224 -1.54584 +vn -0.598119 -0.575314 -0.557914 +v -0.910775 1.46567 -1.59386 +vn -0.609022 -0.53554 -0.585055 +v -0.787841 1.28473 -1.51351 +vn -0.518137 -0.707159 -0.481103 +v -0.829178 1.30773 -1.50125 +vn -0.543156 -0.686539 -0.48337 +v -0.73595 1.19688 -1.42545 +vn -0.463042 -0.781404 -0.418329 +v -0.750053 1.17452 -1.36564 +vn -0.453011 -0.799903 -0.39362 +v -0.784997 1.22114 -1.41377 +vn -0.491895 -0.75859 -0.427295 +v -0.84823 1.34612 -1.53151 +vn -0.561867 -0.649436 -0.512384 +v -0.865523 1.31931 -1.47587 +vn -0.554887 -0.67879 -0.480983 +v -0.903376 1.36481 -1.49319 +vn -0.574912 -0.636726 -0.513864 +v -0.824728 1.2391 -1.39873 +vn -0.511554 -0.742436 -0.432551 +v -0.826703 1.20918 -1.3426 +vn -0.490782 -0.767678 -0.412073 +v -0.859203 1.25493 -1.38414 +vn -0.523467 -0.730752 -0.438158 +v -0.699744 1.25111 -1.5535 +vn -0.467004 -0.733914 -0.493232 +v -0.696065 1.21655 -1.50247 +vn -0.452796 -0.766532 -0.455417 +v -0.741225 1.25906 -1.52455 +vn -0.492627 -0.726058 -0.479748 +v -0.591287 1.21854 -1.59873 +vn -0.392367 -0.768934 -0.504766 +v -0.589657 1.18373 -1.54363 +vn -0.378767 -0.801612 -0.462551 +v -0.647076 1.2349 -1.57737 +vn -0.433496 -0.750694 -0.498537 +v -0.693545 1.18499 -1.44875 +vn -0.436694 -0.794833 -0.421353 +v -0.694676 1.15605 -1.38952 +vn -0.419121 -0.821821 -0.385938 +v -0.587126 1.15127 -1.48559 +vn -0.361925 -0.832954 -0.418566 +v -0.587072 1.12203 -1.42307 +vn -0.342909 -0.861604 -0.374235 +v -0.642304 1.16803 -1.46778 +vn -0.402635 -0.813456 -0.41973 +v -0.715937 1.3309 -1.64369 +vn -0.497454 -0.655448 -0.568267 +v -0.661841 1.31528 -1.67101 +vn -0.462223 -0.668277 -0.582885 +v -0.691763 1.28501 -1.60853 +vn -0.474298 -0.700943 -0.532654 +v -0.741252 1.4201 -1.71265 +vn -0.525497 -0.566229 -0.63501 +v -0.687243 1.40744 -1.74416 +vn -0.489444 -0.5772 -0.653671 +v -0.72793 1.37474 -1.68069 +vn -0.51092 -0.611529 -0.604147 +v -0.604646 1.29778 -1.6939 +vn -0.419315 -0.684957 -0.595827 +v -0.543575 1.27098 -1.7028 +vn -0.362539 -0.712916 -0.600263 +v -0.580232 1.25137 -1.65391 +vn -0.394112 -0.735037 -0.551721 +v -0.628164 1.39305 -1.77335 +vn -0.445016 -0.5887 -0.674828 +v -0.563217 1.36564 -1.78923 +vn -0.389551 -0.61417 -0.686327 +v -0.616468 1.34385 -1.73514 +vn -0.433529 -0.637644 -0.63676 +v -0.355332 1.25767 -1.77443 +vn -0.222187 -0.729837 -0.646507 +v -0.359093 1.30702 -1.82496 +vn -0.23581 -0.681369 -0.692913 +v -0.286545 1.25128 -1.78822 +vn -0.176747 -0.737403 -0.651919 +v -0.486567 1.27268 -1.73611 +vn -0.314405 -0.713465 -0.626192 +v -0.49385 1.31954 -1.78234 +vn -0.32694 -0.664146 -0.672325 +v -0.422321 1.26552 -1.75769 +vn -0.268532 -0.721393 -0.638343 +v -0.366335 1.36077 -1.87103 +vn -0.249072 -0.621603 -0.742679 +v -0.369693 1.41541 -1.9124 +vn -0.246672 -0.569955 -0.783776 +v -0.333292 1.38301 -1.89897 +vn -0.216219 -0.59782 -0.77192 +v -0.50203 1.37079 -1.82551 +vn -0.340171 -0.610778 -0.715006 +v -0.50932 1.42586 -1.86604 +vn -0.351264 -0.559312 -0.750855 +v -0.435016 1.36473 -1.84949 +vn -0.290591 -0.618873 -0.729763 +v -0.279009 1.16588 -1.67809 +vn -0.157568 -0.828713 -0.537036 +v -0.346132 1.17273 -1.66623 +vn -0.200711 -0.820886 -0.53466 +v -0.350389 1.21322 -1.72212 +vn -0.211971 -0.777283 -0.592368 +v -0.274585 1.09714 -1.55371 +vn -0.135261 -0.901245 -0.411658 +v -0.34084 1.10387 -1.54357 +vn -0.174938 -0.893346 -0.41392 +v -0.342846 1.13626 -1.60673 +vn -0.188343 -0.859683 -0.474839 +v -0.411507 1.1813 -1.652 +vn -0.24455 -0.811383 -0.530899 +v -0.473639 1.19089 -1.63518 +vn -0.289981 -0.802179 -0.521939 +v -0.47898 1.22954 -1.68719 +vn -0.299324 -0.759393 -0.577692 +v -0.405533 1.11252 -1.53155 +vn -0.218011 -0.882901 -0.41588 +v -0.468356 1.12323 -1.51777 +vn -0.264781 -0.869346 -0.417288 +v -0.470697 1.15569 -1.57871 +vn -0.280248 -0.837022 -0.469953 +v -0.210565 1.16076 -1.68754 +vn -0.116538 -0.834565 -0.538443 +v -0.208441 1.12431 -1.62645 +vn -0.107947 -0.873655 -0.474419 +v -0.070941 1.15746 -1.70261 +vn -0.0421362 -0.83916 -0.54225 +v -0.070131 1.12081 -1.64096 +vn -0.0390122 -0.87781 -0.477417 +v -0.141122 1.15736 -1.69471 +vn -0.0788397 -0.838738 -0.538797 +v -0.207082 1.09215 -1.56184 +vn -0.0992626 -0.906701 -0.409926 +v -0.20665 1.0643 -1.49373 +vn -0.0910357 -0.934101 -0.345208 +v -0.06956 1.08855 -1.57586 +vn -0.0355001 -0.911063 -0.410736 +v -0.070966 1.05977 -1.50507 +vn -0.0281524 -0.937368 -0.347201 +v -0.13864 1.08887 -1.56811 +vn -0.0657264 -0.91013 -0.409077 +v -0.214671 1.24739 -1.8008 +vn -0.136599 -0.744414 -0.653596 +v -0.213256 1.20147 -1.74511 +vn -0.125269 -0.790547 -0.599453 +v -0.29526 1.35275 -1.88477 +vn -0.188692 -0.627761 -0.75519 +v -0.22294 1.34876 -1.89706 +vn -0.140055 -0.629626 -0.76417 +v -0.257323 1.32349 -1.86847 +vn -0.162908 -0.658169 -0.735034 +v -0.143303 1.24394 -1.80903 +vn -0.0918617 -0.746507 -0.659006 +v -0.072897 1.24105 -1.81259 +vn -0.0357544 -0.745484 -0.665564 +v -0.108242 1.21879 -1.78387 +vn -0.0649731 -0.77192 -0.63239 +v -0.149489 1.34605 -1.90598 +vn -0.0928142 -0.630981 -0.770226 +v -0.07516 1.3447 -1.91146 +vn -0.0385644 -0.631655 -0.77429 +v -0.111602 1.31793 -1.88611 +vn -0.0674772 -0.660563 -0.747732 +v -0.400257 3.71261 -0.03273 +vn -0.550146 -0.553699 -0.625106 +v -0.47165 3.72198 0.027277 +vn -0.603402 -0.547704 -0.579591 +v -0.448731 3.74261 -0.016303 +vn -0.568479 -0.584469 -0.578988 +v -0.346674 3.61314 -0.010562 +vn -0.597957 -0.303889 -0.741687 +v -0.410577 3.6169 0.043661 +vn -0.649969 -0.318077 -0.690194 +v -0.369604 3.6623 -0.019117 +vn -0.568739 -0.457077 -0.683824 +v -0.535858 3.73027 0.091212 +vn -0.648048 -0.537277 -0.539785 +v -0.596112 3.74254 0.156171 +vn -0.688349 -0.526816 -0.498638 +v -0.572858 3.78736 0.074164 +vn -0.638254 -0.58886 -0.495859 +v -0.471077 3.62126 0.102548 +vn -0.692227 -0.32763 -0.643024 +v -0.527619 3.62618 0.16451 +vn -0.727831 -0.333718 -0.599078 +v -0.50065 3.67595 0.099113 +vn -0.665661 -0.456738 -0.590157 +v -0.261259 3.74306 -0.16091 +vn -0.384776 -0.621571 -0.682346 +v -0.246385 3.69776 -0.130751 +vn -0.402578 -0.557854 -0.725762 +v -0.292927 3.72386 -0.124528 +vn -0.436122 -0.592993 -0.676873 +v -0.086205 3.73222 -0.218531 +vn -0.138127 -0.624007 -0.769114 +v -0.081153 3.68839 -0.186422 +vn -0.148836 -0.550448 -0.821495 +v -0.125374 3.71208 -0.193176 +vn -0.223149 -0.594451 -0.77255 +v -0.224989 3.65193 -0.111276 +vn -0.420263 -0.437745 -0.794833 +v -0.209826 3.60279 -0.098214 +vn -0.449757 -0.24702 -0.858312 +v -0.279699 3.60961 -0.058634 +vn -0.537228 -0.271057 -0.798696 +v -0.064559 3.64883 -0.165877 +vn -0.137467 -0.422965 -0.895658 +v -0.069789 3.60285 -0.148526 +vn -0.172982 -0.22765 -0.958255 +v -0.234337 3.78462 -0.214778 +vn -0.327876 -0.657948 -0.677939 +v -0.185506 3.78073 -0.232355 +vn -0.267362 -0.65887 -0.703142 +v -0.226837 3.76385 -0.198466 +vn -0.327631 -0.655633 -0.680297 +v -0.266163 3.87783 -0.291714 +vn -0.332056 -0.660202 -0.6737 +v -0.21315 3.8727 -0.310343 +vn -0.276906 -0.661571 -0.696884 +v -0.258501 3.85416 -0.271993 +vn -0.330205 -0.665962 -0.668924 +v -0.095089 3.77504 -0.253994 +vn -0.146856 -0.667448 -0.730031 +v -0.052473 3.85743 -0.337307 +vn -0.0784217 -0.672009 -0.736379 +v -0.050859 3.83475 -0.316585 +vn -0.0787919 -0.675343 -0.733282 +v -0.370678 3.80018 -0.145541 +vn -0.462155 -0.647817 -0.605596 +v -0.401363 3.78381 -0.103059 +vn -0.494561 -0.642522 -0.585299 +v -0.414169 3.80655 -0.11719 +vn -0.49667 -0.645892 -0.579778 +v -0.536903 3.82866 -0.020665 +vn -0.586788 -0.628802 -0.510185 +v -0.557888 3.81139 0.025855 +vn -0.608241 -0.620012 -0.495609 +v -0.574779 3.83678 0.014752 +vn -0.611853 -0.62367 -0.486489 +v -0.419313 3.89903 -0.216171 +vn -0.469552 -0.646276 -0.601538 +v -0.455063 3.88217 -0.167693 +vn -0.502163 -0.649842 -0.570559 +v -0.467936 3.9077 -0.185327 +vn -0.506695 -0.642882 -0.574425 +v -0.603604 3.93767 -0.079587 +vn -0.605344 -0.620105 -0.499027 +v -0.628321 3.92062 -0.026184 +vn -0.625927 -0.621816 -0.470702 +v -0.645055 3.94868 -0.040793 +vn -0.633839 -0.61287 -0.471846 +v -0.616159 4.51708 1.78732 +vn -0.864859 -0.126708 0.485761 +v -0.642867 4.51113 1.73507 +vn -0.895213 -0.0677788 0.440454 +v -0.636939 4.49508 1.73987 +vn -0.848423 -0.294305 0.439958 +v -0.662934 4.50401 1.68973 +vn -0.898523 -0.163125 0.407489 +v -0.677415 4.48984 1.64813 +vn -0.857012 -0.376926 0.351364 +v -0.652534 4.47558 1.68716 +vn -0.77971 -0.5113 0.36142 +v -0.610634 4.49002 1.78116 +vn -0.747681 -0.452003 0.486484 +v -0.623462 4.47321 1.74052 +vn -0.644412 -0.649489 0.403605 +v -0.589722 4.47401 1.7894 +vn -0.535902 -0.706974 0.461515 +v -0.668087 4.45481 1.60449 +vn -0.692959 -0.680866 0.237128 +v -0.649817 4.45447 1.65159 +vn -0.661838 -0.692698 0.286599 +v -0.652822 4.5375 1.71117 +vn -0.903178 0.140801 0.405518 +v -0.611743 4.55218 1.79419 +vn -0.891056 0.13428 0.433577 +v -0.632258 4.57983 1.7293 +vn -0.861421 0.352535 0.365613 +v -0.691749 4.53723 1.62323 +vn -0.913677 0.126618 0.386216 +v -0.684096 4.50611 1.64234 +vn -0.917855 -0.111919 0.38081 +v -0.669117 4.57807 1.64641 +vn -0.850033 0.366983 0.377846 +v -0.57159 4.54706 1.86822 +vn -0.828227 -0.113022 0.548877 +v -0.526531 4.58623 1.93753 +vn -0.771777 -0.105339 0.627107 +v -0.569537 4.57705 1.87033 +vn -0.873156 0.122122 0.471895 +v -0.593662 4.59246 1.80888 +vn -0.86963 0.329599 0.36757 +v -0.525034 4.61717 1.93779 +vn -0.84052 0.135108 0.524664 +v -0.556454 4.61325 1.87816 +vn -0.871301 0.300065 0.388324 +v -0.563806 4.52305 1.86888 +vn -0.695826 -0.376353 0.611707 +v -0.584076 4.49239 1.82049 +vn -0.60301 -0.594529 0.531897 +v -0.587829 4.504 1.82579 +vn -0.753012 -0.350655 0.55679 +v -0.517798 4.56399 1.93927 +vn -0.596207 -0.369433 0.71278 +v -0.506072 4.54253 1.93244 +vn -0.35112 -0.608811 0.711382 +v -0.150058 5.32809 1.126 +vn -0.220754 0.649653 0.727475 +v -0.145692 5.28216 1.16756 +vn -0.217476 0.630821 0.744829 +v -0.076071 5.32916 1.14055 +vn -0.100064 0.663369 0.741572 +v -0.13851 5.23585 1.20735 +vn -0.204733 0.599942 0.773404 +v -0.073413 5.28452 1.18003 +vn -0.0974668 0.641932 0.760541 +v -0.069762 5.23774 1.21824 +vn -0.0915596 0.604862 0.79105 +v -0.21381 5.27817 1.1445 +vn -0.311261 0.616393 0.723309 +v -0.20436 5.23055 1.18772 +vn -0.302186 0.592646 0.746629 +v -0.15295 5.36993 1.08706 +vn -0.22311 0.654195 0.722669 +v -0.218512 5.32632 1.10018 +vn -0.316792 0.63278 0.706564 +v -0.156955 5.40353 1.05552 +vn -0.235025 0.631775 0.738663 +v -0.222745 5.37126 1.05756 +vn -0.327388 0.634286 0.700356 +v -0.232693 5.40515 1.02272 +vn -0.35031 0.62239 0.699938 +v -0.295381 5.37276 1.01622 +vn -0.408346 0.638919 0.651948 +v -0.077837 5.36902 1.10403 +vn -0.101646 0.667352 0.737773 +v -0.079106 5.40138 1.07486 +vn -0.107356 0.641562 0.759522 +v -0.416446 5.06671 -0.443486 +vn -0.521901 0.444884 -0.727804 +v -0.48678 5.07578 -0.382564 +vn -0.579025 0.451973 -0.678565 +v -0.444005 5.09525 -0.404241 +vn -0.537847 0.483018 -0.690951 +v -0.35869 4.96589 -0.53292 +vn -0.472393 0.334243 -0.815553 +v -0.404413 4.96581 -0.504863 +vn -0.51226 0.342289 -0.787672 +v -0.404391 5.01227 -0.482767 +vn -0.512448 0.397451 -0.761203 +v -0.551116 5.08417 -0.317032 +vn -0.630277 0.461634 -0.624216 +v -0.597611 5.11083 -0.245742 +vn -0.661175 0.486894 -0.570773 +v -0.534799 5.12782 -0.299172 +vn -0.607944 0.512601 -0.606337 +v -0.523731 4.97354 -0.410846 +vn -0.611297 0.359588 -0.704991 +v -0.558302 4.98343 -0.374535 +vn -0.635582 0.372392 -0.676283 +v -0.547908 5.03097 -0.356484 +vn -0.622993 0.415531 -0.662732 +v -0.247225 5.1033 -0.517764 +vn -0.341149 0.520725 -0.7826 +v -0.260646 5.05319 -0.541798 +vn -0.36939 0.442409 -0.817206 +v -0.295301 5.08141 -0.508886 +vn -0.400108 0.478331 -0.781737 +v -0.083559 5.09601 -0.571476 +vn -0.120792 0.514867 -0.848718 +v -0.087639 5.04429 -0.599193 +vn -0.129184 0.443442 -0.886945 +v -0.130678 5.07287 -0.575985 +vn -0.199842 0.47467 -0.857177 +v -0.266517 5.00066 -0.565164 +vn -0.373614 0.378128 -0.847013 +v -0.28037 4.94554 -0.580764 +vn -0.384994 0.301749 -0.872197 +v -0.313223 4.98293 -0.550766 +vn -0.425684 0.346962 -0.835709 +v -0.092848 4.98925 -0.622645 +vn -0.147708 0.358343 -0.921831 +v -0.096651 4.93001 -0.642168 +vn -0.154242 0.277375 -0.9483 +v -0.140416 4.96471 -0.622239 +vn -0.218032 0.324633 -0.920367 +v -0.242976 5.15077 -0.486041 +vn -0.332274 0.569043 -0.752186 +v -0.164591 5.1479 -0.5178 +vn -0.240691 0.573834 -0.782804 +v -0.230047 5.23668 -0.417188 +vn -0.297448 0.674019 -0.676182 +v -0.155966 5.23595 -0.445904 +vn -0.215292 0.682362 -0.698592 +v -0.235783 5.19515 -0.453367 +vn -0.315234 0.621378 -0.717299 +v -0.083521 5.1434 -0.540381 +vn -0.129956 0.572832 -0.809305 +v -0.07904 5.23296 -0.467276 +vn -0.117293 0.685762 -0.718312 +v -0.081048 5.18956 -0.505566 +vn -0.124312 0.630332 -0.766308 +v -0.398204 5.11429 -0.42438 +vn -0.490171 0.516816 -0.701878 +v -0.384427 5.16134 -0.397458 +vn -0.47025 0.557564 -0.684096 +v -0.31764 5.15442 -0.44525 +vn -0.408807 0.563273 -0.718053 +v -0.569447 5.15731 -0.23594 +vn -0.629191 0.539802 -0.559224 +v -0.505464 5.1712 -0.289328 +vn -0.574256 0.557962 -0.599089 +v -0.368633 5.20251 -0.372455 +vn -0.443712 0.61382 -0.652951 +v -0.362256 5.24102 -0.337917 +vn -0.430265 0.659081 -0.616834 +v -0.299606 5.23738 -0.381338 +vn -0.366633 0.665752 -0.649888 +v -0.436208 5.20487 -0.318887 +vn -0.503259 0.61116 -0.610912 +v -0.490375 5.2132 -0.262423 +vn -0.553757 0.605379 -0.571726 +v -0.458509 5.23868 -0.26423 +vn -0.511903 0.64134 -0.571523 +v -0.457779 4.5835 -0.534274 +vn -0.519838 -0.0475937 -0.852938 +v -0.509447 4.59299 -0.501331 +vn -0.566415 -0.0292709 -0.8236 +v -0.501653 4.62456 -0.507167 +vn -0.563839 -0.00148909 -0.825883 +v -0.481612 4.45673 -0.504031 +vn -0.526473 -0.160026 -0.834996 +v -0.535666 4.46758 -0.469868 +vn -0.574828 -0.142428 -0.805783 +v -0.529918 4.4987 -0.478773 +vn -0.573138 -0.113747 -0.811526 +v -0.650843 4.62623 -0.386247 +vn -0.690015 0.0299414 -0.723176 +v -0.692784 4.63868 -0.343486 +vn -0.726619 0.0516812 -0.685094 +v -0.682804 4.66839 -0.351089 +vn -0.721292 0.0779506 -0.688231 +v -0.682903 4.50561 -0.35068 +vn -0.70488 -0.0832885 -0.70442 +v -0.726373 4.51978 -0.306381 +vn -0.743934 -0.0602251 -0.665533 +v -0.718986 4.54944 -0.316481 +vn -0.740315 -0.0313223 -0.67153 +v -0.404332 4.57489 -0.564385 +vn -0.469731 -0.0646096 -0.880442 +v -0.410278 4.54263 -0.55824 +vn -0.471199 -0.0922259 -0.877192 +v -0.23509 4.55512 -0.633803 +vn -0.295865 -0.107196 -0.949196 +v -0.176575 4.55098 -0.649515 +vn -0.22962 -0.11765 -0.966143 +v -0.179332 4.51771 -0.644257 +vn -0.229902 -0.144286 -0.962459 +v -0.425672 4.44681 -0.535225 +vn -0.474864 -0.175863 -0.862309 +v -0.429727 4.41547 -0.525969 +vn -0.475843 -0.203917 -0.855565 +v -0.248045 4.42404 -0.60725 +vn -0.297792 -0.214999 -0.930105 +v -0.18655 4.41916 -0.623569 +vn -0.230686 -0.224352 -0.94681 +v -0.188497 4.38707 -0.614943 +vn -0.23106 -0.250238 -0.940209 +v -0.42787 4.71097 -0.550981 +vn -0.510559 0.0658345 -0.857319 +v -0.377614 4.7039 -0.579687 +vn -0.462673 0.0494188 -0.88515 +v -0.3846 4.67179 -0.577204 +vn -0.46467 0.0203451 -0.88525 +v -0.394458 4.83563 -0.55236 +vn -0.496801 0.188195 -0.847214 +v -0.347287 4.8301 -0.579687 +vn -0.451987 0.172197 -0.875246 +v -0.355864 4.79871 -0.580761 +vn -0.455378 0.14106 -0.879052 +v -0.219076 4.68763 -0.645824 +vn -0.293659 0.00795126 -0.955877 +v -0.164367 4.68433 -0.660794 +vn -0.228561 -0.00243645 -0.973526 +v -0.167542 4.65112 -0.659369 +vn -0.228874 -0.031968 -0.972931 +v -0.201092 4.81793 -0.641802 +vn -0.286276 0.133247 -0.948837 +v -0.149725 4.81938 -0.65552 +vn -0.230101 0.128387 -0.964661 +v -0.154179 4.78234 -0.658591 +vn -0.226504 0.0930578 -0.969555 +v -0.476509 4.71884 -0.51963 +vn -0.554642 0.0830244 -0.827937 +v -0.467691 4.74991 -0.521779 +vn -0.551107 0.111668 -0.826929 +v -0.6105 4.74641 -0.410093 +vn -0.669688 0.136896 -0.729916 +v -0.650539 4.75681 -0.369464 +vn -0.703296 0.155648 -0.693649 +v -0.639165 4.78591 -0.373778 +vn -0.696722 0.180982 -0.694136 +v -0.440733 4.8414 -0.522384 +vn -0.538007 0.202296 -0.818306 +v -0.430391 4.87184 -0.520917 +vn -0.53125 0.233835 -0.814306 +v -0.566592 4.86318 -0.419239 +vn -0.644248 0.243792 -0.72492 +v -0.604435 4.87154 -0.381146 +vn -0.674852 0.257968 -0.691395 +v -0.592865 4.89935 -0.381377 +vn -0.666805 0.283756 -0.689096 +v -0.393892 4.3244 1.91224 +vn -0.473019 -0.788191 0.39371 +v -0.363022 4.30438 1.89995 +vn -0.37706 -0.85949 0.345113 +v -0.335002 4.31639 1.95712 +vn -0.371234 -0.837978 0.399972 +v -0.461107 4.31217 1.78267 +vn -0.556161 -0.76386 0.327419 +v -0.397162 4.29536 1.83619 +vn -0.438061 -0.828386 0.349113 +v -0.424597 4.31595 1.85148 +vn -0.486665 -0.808025 0.332044 +v -0.294317 4.29577 1.94252 +vn -0.279232 -0.893068 0.352788 +v -0.270035 4.3104 1.99682 +vn -0.282109 -0.873467 0.396824 +v -0.324339 4.28243 1.88312 +vn -0.320045 -0.874672 0.364032 +v -0.442146 4.33557 1.86868 +vn -0.623197 -0.668918 0.405184 +v -0.475764 4.35103 1.83318 +vn -0.804632 -0.389379 0.448276 +v -0.474833 4.33084 1.8041 +vn -0.640601 -0.684406 0.348165 +v -0.509806 4.34918 1.76473 +vn -0.8214 -0.406671 0.399902 +v -0.51216 4.33195 1.73072 +vn -0.699683 -0.629841 0.33726 +v -0.414856 4.34476 1.92027 +vn -0.623511 -0.606254 0.493649 +v -0.369281 4.33743 1.96181 +vn -0.518477 -0.685448 0.511216 +v -0.396754 4.35863 1.95369 +vn -0.693152 -0.352793 0.628551 +v -0.444636 4.35641 1.88972 +vn -0.792764 -0.334041 0.509845 +v -0.422852 4.35952 1.92321 +vn -0.758391 -0.302111 0.577557 +v -0.312986 4.33188 2.00486 +vn -0.421772 -0.747533 0.513131 +v -0.351265 4.35496 1.99727 +vn -0.608566 -0.448688 0.654466 +v -0.251301 4.32735 2.04305 +vn -0.331849 -0.798496 0.502275 +v -0.296631 4.35117 2.04027 +vn -0.513509 -0.539433 0.667324 +v -0.228185 5.42962 -0.140351 +vn -0.249353 0.866082 -0.433273 +v -0.153231 5.43513 -0.16579 +vn -0.174456 0.875964 -0.449725 +v -0.226434 5.40359 -0.190976 +vn -0.250606 0.847664 -0.467613 +v -0.230377 5.47523 -0.039155 +vn -0.249361 0.892929 -0.37483 +v -0.154716 5.4819 -0.06584 +vn -0.174969 0.903472 -0.391311 +v -0.229493 5.45349 -0.089517 +vn -0.249254 0.880976 -0.402187 +v -0.076919 5.43679 -0.185183 +vn -0.0915618 0.882214 -0.46186 +v -0.07655 5.40927 -0.235575 +vn -0.0931815 0.863389 -0.495859 +v -0.077762 5.48475 -0.085221 +vn -0.0893211 0.909996 -0.404881 +v -0.07725 5.4619 -0.134951 +vn -0.090533 0.897693 -0.431221 +v -0.366396 5.38602 -0.124623 +vn -0.377759 0.821984 -0.426193 +v -0.371335 5.40994 -0.071232 +vn -0.377466 0.839771 -0.390263 +v -0.301078 5.42128 -0.108264 +vn -0.316556 0.854045 -0.412795 +v -0.490834 5.35491 -0.053363 +vn -0.489307 0.781967 -0.386143 +v -0.500589 5.37619 0.005652 +vn -0.491975 0.798678 -0.346518 +v -0.438184 5.39512 -0.032062 +vn -0.434518 0.822061 -0.367981 +v -0.374899 5.43237 -0.016674 +vn -0.37763 0.854268 -0.357241 +v -0.375779 5.45347 0.037506 +vn -0.376775 0.867261 -0.325421 +v -0.304247 5.46568 -0.004491 +vn -0.318109 0.880523 -0.351406 +v -0.507455 5.3971 0.067613 +vn -0.493792 0.814565 -0.30439 +v -0.51089 5.41789 0.134342 +vn -0.493874 0.829757 -0.259985 +v -0.444756 5.43766 0.083689 +vn -0.435292 0.850914 -0.29405 +v -0.361112 5.36055 -0.175597 +vn -0.379004 0.800621 -0.464071 +v -0.422854 5.3486 -0.140982 +vn -0.436008 0.78295 -0.443718 +v -0.353969 5.30417 -0.267774 +vn -0.392305 0.741445 -0.544385 +v -0.408736 5.29801 -0.233541 +vn -0.438803 0.728824 -0.525612 +v -0.356836 5.33329 -0.223431 +vn -0.38259 0.774554 -0.503678 +v -0.479897 5.3326 -0.108709 +vn -0.49184 0.756743 -0.43062 +v -0.527383 5.31741 -0.077726 +vn -0.539939 0.732019 -0.41547 +v -0.414963 5.32405 -0.189436 +vn -0.436558 0.760111 -0.481299 +v -0.450549 5.29094 -0.205716 +vn -0.491687 0.713083 -0.499756 +v -0.466507 5.30915 -0.162243 +vn -0.497316 0.730233 -0.468441 +v -0.224747 5.37528 -0.240669 +vn -0.253717 0.825036 -0.504919 +v -0.294891 5.36921 -0.209839 +vn -0.319695 0.813704 -0.485469 +v -0.076264 5.37926 -0.285474 +vn -0.0957177 0.840372 -0.533492 +v -0.151518 5.37903 -0.265846 +vn -0.179475 0.834578 -0.520834 +v -0.223758 5.34457 -0.288769 +vn -0.259363 0.797235 -0.545112 +v -0.223982 5.31132 -0.334618 +vn -0.268417 0.762963 -0.588081 +v -0.291931 5.30853 -0.30258 +vn -0.33237 0.753765 -0.566894 +v -0.076245 5.3467 -0.33423 +vn -0.0993697 0.812066 -0.575043 +v -0.076614 5.31151 -0.381194 +vn -0.10431 0.777344 -0.620368 +v -0.151627 5.31288 -0.3609 +vn -0.192615 0.772217 -0.605459 +v -0.281596 5.59402 0.754125 +vn -0.606904 0.777772 0.163516 +v -0.296763 5.56859 0.797623 +vn -0.657063 0.704105 0.269265 +v -0.26493 5.58242 0.83661 +vn -0.633023 0.700897 0.328672 +v -0.324433 5.55717 0.75226 +vn -0.677645 0.701724 0.219955 +v -0.324116 5.53733 0.802499 +vn -0.720824 0.61221 0.32498 +v -0.311813 5.55295 0.798013 +vn -0.695663 0.654255 0.296653 +v -0.293129 5.54492 0.850222 +vn -0.685742 0.594378 0.420086 +v -0.236494 5.57149 0.898813 +vn -0.591778 0.631122 0.501482 +v -0.26682 5.50608 0.923955 +vn -0.645112 0.440699 0.624192 +v -0.241823 5.53572 0.929017 +vn -0.616635 0.489923 0.616228 +v -0.284135 5.60368 0.660576 +vn -0.548052 0.835228 0.0450866 +v -0.311277 5.57978 0.704323 +vn -0.604665 0.786266 0.127149 +v -0.26164 5.61645 0.579798 +vn -0.467106 0.882495 -0.0549038 +v -0.302426 5.59341 0.611063 +vn -0.533713 0.845595 0.0109547 +v -0.329245 5.56574 0.70032 +vn -0.645199 0.750847 0.141232 +v -0.330801 5.57113 0.651885 +vn -0.609056 0.788893 0.0818492 +v -0.345002 5.55152 0.700751 +vn -0.674254 0.720198 0.163393 +v -0.32186 5.58058 0.602128 +vn -0.56609 0.824235 0.013375 +v -0.31089 5.58677 0.555596 +vn -0.519093 0.853776 -0.0401159 +v -0.3415 5.5668 0.597446 +vn -0.585167 0.810308 0.0313213 +v -0.241107 5.63022 0.688015 +vn -0.511107 0.858368 0.0444325 +v -0.240289 5.62316 0.759506 +vn -0.534553 0.832733 0.144252 +v -0.212169 5.64193 0.738519 +vn -0.422524 0.899644 0.110065 +v -0.227326 5.63703 0.61803 +vn -0.444953 0.89401 -0.0525733 +v -0.201142 5.65084 0.648485 +vn -0.379897 0.924627 -0.0272609 +v -0.238106 5.61062 0.818413 +vn -0.549679 0.796178 0.25289 +v -0.216304 5.60248 0.875372 +vn -0.496709 0.764696 0.410513 +v -0.204276 5.63543 0.797432 +vn -0.404444 0.892501 0.199667 +v -0.198116 5.62469 0.846826 +vn -0.400557 0.863672 0.305982 +v -0.752358 4.98344 1.00972 +vn -0.721294 0.424735 0.547115 +v -0.767691 4.93908 1.02169 +vn -0.741101 0.39671 0.541654 +v -0.720453 4.977 1.05202 +vn -0.667049 0.437993 0.602667 +v -0.762747 4.89857 1.05793 +vn -0.728803 0.415333 0.544376 +v -0.711478 4.94741 1.08335 +vn -0.664584 0.450567 0.596085 +v -0.796725 4.96974 0.954188 +vn -0.787013 0.399095 0.470461 +v -0.833461 4.97429 0.881727 +vn -0.82963 0.400957 0.38852 +v -0.826988 4.92749 0.934919 +vn -0.824708 0.352926 0.441928 +v -0.804902 4.91143 0.985103 +vn -0.799899 0.352841 0.485454 +v -0.841324 4.87215 0.950114 +vn -0.83057 0.354114 0.429833 +v -0.799644 4.88882 1.01056 +vn -0.786962 0.377897 0.487734 +v -0.849165 4.92969 0.889715 +vn -0.849443 0.340528 0.403098 +v -0.867315 4.93157 0.846201 +vn -0.871673 0.346903 0.346187 +v -0.862351 4.89672 0.887339 +vn -0.864401 0.315525 0.391477 +v -0.773132 5.00847 0.958064 +vn -0.750315 0.452547 0.481901 +v -0.736963 5.01724 1.00161 +vn -0.688488 0.478223 0.54524 +v -0.749345 5.03871 0.963377 +vn -0.708292 0.515404 0.482369 +v -0.800104 5.01384 0.906895 +vn -0.785032 0.457119 0.418051 +v -0.774084 5.03645 0.927034 +vn -0.739019 0.510649 0.439418 +v -0.713234 5.00547 1.03856 +vn -0.64408 0.475737 0.599029 +v -0.694954 5.04449 1.02458 +vn -0.610171 0.52783 0.590836 +v -0.744466 5.15721 0.045048 +vn -0.794223 0.509956 -0.330385 +v -0.762935 5.17232 0.120374 +vn -0.808528 0.52266 -0.270388 +v -0.730463 5.21339 0.108625 +vn -0.770884 0.572535 -0.27918 +v -0.80165 5.07084 0.067025 +vn -0.851318 0.424274 -0.308623 +v -0.819558 5.08801 0.148878 +vn -0.866119 0.434455 -0.247159 +v -0.792481 5.13041 0.133551 +vn -0.840039 0.476236 -0.259873 +v -0.77586 5.18615 0.194554 +vn -0.817425 0.53611 -0.210717 +v -0.783875 5.19806 0.266699 +vn -0.82103 0.550754 -0.150266 +v -0.752552 5.23791 0.251754 +vn -0.784905 0.598794 -0.15928 +v -0.831069 5.10417 0.228094 +vn -0.874486 0.447435 -0.187287 +v -0.837077 5.11743 0.298988 +vn -0.87662 0.462717 -0.132023 +v -0.812134 5.15795 0.284153 +vn -0.851594 0.505676 -0.138127 +v -0.719833 5.14148 -0.030575 +vn -0.773501 0.498851 -0.390951 +v -0.749009 5.09813 -0.024258 +vn -0.802971 0.455981 -0.383823 +v -0.648734 5.11417 -0.177553 +vn -0.71221 0.487622 -0.504957 +v -0.677521 5.06778 -0.178754 +vn -0.740571 0.443968 -0.504427 +v -0.688022 5.12599 -0.105898 +vn -0.743731 0.492544 -0.451956 +v -0.776913 5.05527 -0.013631 +vn -0.827902 0.422536 -0.368838 +v -0.802216 5.00973 -0.005328 +vn -0.851963 0.384533 -0.355378 +v -0.703088 5.01858 -0.181268 +vn -0.76204 0.396907 -0.511625 +v -0.730374 4.96972 -0.17612 +vn -0.786813 0.360144 -0.50122 +v -0.738154 5.00306 -0.138064 +vn -0.793927 0.383547 -0.471775 +v -0.677001 5.23737 0.026577 +vn -0.713759 0.610279 -0.343668 +v -0.65138 5.22473 -0.042295 +vn -0.692156 0.597735 -0.404516 +v -0.688246 5.18296 -0.036323 +vn -0.736248 0.547364 -0.39791 +v -0.594383 5.30538 -0.001119 +vn -0.605614 0.710508 -0.358343 +v -0.573232 5.2888 -0.064133 +vn -0.592802 0.689669 -0.415863 +v -0.615955 5.26243 -0.043025 +vn -0.64536 0.650358 -0.400679 +v -0.618409 5.14912 -0.184542 +vn -0.678944 0.523282 -0.514986 +v -0.593396 5.19202 -0.170914 +vn -0.64957 0.573669 -0.498961 +v -0.534794 5.21325 -0.216681 +vn -0.589563 0.599788 -0.54099 +v -0.559243 5.23302 -0.164813 +vn -0.608661 0.629051 -0.483557 +v -0.527919 5.24951 -0.180678 +vn -0.56389 0.658464 -0.498451 +v -0.694477 5.25307 0.097173 +vn -0.725788 0.625042 -0.287324 +v -0.654229 5.29028 0.083645 +vn -0.67319 0.677494 -0.296338 +v -0.717434 5.27783 0.239459 +vn -0.741919 0.64951 -0.166412 +v -0.677143 5.31836 0.229902 +vn -0.692014 0.701247 -0.171376 +v -0.707651 5.26711 0.168557 +vn -0.735184 0.637864 -0.22942 +v -0.608905 5.3238 0.065004 +vn -0.614284 0.726171 -0.308756 +v -0.557753 5.35255 0.038937 +vn -0.552439 0.767152 -0.326019 +v -0.631142 5.35718 0.215886 +vn -0.637419 0.746189 -0.192091 +v -0.573997 5.39391 0.189101 +vn -0.559022 0.796727 -0.229609 +v -0.620219 5.34245 0.138024 +vn -0.620463 0.74115 -0.256364 +v -0.121002 3.72565 -2.02007 +vn -0.402801 0.877125 -0.261538 +v -0.153631 3.71662 -1.97883 +vn -0.523622 0.844529 -0.112206 +v -0.126958 3.73243 -1.92988 +vn -0.40742 0.908321 0.0946659 +v -0.178678 3.6879 -2.01875 +vn -0.621734 0.741747 -0.251512 +v -0.214116 3.66083 -1.98809 +vn -0.749512 0.646513 -0.142309 +v -0.183813 3.69634 -1.94272 +vn -0.655867 0.754673 0.0174942 +v -0.164891 3.70509 -1.89578 +vn -0.54189 0.806848 0.235268 +v -0.24129 3.63394 -1.9408 +vn -0.77895 0.626553 -0.0258433 +v -0.201289 3.66447 -1.86994 +vn -0.637655 0.700354 0.320779 +v -0.12153 3.70324 -2.07161 +vn -0.400903 0.786762 -0.469343 +v -0.120584 3.67026 -2.11355 +vn -0.371422 0.673438 -0.639162 +v -0.152036 3.68447 -2.0698 +vn -0.531701 0.714628 -0.454534 +v -0.133577 3.62023 -2.15137 +vn -0.390467 0.561359 -0.729665 +v -0.129731 3.55684 -2.19085 +vn -0.329005 0.419086 -0.84624 +v -0.156812 3.60004 -2.15213 +vn -0.49481 0.492079 -0.716255 +v -0.186434 3.65928 -2.06253 +vn -0.64564 0.632715 -0.427575 +v -0.213047 3.62414 -2.06484 +vn -0.745584 0.513279 -0.425028 +v -0.210297 3.65107 -2.02963 +vn -0.744412 0.602178 -0.2885 +v -0.177758 3.62795 -2.10945 +vn -0.603217 0.559179 -0.568725 +v -0.182627 3.57706 -2.1465 +vn -0.608755 0.441704 -0.659026 +v -0.237102 3.55553 -2.09721 +vn -0.743004 0.456476 -0.489464 +v -0.090699 3.71436 -2.07283 +vn -0.261983 0.832001 -0.489018 +v -0.057779 3.74391 -2.02163 +vn -0.168916 0.948884 -0.266619 +v -0.029902 3.72596 -2.07166 +vn -0.068399 0.863674 -0.499388 +v -0.059929 3.72167 -2.07346 +vn -0.150762 0.851898 -0.501539 +v -0.095162 3.62842 -2.16062 +vn -0.237697 0.562356 -0.791995 +v -0.061601 3.68548 -2.11949 +vn -0.14791 0.718308 -0.679821 +v -0.031431 3.64208 -2.16087 +vn -0.0563985 0.594052 -0.802447 +v -0.063086 3.63539 -2.16286 +vn -0.125693 0.573349 -0.809612 +v -0.092282 3.74479 -1.97546 +vn -0.264814 0.960429 -0.0863123 +v -0.101961 3.73167 -1.88718 +vn -0.253736 0.909061 0.330493 +v -0.064734 3.75017 -1.92997 +vn -0.169678 0.976534 0.132627 +v -0.030325 3.75523 -1.97748 +vn -0.079503 0.993541 -0.0809692 +v -0.034411 3.74313 -1.888 +vn -0.0696003 0.936513 0.343656 +v -0.209984 2.99573 -2.27782 +vn -0.26785 0.050955 -0.962112 +v -0.220827 2.93857 -2.27719 +vn -0.274536 0.0398126 -0.960752 +v -0.232263 3.00006 -2.27065 +vn -0.323035 0.061991 -0.944354 +v -0.274512 2.93262 -2.25931 +vn -0.367838 0.0575394 -0.928108 +v -0.253067 2.88034 -2.26955 +vn -0.316235 0.0308125 -0.94818 +v -0.283074 2.87103 -2.2592 +vn -0.357125 0.0397349 -0.933211 +v -0.372339 3.01006 -2.19081 +vn -0.660897 0.158827 -0.733477 +v -0.410818 2.94576 -2.16805 +vn -0.700819 0.170786 -0.692593 +v -0.394505 3.02047 -2.16603 +vn -0.729984 0.183934 -0.658249 +v -0.357598 2.94128 -2.21437 +vn -0.581816 0.111024 -0.805707 +v -0.354457 2.87789 -2.22408 +vn -0.528274 0.0800293 -0.845294 +v -0.382596 2.87941 -2.20459 +vn -0.590974 0.109803 -0.799183 +v -0.158079 2.99879 -2.28942 +vn -0.177753 0.043121 -0.98313 +v -0.165057 2.93897 -2.29007 +vn -0.181929 0.0265214 -0.982954 +v -0.184168 2.99719 -2.28414 +vn -0.220675 0.0461254 -0.974256 +v -0.047566 3.00384 -2.30061 +vn -0.0413971 0.0333941 -0.998585 +v -0.053116 2.9444 -2.30193 +vn -0.0468779 0.0207036 -0.998686 +v -0.078419 3.00117 -2.29897 +vn -0.0699977 0.0352854 -0.996923 +v -0.184202 2.76251 -2.28764 +vn -0.180504 -0.0144227 -0.983469 +v -0.190059 2.70592 -2.28523 +vn -0.1808 -0.026374 -0.983166 +v -0.214958 2.7607 -2.28125 +vn -0.221529 -0.00895399 -0.975113 +v -0.055269 2.76962 -2.30156 +vn -0.0432046 -0.0247223 -0.99876 +v -0.061177 2.71296 -2.29961 +vn -0.0485751 -0.0336581 -0.998252 +v -0.091252 2.76741 -2.29938 +vn -0.0743674 -0.0219135 -0.99699 +v -0.161038 3.33198 -2.25238 +vn -0.287974 0.193249 -0.937937 +v -0.154897 3.39082 -2.24051 +vn -0.307215 0.242424 -0.920244 +v -0.13729 3.33871 -2.25732 +vn -0.213244 0.200792 -0.956143 +v -0.142679 3.47628 -2.21975 +vn -0.323363 0.332246 -0.88603 +v -0.107161 3.47981 -2.22834 +vn -0.199065 0.318704 -0.926715 +v -0.081718 3.33589 -2.26688 +vn -0.103731 0.179738 -0.97823 +v -0.07767 3.39929 -2.2541 +vn -0.116164 0.220697 -0.9684 +v -0.054976 3.33424 -2.26912 +vn -0.0529838 0.173838 -0.983348 +v -0.077086 3.49464 -2.22822 +vn -0.131926 0.339827 -0.931189 +v -0.059892 3.57268 -2.19918 +vn -0.119208 0.431452 -0.894225 +v -0.038323 3.49099 -2.23301 +vn -0.0443222 0.315297 -0.947957 +v -0.183982 3.17275 -2.2693 +vn -0.282606 0.108831 -0.953042 +v -0.20149 3.22728 -2.25712 +vn -0.356887 0.120412 -0.926354 +v -0.178191 3.24143 -2.26324 +vn -0.280265 0.13828 -0.949911 +v -0.28006 3.35956 -2.16906 +vn -0.711619 0.289841 -0.639992 +v -0.275303 3.27878 -2.20487 +vn -0.629579 0.234309 -0.740762 +v -0.17351 3.46292 -2.2119 +vn -0.416618 0.320108 -0.850859 +v -0.221129 3.36248 -2.21825 +vn -0.507991 0.261321 -0.820765 +v -0.237464 3.42879 -2.18284 +vn -0.627083 0.313162 -0.713229 +v -0.203395 3.4493 -2.20001 +vn -0.519894 0.316515 -0.793428 +v -0.15209 3.50669 -1.70076 +vn -0.20291 0.562854 0.801264 +v -0.111093 3.46434 -1.66356 +vn -0.111479 0.601022 0.79142 +v -0.099034 3.50881 -1.69298 +vn -0.102074 0.551002 0.828238 +v -0.176989 3.4041 -1.62619 +vn -0.204157 0.678146 0.706001 +v -0.117834 3.41481 -1.62349 +vn -0.116147 0.677135 0.726635 +v -0.167227 3.45489 -1.66706 +vn -0.203112 0.608815 0.76687 +v -0.051906 3.52189 -1.69761 +vn -0.0468992 0.537588 0.841902 +v -0.048293 3.57072 -1.72682 +vn -0.0515383 0.51123 0.857897 +v -0.058381 3.42329 -1.62506 +vn -0.0464077 0.670279 0.740656 +v -0.054981 3.47232 -1.6644 +vn -0.0443381 0.592313 0.804487 +v -0.221942 3.44025 -1.67311 +vn -0.307101 0.617075 0.724505 +v -0.210952 3.4915 -1.70942 +vn -0.341003 0.584747 0.736063 +v -0.257318 3.46854 -1.71466 +vn -0.439346 0.607721 0.661551 +v -0.323835 3.39534 -1.69812 +vn -0.576035 0.613252 0.540468 +v -0.302359 3.45101 -1.73617 +vn -0.606084 0.597698 0.524804 +v -0.341768 3.41972 -1.75183 +vn -0.709945 0.582069 0.396452 +v -0.274489 3.42049 -1.68309 +vn -0.437277 0.620957 0.650539 +v -0.292221 3.36592 -1.6403 +vn -0.429939 0.67226 0.602677 +v -0.235281 3.38807 -1.63156 +vn -0.308162 0.677666 0.667687 +v -0.368129 3.36474 -1.71989 +vn -0.712208 0.585104 0.387833 +v -0.39849 3.30001 -1.67394 +vn -0.696249 0.62163 0.358905 +v -0.346607 3.33724 -1.65392 +vn -0.565481 0.654692 0.501607 +v -0.216839 3.57808 -1.77611 +vn -0.492271 0.546501 0.6775 +v -0.228518 3.60485 -1.81488 +vn -0.6053 0.636011 0.478645 +v -0.251439 3.5596 -1.79027 +vn -0.60431 0.569204 0.557509 +v -0.16122 3.64233 -1.7998 +vn -0.391516 0.654197 0.647102 +v -0.282735 3.53934 -1.8087 +vn -0.719401 0.556275 0.415958 +v -0.30569 3.51677 -1.82578 +vn -0.799952 0.519078 0.301055 +v -0.186031 3.59518 -1.77153 +vn -0.379178 0.587823 0.714625 +v -0.136409 3.60311 -1.7589 +vn -0.228154 0.555398 0.799674 +v -0.040404 3.61775 -1.75461 +vn -0.0494911 0.548661 0.834578 +v -0.086062 3.60536 -1.75058 +vn -0.114414 0.53778 0.835286 +v -0.08401 3.65514 -1.78501 +vn -0.141446 0.625965 0.766917 +v -0.116554 3.68183 -1.81665 +vn -0.251024 0.70452 0.663807 +v 0 3.66533 -1.78667 +vn -1.25969e-06 0.636881 0.770962 +v -0.039377 3.69436 -1.8138 +vn -0.0611846 0.717376 0.693994 +v -1.37391 2.62072 0.863876 +vn -0.824857 0.547954 0.139128 +v -1.3999 2.57566 0.880891 +vn -0.840476 0.521076 0.148591 +v -1.36325 2.61746 0.934373 +vn -0.823484 0.543909 0.161361 +v -1.39227 2.62432 0.714201 +vn -0.822996 0.560773 0.0906183 +v -1.42043 2.5789 0.729395 +vn -0.839705 0.533544 0.101126 +v -1.38349 2.62327 0.790252 +vn -0.823988 0.555064 0.113787 +v -1.42525 2.5285 0.896798 +vn -0.855792 0.492493 0.15834 +v -1.44949 2.47962 0.911549 +vn -0.871741 0.460413 0.167592 +v -1.41257 2.52568 0.968792 +vn -0.854203 0.48728 0.181369 +v -1.44784 2.53126 0.743564 +vn -0.856509 0.503921 0.111604 +v -1.47402 2.48174 0.756757 +vn -0.874027 0.470464 0.121414 +v -1.43703 2.5305 0.821442 +vn -0.85648 0.498125 0.135328 +v -1.35269 2.67127 0.769036 +vn -0.803733 0.586088 0.102533 +v -1.35173 2.65876 0.840128 +vn -0.809373 0.573443 0.126799 +v -1.32087 2.70253 0.832413 +vn -0.793268 0.597127 0.11902 +v -1.30275 2.73971 0.748218 +vn -0.771734 0.630275 0.0847328 +v -1.295 2.73858 0.819648 +vn -0.776115 0.620953 0.109829 +v -1.26993 2.7705 0.808734 +vn -0.754341 0.648445 0.102411 +v -1.36658 2.6718 0.615396 +vn -0.796886 0.602422 0.0453933 +v -1.36608 2.66445 0.694699 +vn -0.806722 0.586046 0.0758279 +v -1.33423 2.70797 0.683858 +vn -0.787719 0.612909 0.0619799 +v -1.31228 2.74132 0.600524 +vn -0.764609 0.643929 0.027003 +v -1.3071 2.74293 0.675197 +vn -0.76973 0.635814 0.0570637 +v -1.28011 2.77525 0.665529 +vn -0.749155 0.660701 0.0473388 +v -1.3027 2.69806 0.954238 +vn -0.790188 0.5904 0.164408 +v -1.27778 2.71373 1.01018 +vn -0.76677 0.611041 0.196705 +v -1.27637 2.73302 0.951555 +vn -0.76925 0.616347 0.168436 +v -1.3157 2.65315 1.0397 +vn -0.799606 0.566584 0.199031 +v -1.28782 2.68261 1.06413 +vn -0.773741 0.593933 0.220382 +v -1.26134 2.75578 0.934473 +vn -0.754632 0.637589 0.154955 +v -1.24134 2.76932 0.9698 +vn -0.726955 0.660263 0.188651 +v -1.24556 2.77693 0.921265 +vn -0.736313 0.660977 0.14475 +v -1.35207 2.61324 1.00069 +vn -0.821795 0.538684 0.185667 +v -1.32627 2.65801 0.979804 +vn -0.803705 0.568153 0.176808 +v -1.39907 2.52245 1.03659 +vn -0.851307 0.482818 0.205336 +v -1.37589 2.56881 1.01916 +vn -0.837113 0.510842 0.195658 +v -1.33996 2.60925 1.06173 +vn -0.817299 0.535899 0.211743 +v -1.32698 2.60569 1.11713 +vn -0.807405 0.537932 0.242334 +v -1.30404 2.64948 1.09272 +vn -0.787339 0.569243 0.23677 +v -1.38481 2.51923 1.09936 +vn -0.846424 0.479581 0.231447 +v -1.37003 2.51604 1.15644 +vn -0.83782 0.479191 0.261596 +v -1.34872 2.56182 1.13762 +vn -0.824727 0.505694 0.253177 +v -1.54079 2.21476 0.965083 +vn -0.953415 0.22456 0.201426 +v -1.546 2.15927 0.994252 +vn -0.96304 0.167864 0.210655 +v -1.52325 2.21739 1.04063 +vn -0.947065 0.229217 0.224781 +v -1.57191 2.21169 0.804154 +vn -0.961326 0.22394 0.160322 +v -1.58289 2.15049 0.809576 +vn -0.975223 0.15262 0.16015 +v -1.57081 2.18154 0.848621 +vn -0.966897 0.188618 0.171855 +v -1.55835 2.09848 0.976115 +vn -0.973145 0.102021 0.206352 +v -1.54076 2.10546 1.05104 +vn -0.966957 0.110073 0.22995 +v -1.58935 2.08929 0.815042 +vn -0.983425 0.0828288 0.16129 +v -1.58799 2.02743 0.842385 +vn -0.98629 0.0142987 0.164399 +v -1.57576 2.07783 0.898663 +vn -0.979834 0.0771322 0.184326 +v -1.49562 2.32491 1.02004 +vn -0.918669 0.332095 0.213917 +v -1.51181 2.32515 0.946014 +vn -0.923194 0.333578 0.190888 +v -1.52798 2.27089 0.954652 +vn -0.939253 0.281075 0.196978 +v -1.45761 2.42762 0.997852 +vn -0.885591 0.419615 0.199126 +v -1.47223 2.42942 0.924656 +vn -0.888573 0.423566 0.176155 +v -1.49311 2.37795 0.936106 +vn -0.905961 0.3813 0.183972 +v -1.52701 2.32484 0.868332 +vn -0.926702 0.335392 0.169519 +v -1.5401 2.32565 0.790147 +vn -0.927652 0.342261 0.149397 +v -1.55761 2.27085 0.795361 +vn -0.945575 0.284354 0.158209 +v -1.48592 2.43054 0.847937 +vn -0.890801 0.427702 0.153442 +v -1.49854 2.43065 0.7685 +vn -0.892277 0.432155 0.130704 +v -1.521 2.37802 0.778787 +vn -0.910834 0.388635 0.139086 +v -1.47869 2.32429 1.08964 +vn -0.913146 0.330768 0.238235 +v -1.46142 2.37539 1.07905 +vn -0.897418 0.375762 0.231179 +v -1.44358 2.32215 1.21264 +vn -0.896274 0.330696 0.295521 +v -1.42758 2.37183 1.2015 +vn -0.882012 0.371506 0.289894 +v -1.46123 2.32346 1.15406 +vn -0.906113 0.329832 0.264897 +v -1.44222 2.42543 1.06673 +vn -0.881483 0.416122 0.223226 +v -1.42133 2.47447 1.05258 +vn -0.865996 0.451672 0.214577 +v -1.40986 2.42067 1.18844 +vn -0.866558 0.413112 0.280028 +v -1.39058 2.46877 1.17345 +vn -0.852496 0.44598 0.272675 +v -1.4262 2.42314 1.13048 +vn -0.875647 0.413457 0.249591 +v -1.50534 2.21887 1.11032 +vn -0.940102 0.231563 0.250173 +v -1.49371 2.27206 1.09886 +vn -0.927727 0.282332 0.244155 +v -1.52283 2.10948 1.12041 +vn -0.959854 0.11673 0.255057 +v -1.50444 2.11275 1.1845 +vn -0.951424 0.122606 0.282419 +v -1.50985 2.16558 1.13647 +vn -0.948744 0.177107 0.261758 +v -1.48698 2.21993 1.17467 +vn -0.931963 0.233622 0.277245 +v -1.4685 2.22018 1.23317 +vn -0.9213 0.236779 0.30845 +v -1.45759 2.27158 1.2222 +vn -0.910152 0.282264 0.303232 +v -1.48575 2.1157 1.24279 +vn -0.940857 0.126222 0.314413 +v -1.4682 2.12413 1.28917 +vn -0.926405 0.135294 0.351381 +v -1.4727 2.1689 1.25525 +vn -0.928366 0.183634 0.323133 +v -1.43517 1.40319 0.980595 +vn -0.886483 -0.41303 0.208695 +v -1.45445 1.42341 0.928092 +vn -0.919994 -0.354709 0.166713 +v -1.4414 1.38624 0.915076 +vn -0.89945 -0.400849 0.174096 +v -1.46131 1.48212 1.00543 +vn -0.927862 -0.326021 0.181059 +v -1.47937 1.50848 0.952361 +vn -0.943597 -0.291603 0.156822 +v -1.46789 1.46584 0.937949 +vn -0.932853 -0.322841 0.159874 +v -1.44542 1.36922 0.847177 +vn -0.905653 -0.399101 0.143214 +v -1.46194 1.38898 0.787156 +vn -0.927934 -0.353667 0.11772 +v -1.44867 1.35251 0.775465 +vn -0.910499 -0.394318 0.124516 +v -1.48956 1.47498 0.802091 +vn -0.946958 -0.301513 0.111177 +v -1.49288 1.46111 0.730328 +vn -0.947137 -0.306395 0.0951466 +v -1.47412 1.42633 0.796875 +vn -0.937635 -0.327328 0.117037 +v -1.43185 1.42576 1.03806 +vn -0.876664 -0.423268 0.228701 +v -1.42205 1.43962 1.09298 +vn -0.851638 -0.430745 0.298617 +v -1.44268 1.45798 1.05172 +vn -0.901071 -0.368314 0.228943 +v -1.40077 1.4609 1.17617 +vn -0.810406 -0.460445 0.36226 +v -1.446 1.51982 1.12607 +vn -0.899501 -0.34624 0.266488 +v -1.45422 1.4985 1.06604 +vn -0.917236 -0.329623 0.223664 +v -1.46553 1.54188 1.07956 +vn -0.93157 -0.291439 0.217347 +v -1.43024 1.52083 1.17745 +vn -0.867678 -0.38501 0.314488 +v -1.41745 1.53699 1.22558 +vn -0.839957 -0.386866 0.380535 +v -1.44521 1.56956 1.18763 +vn -0.899496 -0.31205 0.30583 +v -1.39885 1.37606 1.05636 +vn -0.806423 -0.512489 0.29502 +v -1.4074 1.33857 0.954578 +vn -0.827376 -0.512128 0.230596 +v -1.37285 1.32294 1.02466 +vn -0.742121 -0.596829 0.305043 +v -1.40371 1.35716 1.00638 +vn -0.822539 -0.507634 0.256392 +v -1.37582 1.38898 1.13156 +vn -0.759678 -0.539045 0.363759 +v -1.35655 1.33756 1.08794 +vn -0.7176 -0.603922 0.346884 +v -1.42781 1.35178 0.902355 +vn -0.874069 -0.450572 0.18163 +v -1.41687 1.30428 0.824118 +vn -0.849639 -0.501568 0.162919 +v -1.43493 1.31851 0.763841 +vn -0.888704 -0.440111 0.128477 +v -1.42007 1.28799 0.753266 +vn -0.856325 -0.496869 0.140817 +v -1.41299 1.32103 0.890748 +vn -0.840286 -0.506079 0.194429 +v -1.3975 1.29288 0.880153 +vn -0.802202 -0.558883 0.210053 +v -1.42291 1.27414 0.67893 +vn -0.861172 -0.494919 0.115923 +v -1.40423 1.25973 0.743843 +vn -0.815565 -0.559112 0.149153 +v -1.36983 2.00254 -1.15685 +vn -0.893102 0.218281 -0.393347 +v -1.33517 2.00223 -1.23227 +vn -0.882739 0.213709 -0.418449 +v -1.37479 1.96816 -1.16138 +vn -0.90636 0.155301 -0.39293 +v -1.30691 1.9745 -1.30186 +vn -0.877212 0.162281 -0.451844 +v -1.31146 1.93957 -1.30386 +vn -0.883273 0.104806 -0.456995 +v -1.37814 1.89406 -1.16953 +vn -0.915553 0.0154951 -0.4019 +v -1.34639 1.86257 -1.23819 +vn -0.905046 -0.0332267 -0.424015 +v -1.3782 1.85632 -1.16827 +vn -0.914948 -0.0517553 -0.40024 +v -1.31426 1.90419 -1.30371 +vn -0.888784 0.0433673 -0.45627 +v -1.28517 1.87162 -1.35955 +vn -0.875465 -0.00139599 -0.48328 +v -1.31562 1.86809 -1.30258 +vn -0.891861 -0.0158092 -0.452034 +v -1.40396 1.99892 -1.07767 +vn -0.902348 0.211231 -0.375699 +v -1.36292 2.03764 -1.14976 +vn -0.881786 0.275146 -0.383077 +v -1.38745 2.0703 -1.06341 +vn -0.872949 0.333736 -0.355781 +v -1.34371 2.1072 -1.13299 +vn -0.855397 0.374783 -0.357537 +v -1.35443 2.07253 -1.14186 +vn -0.868027 0.328978 -0.371891 +v -1.29591 2.04245 -1.29035 +vn -0.861007 0.265816 -0.4336 +v -1.30018 2.00905 -1.30076 +vn -0.867559 0.216336 -0.447816 +v -1.32123 2.07377 -1.21507 +vn -0.862882 0.315519 -0.394819 +v -1.2804 2.10973 -1.27212 +vn -0.842879 0.349579 -0.409084 +v -1.28943 2.0759 -1.28108 +vn -0.85157 0.310221 -0.4226 +v -1.4373 2.00145 -0.993709 +vn -0.911651 0.21781 -0.348498 +v -1.46826 2.00384 -0.906504 +vn -0.91978 0.218068 -0.326268 +v -1.42919 2.03801 -0.987202 +vn -0.895076 0.289145 -0.33946 +v -1.49784 2.00981 -0.81756 +vn -0.926834 0.222646 -0.302337 +v -1.52253 2.0181 -0.729649 +vn -0.935253 0.222111 -0.275624 +v -1.48845 2.04872 -0.811146 +vn -0.905626 0.300851 -0.298881 +v -1.41899 2.07436 -0.979737 +vn -0.876163 0.350114 -0.331298 +v -1.44859 2.07905 -0.892586 +vn -0.879742 0.357055 -0.313952 +v -1.40629 2.11051 -0.970931 +vn -0.857651 0.403385 -0.318927 +v -1.47666 2.08718 -0.803604 +vn -0.881044 0.368904 -0.296095 +v -1.50132 2.09681 -0.713592 +vn -0.886304 0.369657 -0.278961 +v -1.46164 2.12542 -0.795125 +vn -0.856871 0.426678 -0.28934 +v -1.44234 1.9638 -0.999243 +vn -0.925067 0.141401 -0.352501 +v -1.40922 1.92439 -1.09298 +vn -0.920006 0.0706511 -0.385484 +v -1.4297 1.90143 -1.04589 +vn -0.92691 0.0213815 -0.374673 +v -1.44429 1.92423 -1.00632 +vn -0.933846 0.0640956 -0.351887 +v -1.50377 1.96991 -0.822295 +vn -0.943539 0.13775 -0.301263 +v -1.47605 1.92578 -0.917408 +vn -0.941626 0.0562034 -0.331936 +v -1.49381 1.90125 -0.868554 +vn -0.945479 -0.000852022 -0.325681 +v -1.50627 1.9276 -0.828707 +vn -0.953269 0.0538682 -0.297282 +v -1.57914 2.07391 -0.451859 +vn -0.950247 0.239795 -0.198818 +v -1.56346 2.05128 -0.545678 +vn -0.946851 0.231649 -0.223188 +v -1.58806 2.02798 -0.455297 +vn -0.969914 0.15559 -0.187242 +v -1.5436 2.03821 -0.63951 +vn -0.9382 0.236256 -0.252911 +v -1.55273 1.99141 -0.640603 +vn -0.959482 0.146519 -0.240679 +v -1.59317 1.98188 -0.455341 +vn -0.983215 0.0661499 -0.170036 +v -1.59353 1.92807 -0.459805 +vn -0.986142 -0.0232891 -0.164259 +v -1.60728 1.94724 -0.371222 +vn -0.99044 -0.00539013 -0.137842 +v -1.55681 1.94706 -0.643577 +vn -0.971023 0.0527156 -0.233098 +v -1.53296 1.9356 -0.734904 +vn -0.962337 0.051099 -0.267014 +v -1.55583 1.90213 -0.647895 +vn -0.971736 -0.0349061 -0.233475 +v -1.58969 2.09931 -0.362533 +vn -0.951838 0.250632 -0.176602 +v -1.56679 2.11894 -0.447109 +vn -0.923298 0.320085 -0.212288 +v -1.56044 2.1888 -0.35137 +vn -0.89743 0.390885 -0.204521 +v -1.5314 2.20573 -0.435928 +vn -0.860253 0.452235 -0.235475 +v -1.55069 2.16267 -0.441705 +vn -0.892026 0.392109 -0.224812 +v -1.53497 2.0758 -0.629685 +vn -0.914622 0.314126 -0.25454 +v -1.53711 2.13825 -0.531969 +vn -0.890296 0.384238 -0.244406 +v -1.504 2.15746 -0.615008 +vn -0.857265 0.441741 -0.264505 +v -1.52101 2.1168 -0.622435 +vn -0.886464 0.382039 -0.261204 +v -1.60051 2.12386 -0.264772 +vn -0.956126 0.251617 -0.150041 +v -1.60751 2.14584 -0.175814 +vn -0.958597 0.25613 -0.124453 +v -1.58703 2.17152 -0.25745 +vn -0.928911 0.330531 -0.166954 +v -1.61188 2.16831 -0.084787 +vn -0.95978 0.262862 -0.0986235 +v -1.59593 2.21909 -0.083887 +vn -0.934872 0.33635 -0.1135 +v -1.5923 2.19523 -0.173911 +vn -0.932351 0.333323 -0.140062 +v -1.568 2.2185 -0.257976 +vn -0.898899 0.39791 -0.183433 +v -1.57341 2.24306 -0.171762 +vn -0.902692 0.400919 -0.156239 +v -1.54781 2.26322 -0.250658 +vn -0.867419 0.457455 -0.195755 +v -1.57628 2.26815 -0.082864 +vn -0.906099 0.402967 -0.128852 +v -1.55325 2.31574 -0.081835 +vn -0.875519 0.460969 -0.144822 +v -1.55121 2.2894 -0.169475 +vn -0.870956 0.460383 -0.171704 +v -1.61185 2.06972 -0.267338 +vn -0.977422 0.165392 -0.131495 +v -1.61869 2.09426 -0.17783 +vn -0.978337 0.175346 -0.110047 +v -1.6189 1.9659 -0.27727 +vn -0.994147 -0.00435761 -0.10795 +v -1.62818 1.98619 -0.180957 +vn -0.996259 0.00525779 -0.0862545 +v -1.61858 2.01848 -0.264378 +vn -0.99033 0.0770684 -0.115354 +v -1.62351 2.11678 -0.08836 +vn -0.978274 0.186951 -0.0896091 +v -1.62683 2.13593 0.004802 +vn -0.979214 0.192388 -0.0642478 +v -1.63485 2.00369 -0.085712 +vn -0.998178 0.0110241 -0.0593273 +v -1.63912 2.02005 0.007874 +vn -0.999084 0.0196071 -0.0380474 +v -1.63617 2.04154 -0.039188 +vn -0.996838 0.058506 -0.0537733 +v -1.61112 2.23401 0.277809 +vn -0.961429 0.274991 0.00575853 +v -1.62518 2.17674 0.280721 +vn -0.979443 0.201263 0.0136282 +v -1.61667 2.21066 0.324194 +vn -0.970317 0.240825 0.0221136 +v -1.61471 2.20773 0.095551 +vn -0.960075 0.275022 -0.0511836 +v -1.6283 2.15174 0.098511 +vn -0.980642 0.192728 -0.034603 +v -1.62198 2.18714 0.143494 +vn -0.971637 0.234821 -0.0279463 +v -1.63495 2.11722 0.283463 +vn -0.99219 0.123165 0.0197527 +v -1.64004 2.05506 0.286598 +vn -0.998818 0.0408735 0.0263108 +v -1.63647 2.09101 0.330108 +vn -0.995738 0.0859716 0.0333824 +v -1.63718 2.0941 0.09975 +vn -0.993538 0.110705 -0.0250224 +v -1.64138 2.03396 0.101207 +vn -0.999459 0.0277993 -0.0175861 +v -1.64016 2.0707 0.146788 +vn -0.997273 0.0730828 -0.0103005 +v -1.59312 2.2892 0.274704 +vn -0.939312 0.343044 -0.00368314 +v -1.5959 2.27678 0.183886 +vn -0.937144 0.347056 -0.0362393 +v -1.6043 2.25585 0.231622 +vn -0.950534 0.310366 -0.0125534 +v -1.54628 2.39461 0.262983 +vn -0.885789 0.463004 -0.0317078 +v -1.54974 2.37973 0.177627 +vn -0.883971 0.463351 -0.0624538 +v -1.56157 2.36153 0.225621 +vn -0.900435 0.433468 -0.0363557 +v -1.59712 2.2611 0.09342 +vn -0.935682 0.34689 -0.0645427 +v -1.59759 2.24099 0.00637 +vn -0.936306 0.340301 -0.0867602 +v -1.55269 2.36076 0.093409 +vn -0.88376 0.459805 -0.0868827 +v -1.55366 2.33984 0.005953 +vn -0.879959 0.460787 -0.115532 +v -1.57678 2.31116 0.094988 +vn -0.911095 0.405717 -0.072805 +v -1.60018 2.25199 0.455214 +vn -0.958339 0.279206 0.0602539 +v -1.58158 2.30888 0.452898 +vn -0.93831 0.341818 0.0522906 +v -1.59481 2.27686 0.409231 +vn -0.949054 0.312615 0.0395978 +v -1.56473 2.31928 0.621238 +vn -0.935806 0.339914 0.0934128 +v -1.54293 2.37501 0.616898 +vn -0.913456 0.396781 0.0903526 +v -1.56653 2.33444 0.537975 +vn -0.930683 0.358904 0.0708255 +v -1.5357 2.41593 0.437616 +vn -0.894248 0.446873 0.0249773 +v -1.50833 2.46751 0.430976 +vn -0.869598 0.493583 0.0132496 +v -1.5343 2.42084 0.349354 +vn -0.884387 0.466736 -0.0041416 +v -1.51931 2.42794 0.606206 +vn -0.892752 0.442864 0.082854 +v -1.49399 2.47804 0.594766 +vn -0.873546 0.481432 0.0716915 +v -1.52753 2.42452 0.52233 +vn -0.893017 0.446481 0.0563441 +v -1.61471 2.19361 0.459646 +vn -0.975439 0.210006 0.0664481 +v -1.60192 2.22087 0.545398 +vn -0.967938 0.236856 0.0836393 +v -1.63063 2.07012 0.469293 +vn -0.99621 0.0505965 0.0707439 +v -1.6217 2.09378 0.558466 +vn -0.992299 0.0809214 0.093781 +v -1.62423 2.1138 0.509384 +vn -0.990968 0.107631 0.0799892 +v -1.59711 2.2041 0.633688 +vn -0.971365 0.213481 0.104284 +v -1.58268 2.26266 0.627763 +vn -0.954978 0.279577 0.099267 +v -1.61353 2.0812 0.645586 +vn -0.991216 0.0691568 0.112729 +v -1.60761 2.14346 0.63897 +vn -0.983941 0.142128 0.107982 +v -1.39501 2.41333 -0.401938 +vn -0.720539 0.637632 -0.272486 +v -1.42708 2.37499 -0.403671 +vn -0.746094 0.609759 -0.267465 +v -1.43104 2.40327 -0.326714 +vn -0.745033 0.615319 -0.257504 +v -1.38125 2.35555 -0.572948 +vn -0.733662 0.624746 -0.267269 +v -1.37112 2.33041 -0.659425 +vn -0.745546 0.613239 -0.260956 +v -1.40933 2.31795 -0.581004 +vn -0.756577 0.596672 -0.267534 +v -1.4553 2.33474 -0.413263 +vn -0.772205 0.578786 -0.262119 +v -1.48461 2.29265 -0.415973 +vn -0.801238 0.542229 -0.252992 +v -1.49074 2.31992 -0.336249 +vn -0.804265 0.543347 -0.24069 +v -1.43595 2.27878 -0.589687 +vn -0.778804 0.566792 -0.26872 +v -1.42234 2.25499 -0.677925 +vn -0.787576 0.554059 -0.269709 +v -1.46112 2.23861 -0.598367 +vn -0.80314 0.532115 -0.267992 +v -1.39284 2.4483 -0.324325 +vn -0.713304 0.648099 -0.266767 +v -1.36483 2.44704 -0.399867 +vn -0.695229 0.663126 -0.277346 +v -1.33681 2.5086 -0.318246 +vn -0.663514 0.69304 -0.28186 +v -1.30461 2.50744 -0.395552 +vn -0.637336 0.7166 -0.283349 +v -1.33439 2.47956 -0.395515 +vn -0.668769 0.688 -0.281787 +v -1.3898 2.38174 -0.488214 +vn -0.726519 0.631101 -0.27181 +v -1.35272 2.39106 -0.565512 +vn -0.71073 0.651196 -0.266095 +v -1.33026 2.45003 -0.476861 +vn -0.674971 0.683952 -0.276811 +v -1.29565 2.45325 -0.554022 +vn -0.657313 0.704591 -0.267379 +v -1.32387 2.4237 -0.559393 +vn -0.68467 0.678359 -0.266563 +v -1.4005 2.47494 -0.238472 +vn -0.723054 0.64208 -0.254804 +v -1.39531 2.51114 -0.159574 +vn -0.721948 0.648606 -0.241043 +v -1.36923 2.50888 -0.238246 +vn -0.694698 0.668182 -0.266322 +v -1.40388 2.53249 -0.072927 +vn -0.739118 0.639111 -0.2127 +v -1.39452 2.56688 0.002709 +vn -0.740461 0.644693 -0.18997 +v -1.3684 2.5694 -0.079723 +vn -0.710352 0.664914 -0.230846 +v -1.33536 2.54251 -0.238597 +vn -0.66441 0.692511 -0.281047 +v -1.3347 2.57464 -0.158461 +vn -0.672063 0.691535 -0.264783 +v -1.30596 2.57285 -0.231667 +vn -0.6397 0.711873 -0.289863 +v -1.33552 2.60295 -0.081121 +vn -0.681499 0.690114 -0.24352 +v -1.33533 2.62932 -0.001442 +vn -0.690383 0.69044 -0.216018 +v -1.30273 2.63432 -0.079758 +vn -0.651005 0.715286 -0.254086 +v -1.43383 2.43382 -0.244111 +vn -0.748602 0.615907 -0.245468 +v -1.43491 2.4643 -0.161479 +vn -0.753485 0.617329 -0.226196 +v -1.49513 2.34973 -0.250921 +vn -0.805374 0.54941 -0.222534 +v -1.4976 2.37919 -0.165355 +vn -0.81039 0.550466 -0.200638 +v -1.46549 2.3924 -0.247301 +vn -0.776866 0.584677 -0.233735 +v -1.43498 2.4931 -0.079202 +vn -0.762358 0.614222 -0.203818 +v -1.43389 2.51964 0.002443 +vn -0.770024 0.614099 -0.17305 +v -1.49837 2.40727 -0.08021 +vn -0.816516 0.550242 -0.174746 +v -1.49779 2.43293 0.004558 +vn -0.823062 0.549069 -0.145231 +v -1.46748 2.45098 -0.079784 +vn -0.788856 0.584851 -0.188826 +v -1.3943 2.62208 0.247794 +vn -0.773367 0.626257 -0.0985167 +v -1.42424 2.58318 0.243855 +vn -0.793909 0.601491 -0.0889778 +v -1.41105 2.61012 0.319745 +vn -0.79375 0.604956 -0.0631632 +v -1.40061 2.58263 0.086662 +vn -0.757266 0.634804 -0.153533 +v -1.43197 2.54306 0.083528 +vn -0.779482 0.609569 -0.144338 +v -1.42931 2.56345 0.164174 +vn -0.786612 0.607004 -0.11308 +v -1.45677 2.5395 0.24977 +vn -0.816156 0.573179 -0.0731831 +v -1.48815 2.4937 0.255999 +vn -0.839289 0.540509 -0.0586898 +v -1.47452 2.52153 0.335843 +vn -0.837459 0.545439 -0.0340456 +v -1.46474 2.50017 0.086084 +vn -0.803892 0.580679 -0.12872 +v -1.49616 2.45537 0.088985 +vn -0.829481 0.546734 -0.114205 +v -1.49344 2.47474 0.17299 +vn -0.835282 0.543264 -0.084664 +v -1.37575 2.65347 0.311025 +vn -0.766174 0.637706 -0.0794283 +v -1.3588 2.66128 0.230539 +vn -0.748346 0.652801 -0.117594 +v -1.32179 2.71369 0.297867 +vn -0.730386 0.675254 -0.102798 +v -1.29668 2.72543 0.217666 +vn -0.69823 0.700719 -0.146522 +v -1.32714 2.69537 0.223842 +vn -0.724573 0.67657 -0.131327 +v -1.39082 2.61126 0.164562 +vn -0.757901 0.639413 -0.129367 +v -1.36392 2.62241 0.078658 +vn -0.728775 0.663337 -0.169915 +v -1.33058 2.67526 0.148622 +vn -0.713941 0.681826 -0.159378 +v -1.30108 2.68426 0.069105 +vn -0.675468 0.708773 -0.203429 +v -1.33249 2.65427 0.072248 +vn -0.702678 0.686113 -0.188392 +v -1.353 2.68827 0.381885 +vn -0.765202 0.641478 -0.0545186 +v -1.32042 2.73096 0.449408 +vn -0.751341 0.658928 -0.0360644 +v -1.32236 2.72325 0.373982 +vn -0.743445 0.66527 -0.0685965 +v -1.34625 2.70184 0.53474 +vn -0.780295 0.625349 0.00881957 +v -1.31673 2.7379 0.525131 +vn -0.760352 0.649502 -0.0034175 +v -1.29277 2.75388 0.364226 +vn -0.717977 0.691046 -0.0834483 +v -1.26286 2.79101 0.43039 +vn -0.698307 0.712901 -0.0643459 +v -1.26466 2.78073 0.353235 +vn -0.687905 0.718687 -0.101364 +v -1.28812 2.76994 0.515936 +vn -0.737184 0.675488 -0.0165974 +v -1.26086 2.79862 0.508184 +vn -0.708994 0.704612 -0.0291651 +v -1.4165 2.60878 0.400165 +vn -0.806712 0.590408 -0.0251817 +v -1.38833 2.64494 0.381727 +vn -0.785044 0.617974 -0.0426038 +v -1.4785 2.5177 0.41981 +vn -0.8483 0.529511 0.00223633 +v -1.44798 2.56445 0.410467 +vn -0.82759 0.561215 -0.0114837 +v -1.41315 2.61463 0.479669 +vn -0.812232 0.583312 0.0051827 +v -1.40715 2.62021 0.558417 +vn -0.817376 0.574957 0.0363414 +v -1.38104 2.65717 0.537469 +vn -0.79832 0.601899 0.0200637 +v -1.47374 2.52253 0.502069 +vn -0.852148 0.522298 0.0323862 +v -1.46627 2.5275 0.583416 +vn -0.854565 0.515828 0.0603381 +v -1.43713 2.57504 0.571418 +vn -0.836148 0.546375 0.0482824 +v -1.29489 2.2821 -0.998023 +vn -0.788552 0.552166 -0.270739 +v -1.25415 2.3155 -1.04845 +vn -0.778253 0.571776 -0.259607 +v -1.26387 2.28729 -1.07846 +vn -0.792616 0.541427 -0.280388 +v -1.25272 2.34758 -0.975743 +vn -0.745621 0.621249 -0.241038 +v -1.21874 2.36227 -1.04381 +vn -0.731524 0.637503 -0.241792 +v -1.23614 2.34005 -1.04684 +vn -0.758994 0.600316 -0.252088 +v -1.24304 2.27899 -1.15101 +vn -0.800774 0.518708 -0.299504 +v -1.21088 2.3067 -1.18783 +vn -0.779735 0.546072 -0.306297 +v -1.21636 2.28541 -1.20945 +vn -0.790111 0.5144 -0.333342 +v -1.22008 2.33447 -1.10585 +vn -0.76001 0.590956 -0.270473 +v -1.20226 2.32843 -1.16861 +vn -0.761183 0.583504 -0.28306 +v -1.31609 2.29117 -0.916154 +vn -0.779192 0.570973 -0.258552 +v -1.33743 2.30017 -0.83016 +vn -0.767736 0.587659 -0.255417 +v -1.29431 2.32427 -0.905616 +vn -0.760797 0.600261 -0.24673 +v -1.35426 2.31555 -0.744796 +vn -0.755059 0.603928 -0.255257 +v -1.32847 2.34991 -0.736589 +vn -0.735328 0.630708 -0.247992 +v -1.27346 2.35445 -0.893972 +vn -0.738214 0.631602 -0.236895 +v -1.28655 2.36803 -0.814675 +vn -0.721535 0.6508 -0.236319 +v -1.25076 2.37936 -0.895202 +vn -0.708991 0.66751 -0.227511 +v -1.30245 2.38231 -0.728642 +vn -0.711745 0.659557 -0.24167 +v -1.31651 2.39828 -0.644025 +vn -0.698233 0.669588 -0.253222 +v -1.27727 2.41101 -0.720821 +vn -0.682828 0.690957 -0.237329 +v -1.33689 2.2561 -0.927891 +vn -0.795196 0.542807 -0.270227 +v -1.33141 2.2127 -1.02248 +vn -0.816817 0.492839 -0.299867 +v -1.37497 2.1836 -0.950445 +vn -0.82487 0.482038 -0.295346 +v -1.35663 2.22017 -0.939485 +vn -0.81006 0.513218 -0.283567 +v -1.37818 2.28216 -0.750172 +vn -0.774042 0.576631 -0.261451 +v -1.38024 2.22742 -0.856639 +vn -0.803086 0.528673 -0.274878 +v -1.42402 2.20263 -0.776552 +vn -0.812283 0.513618 -0.276394 +v -1.39876 2.24484 -0.768726 +vn -0.792191 0.547099 -0.270401 +v -1.28696 2.24681 -1.08744 +vn -0.809241 0.507363 -0.296162 +v -1.23446 2.24614 -1.22368 +vn -0.807531 0.47751 -0.346234 +v -1.30325 2.21222 -1.1 +vn -0.821827 0.476256 -0.312698 +v -1.27512 2.21146 -1.17246 +vn -0.824255 0.457441 -0.333693 +v -1.31796 2.17719 -1.11202 +vn -0.832927 0.445494 -0.328281 +v -1.24735 2.2125 -1.23794 +vn -0.820541 0.442231 -0.362139 +v -1.21973 2.21426 -1.29497 +vn -0.80785 0.43508 -0.397597 +v -1.25913 2.17824 -1.25076 +vn -0.828289 0.412162 -0.379552 +v -1.18057 2.56712 -0.471311 +vn -0.455751 0.835602 -0.306691 +v -1.1796 2.58919 -0.415058 +vn -0.439897 0.83806 -0.322717 +v -1.15739 2.60434 -0.404054 +vn -0.404677 0.852382 -0.331181 +v -1.1397 2.58715 -0.470313 +vn -0.393238 0.864084 -0.314202 +v -1.14199 2.61313 -0.399438 +vn -0.375617 0.863306 -0.337067 +v -1.12914 2.62041 -0.394492 +vn -0.364589 0.866598 -0.34071 +v -1.17332 2.54252 -0.55349 +vn -0.451126 0.847169 -0.280695 +v -1.15705 2.55297 -0.54617 +vn -0.412749 0.863686 -0.289284 +v -1.13643 2.55717 -0.562225 +vn -0.396419 0.87418 -0.280468 +v -1.12034 2.56259 -0.567509 +vn -0.390543 0.878881 -0.273942 +v -1.1793 2.66147 -0.238059 +vn -0.440553 0.828723 -0.345154 +v -1.17613 2.69229 -0.16735 +vn -0.44653 0.827736 -0.339801 +v -1.16274 2.66589 -0.247143 +vn -0.404976 0.843433 -0.353009 +v -1.17649 2.72359 -0.09 +vn -0.454273 0.829174 -0.325738 +v -1.15802 2.73307 -0.089976 +vn -0.416256 0.845868 -0.333524 +v -1.12816 2.68088 -0.248078 +vn -0.363138 0.859267 -0.360265 +v -1.11577 2.71473 -0.180023 +vn -0.384791 0.851825 -0.355429 +v -1.11454 2.69334 -0.232021 +vn -0.373651 0.854834 -0.360061 +v -1.14117 2.74094 -0.090108 +vn -0.383536 0.858712 -0.339872 +v -1.14076 2.76884 -0.018025 +vn -0.400193 0.859498 -0.317976 +v -1.1263 2.74569 -0.094024 +vn -0.364264 0.864853 -0.345458 +v -1.18136 2.63686 -0.293737 +vn -0.444914 0.825711 -0.346774 +v -1.20053 2.65018 -0.23621 +vn -0.487419 0.806955 -0.333536 +v -1.22457 2.60398 -0.31105 +vn -0.525826 0.787785 -0.320783 +v -1.24928 2.61804 -0.234681 +vn -0.568951 0.761072 -0.311553 +v -1.22972 2.63558 -0.225916 +vn -0.537641 0.782035 -0.315219 +v -1.1977 2.71197 -0.088022 +vn -0.495966 0.809699 -0.313697 +v -1.2206 2.67052 -0.155048 +vn -0.529382 0.786745 -0.317469 +v -1.24624 2.67992 -0.084593 +vn -0.580621 0.762314 -0.285931 +v -1.22071 2.69803 -0.085978 +vn -0.538513 0.787191 -0.300555 +v -1.18016 2.60671 -0.369214 +vn -0.444095 0.833744 -0.328102 +v -1.20393 2.58266 -0.396629 +vn -0.482388 0.814692 -0.321837 +v -1.1914 2.53117 -0.556508 +vn -0.497296 0.822275 -0.276695 +v -1.21374 2.50105 -0.604019 +vn -0.54383 0.796381 -0.264625 +v -1.2198 2.52501 -0.522056 +vn -0.536631 0.796437 -0.278776 +v -1.22398 2.57421 -0.386843 +vn -0.521588 0.791946 -0.317437 +v -1.22841 2.54892 -0.442162 +vn -0.537871 0.784786 -0.307907 +v -1.2461 2.56265 -0.376811 +vn -0.568292 0.763472 -0.306846 +v -1.24515 2.49573 -0.554391 +vn -0.578609 0.76904 -0.271642 +v -1.01489 1.15404 -1.01155 +vn -0.435712 -0.819272 -0.372757 +v -1.01077 1.18712 -1.08477 +vn -0.472859 -0.784986 -0.400251 +v -0.997962 1.18173 -1.08888 +vn -0.455963 -0.796636 -0.396823 +v -1.04017 1.16493 -1.00431 +vn -0.475095 -0.793631 -0.380046 +v -1.03534 1.19882 -1.07731 +vn -0.504226 -0.763555 -0.403409 +v -1.02286 1.19268 -1.08094 +vn -0.489339 -0.774139 -0.401567 +v -0.983367 1.21076 -1.16132 +vn -0.47799 -0.773418 -0.416354 +v -0.985034 1.24652 -1.22295 +vn -0.501482 -0.747306 -0.435948 +v -0.972398 1.24085 -1.22757 +vn -0.493986 -0.753769 -0.433371 +v -1.00828 1.22202 -1.1528 +vn -0.500659 -0.756487 -0.420793 +v -1.00915 1.25695 -1.21242 +vn -0.521817 -0.73447 -0.43389 +v -0.996867 1.25143 -1.21757 +vn -0.509706 -0.742067 -0.435357 +v -1.03386 1.1283 -0.930043 +vn -0.409579 -0.844383 -0.345343 +v -1.05347 1.10487 -0.845816 +vn -0.389943 -0.866125 -0.312686 +v -1.04692 1.13331 -0.926402 +vn -0.437214 -0.82831 -0.350353 +v -1.07343 1.08432 -0.759611 +vn -0.362272 -0.890321 -0.27584 +v -1.09234 1.06702 -0.67282 +vn -0.347301 -0.908072 -0.234066 +v -1.08674 1.08899 -0.756483 +vn -0.401899 -0.870981 -0.282611 +v -1.05914 1.13883 -0.923406 +vn -0.463869 -0.812111 -0.353978 +v -1.07909 1.11519 -0.839721 +vn -0.448073 -0.833319 -0.323743 +v -1.07168 1.14501 -0.92071 +vn -0.484936 -0.79787 -0.358107 +v -1.09903 1.09434 -0.754142 +vn -0.440248 -0.850365 -0.288203 +v -1.11824 1.07695 -0.667933 +vn -0.427063 -0.869548 -0.247999 +v -1.11157 1.10043 -0.752186 +vn -0.470041 -0.832269 -0.293923 +v -1.01935 1.1232 -0.934397 +vn -0.390726 -0.855579 -0.339585 +v -0.982704 1.14246 -1.02193 +vn -0.40894 -0.837721 -0.361928 +v -0.980142 1.11088 -0.946766 +vn -0.371779 -0.868559 -0.327698 +v -1.00136 1.11746 -0.940018 +vn -0.377268 -0.863599 -0.334462 +v -1.05857 1.0797 -0.763489 +vn -0.335989 -0.902836 -0.268327 +v -1.02033 1.09456 -0.855424 +vn -0.354424 -0.885343 -0.300919 +v -1.01808 1.0688 -0.775031 +vn -0.322259 -0.911231 -0.256528 +v -1.04001 1.07465 -0.768701 +vn -0.320962 -0.909623 -0.26376 +v -0.983809 1.17609 -1.09365 +vn -0.444918 -0.804902 -0.392658 +v -0.96307 1.27022 -1.28771 +vn -0.509504 -0.735633 -0.446374 +v -0.958491 1.23475 -1.23276 +vn -0.490047 -0.758279 -0.429961 +v -0.966404 1.16954 -1.09959 +vn -0.435862 -0.812563 -0.386995 +v -0.952031 1.19792 -1.17262 +vn -0.46497 -0.786133 -0.407182 +v -0.945917 1.16192 -1.10666 +vn -0.43311 -0.81757 -0.379466 +v -0.941462 1.22754 -1.23934 +vn -0.487098 -0.76276 -0.425361 +v -0.93177 1.25647 -1.30065 +vn -0.509293 -0.740402 -0.438663 +v -0.922 1.21962 -1.24753 +vn -0.490178 -0.765983 -0.415928 +v -1.15291 1.03068 -0.328045 +vn -0.310031 -0.946848 -0.085789 +v -1.15399 1.04011 -0.411811 +vn -0.365771 -0.922496 -0.123337 +v -1.14038 1.03558 -0.41364 +vn -0.306876 -0.944612 -0.116343 +v -1.17916 1.04072 -0.325433 +vn -0.418841 -0.902563 -0.0997598 +v -1.17883 1.05152 -0.409425 +vn -0.469034 -0.872786 -0.135098 +v -1.16634 1.0454 -0.410423 +vn -0.422569 -0.897099 -0.129028 +v -1.12591 1.04299 -0.499715 +vn -0.319806 -0.935226 -0.151907 +v -1.12357 1.05784 -0.583502 +vn -0.376843 -0.904662 -0.198936 +v -1.11008 1.05334 -0.586021 +vn -0.325085 -0.926088 -0.191521 +v -1.15198 1.05282 -0.495926 +vn -0.417353 -0.893226 -0.167224 +v -1.14846 1.06923 -0.580495 +vn -0.465272 -0.859327 -0.212318 +v -1.13592 1.06314 -0.581793 +vn -0.426515 -0.880826 -0.205502 +v -1.16421 1.02786 -0.242951 +vn -0.304527 -0.950596 -0.0602511 +v -1.17356 1.0267 -0.158121 +vn -0.313549 -0.948777 -0.0388373 +v -1.17778 1.03248 -0.24161 +vn -0.366579 -0.928087 -0.0653743 +v -1.18148 1.02669 -0.073163 +vn -0.306429 -0.951631 -0.0223475 +v -1.19044 1.02834 0.011308 +vn -0.320981 -0.947031 -0.0101926 +v -1.19506 1.03135 -0.071648 +vn -0.363583 -0.93107 -0.0302633 +v -1.19026 1.03793 -0.24042 +vn -0.42621 -0.901867 -0.0705788 +v -1.20074 1.03712 -0.151302 +vn -0.424366 -0.904227 -0.0478347 +v -1.20265 1.04403 -0.238691 +vn -0.472832 -0.877646 -0.0785353 +v -1.20518 1.03542 -0.061067 +vn -0.421441 -0.906548 -0.0236192 +v -1.21493 1.03829 0.01787 +vn -0.434781 -0.900386 -0.0164537 +v -1.21982 1.04327 -0.071768 +vn -0.477085 -0.878157 -0.0350677 +v -1.14889 1.02348 -0.244712 +vn -0.256143 -0.965095 -0.054611 +v -1.11797 1.02183 -0.332945 +vn -0.236083 -0.968758 -0.0759776 +v -1.10668 1.01409 -0.249248 +vn -0.212091 -0.976008 -0.0492469 +v -1.12959 1.019 -0.246692 +vn -0.224213 -0.973105 -0.0528701 +v -1.16635 1.02224 -0.074897 +vn -0.261451 -0.965098 -0.0151643 +v -1.14152 1.01848 -0.167481 +vn -0.234952 -0.971443 -0.0330958 +v -1.12442 1.01268 -0.076896 +vn -0.211943 -0.97718 -0.0141006 +v -1.15179 1.01886 -0.086343 +vn -0.230565 -0.97284 -0.0205688 +v -1.12506 1.03127 -0.416081 +vn -0.263023 -0.958613 -0.108996 +v -1.09495 1.049 -0.589261 +vn -0.288057 -0.939868 -0.1835 +v -1.10577 1.02687 -0.419566 +vn -0.234239 -0.966288 -0.106863 +v -1.09133 1.0342 -0.506632 +vn -0.25514 -0.956757 -0.139711 +v -1.08292 1.02201 -0.423905 +vn -0.225011 -0.968991 -0.102115 +v -1.07594 1.04448 -0.593767 +vn -0.265009 -0.947417 -0.179363 +v -1.05836 1.05775 -0.68134 +vn -0.299924 -0.928247 -0.220009 +v -1.05346 1.03936 -0.59931 +vn -0.261921 -0.949533 -0.172581 +v -1.19714 1.03111 0.177975 +vn -0.321045 -0.946906 0.01732 +v -1.19746 1.03327 0.260918 +vn -0.310002 -0.950094 0.0349409 +v -1.21047 1.03803 0.259654 +vn -0.374152 -0.926788 0.0327765 +v -1.22266 1.0416 0.176735 +vn -0.438575 -0.898607 0.0125148 +v -1.22264 1.04333 0.258573 +vn -0.436766 -0.899054 0.0306082 +v -1.23522 1.05005 0.258261 +vn -0.486672 -0.873101 0.02907 +v -1.20637 1.03366 0.094584 +vn -0.376124 -0.926569 0.000337524 +v -1.19335 1.02883 0.094712 +vn -0.310922 -0.95043 0.00330399 +v -1.23102 1.04575 0.093899 +vn -0.489559 -0.871952 -0.0056554 +v -1.21855 1.03903 0.094452 +vn -0.439315 -0.898328 -0.00289932 +v -1.20766 1.04631 0.422229 +vn -0.363111 -0.9282 0.0812077 +v -1.21679 1.0571 0.492058 +vn -0.417249 -0.903289 0.0998575 +v -1.21729 1.04954 0.41109 +vn -0.417799 -0.906018 0.0676473 +v -1.20028 1.0617 0.58571 +vn -0.374861 -0.917523 0.132781 +v -1.20743 1.0778 0.662921 +vn -0.42717 -0.888728 0.166402 +v -1.21301 1.06698 0.582318 +vn -0.431037 -0.89259 0.132253 +v -1.23266 1.05809 0.420244 +vn -0.471458 -0.878593 0.0761717 +v -1.24395 1.07264 0.49964 +vn -0.502788 -0.858374 0.101967 +v -1.24623 1.06584 0.420779 +vn -0.507395 -0.858576 0.0734628 +v -1.22799 1.07277 0.569803 +vn -0.469151 -0.874196 0.125219 +v -1.23471 1.08974 0.647723 +vn -0.494877 -0.854037 0.160367 +v -1.23959 1.08061 0.578277 +vn -0.500758 -0.855131 0.134132 +v -1.19071 1.04852 0.507164 +vn -0.317079 -0.942722 0.103615 +v -1.19423 1.04189 0.425257 +vn -0.30699 -0.94847 0.0785028 +v -1.1788 1.03751 0.427973 +vn -0.262589 -0.961812 0.0772368 +v -1.15591 1.03958 0.514505 +vn -0.250267 -0.963108 0.0989412 +v -1.1593 1.03294 0.431279 +vn -0.233666 -0.969225 0.0774847 +v -1.13685 1.02812 0.436058 +vn -0.221954 -0.972256 0.073852 +v -1.1806 1.06766 0.669031 +vn -0.336108 -0.92779 0.161978 +v -1.18646 1.05706 0.588465 +vn -0.319685 -0.938353 0.131509 +v -1.17094 1.0526 0.591834 +vn -0.279066 -0.951671 0.128238 +v -1.14542 1.05834 0.678054 +vn -0.276923 -0.94825 0.155358 +v -1.15166 1.04804 0.596528 +vn -0.253198 -0.958852 0.12843 +v -1.12881 1.04296 0.602192 +vn -0.244934 -0.961582 0.123964 +v -1.18192 1.02889 0.262279 +vn -0.257965 -0.965482 0.0360369 +v -1.16352 1.02207 0.179916 +vn -0.235697 -0.971612 0.020426 +v -1.16362 1.02442 0.263962 +vn -0.22655 -0.973314 0.0365427 +v -1.17775 1.02438 0.094938 +vn -0.257829 -0.966172 0.00589624 +v -1.14002 1.01937 0.266405 +vn -0.212532 -0.976468 0.0366169 +v -1.11285 1.01109 0.182958 +vn -0.213636 -0.976684 0.0211897 +v -1.11176 1.01337 0.269309 +vn -0.214096 -0.976129 0.0365318 +v -1.15937 1.01984 0.095238 +vn -0.226034 -0.974089 0.00764125 +v -1.15515 1.01879 0.005581 +vn -0.236738 -0.971562 -0.0048321 +v -1.13568 1.0147 0.095963 +vn -0.211227 -0.977399 0.00859502 +v -1.16637 1.09597 0.827114 +vn -0.367972 -0.901313 0.22854 +v -1.15923 1.114 0.903368 +vn -0.384186 -0.884731 0.263918 +v -1.17334 1.11899 0.898764 +vn -0.420532 -0.867576 0.265451 +v -1.19362 1.10639 0.81923 +vn -0.441233 -0.866648 0.232882 +v -1.1865 1.12449 0.894505 +vn -0.454905 -0.850436 0.264235 +v -1.20003 1.13073 0.890411 +vn -0.483843 -0.834246 0.26444 +v -1.17392 1.08059 0.748664 +vn -0.345507 -0.917817 0.195542 +v -1.18787 1.08534 0.74499 +vn -0.392199 -0.898416 0.197556 +v -1.20073 1.09073 0.741707 +vn -0.436966 -0.877587 0.197233 +v -1.21385 1.09691 0.738672 +vn -0.474493 -0.857688 0.198059 +v -1.16176 1.16351 1.0414 +vn -0.455157 -0.825828 0.332926 +v -1.17042 1.19295 1.09741 +vn -0.486763 -0.793597 0.365056 +v -1.17522 1.1693 1.03645 +vn -0.480105 -0.812169 0.331482 +v -1.15809 1.22038 1.16889 +vn -0.494534 -0.769909 0.403331 +v -1.16999 1.25824 1.22218 +vn -0.521885 -0.732662 0.436856 +v -1.1717 1.22578 1.16208 +vn -0.508326 -0.761688 0.401792 +v -1.18914 1.17572 1.03155 +vn -0.499875 -0.79998 0.331899 +v -1.19908 1.20847 1.09084 +vn -0.518041 -0.773843 0.36442 +v -1.20506 1.18331 1.02519 +vn -0.513827 -0.791668 0.330521 +v -1.18742 1.22872 1.14759 +vn -0.515537 -0.760273 0.39523 +v -1.20131 1.2693 1.20235 +vn -0.537389 -0.723718 0.432951 +v -1.20111 1.23899 1.14904 +vn -0.527219 -0.748505 0.40222 +v -1.14448 1.1851 1.11346 +vn -0.455045 -0.810011 0.369888 +v -1.14758 1.15836 1.04711 +vn -0.42838 -0.839508 0.33424 +v -1.13189 1.15309 1.05357 +vn -0.411835 -0.848455 0.33244 +v -1.1092 1.17311 1.1289 +vn -0.435417 -0.824214 0.362055 +v -1.11249 1.14695 1.06136 +vn -0.403722 -0.853447 0.329601 +v -1.08962 1.13974 1.0706 +vn -0.408454 -0.854663 0.320492 +v -1.1401 1.2358 1.21871 +vn -0.492603 -0.75913 0.425516 +v -1.14367 1.21412 1.1742 +vn -0.479793 -0.781055 0.39969 +v -1.12782 1.20767 1.18037 +vn -0.464321 -0.792225 0.395962 +v -1.11435 1.23964 1.25404 +vn -0.488362 -0.754619 0.438239 +v -1.10892 1.20223 1.191 +vn -0.455058 -0.795498 0.400131 +v -1.08396 1.19839 1.21195 +vn -0.460705 -0.792693 0.399235 +v -1.14355 1.10902 0.908711 +vn -0.357907 -0.896756 0.26025 +v -1.13114 1.08594 0.838253 +vn -0.322429 -0.920726 0.219778 +v -1.12414 1.10357 0.915457 +vn -0.3426 -0.903494 0.257532 +v -1.15833 1.07596 0.753043 +vn -0.310981 -0.930946 0.191392 +v -1.1389 1.07104 0.758725 +vn -0.289231 -0.938299 0.189581 +v -1.10124 1.09727 0.923531 +vn -0.344976 -0.9051 0.248566 +v -1.07913 1.07217 0.855355 +vn -0.33123 -0.92115 0.204375 +v -1.07237 1.08884 0.933907 +vn -0.363516 -0.900219 0.239711 +v -1.11593 1.0655 0.765587 +vn -0.284909 -0.940927 0.182982 +v -1.08692 1.05835 0.77453 +vn -0.296011 -0.938709 0.176643 +v -1.07142 2.92117 0.834073 +vn -0.503187 0.85756 0.106737 +v -1.07426 2.92719 0.757194 +vn -0.503624 0.861471 0.0650409 +v -1.08147 2.91569 0.831437 +vn -0.490614 0.864906 0.106 +v -1.07705 2.92944 0.678863 +vn -0.504704 0.863018 0.0217726 +v -1.08048 2.92758 0.606254 +vn -0.501693 0.864855 -0.0181932 +v -1.08704 2.92374 0.677112 +vn -0.48995 0.871491 0.0212567 +v -1.0907 2.91092 0.828471 +vn -0.477634 0.87221 0.105432 +v -1.09343 2.91673 0.752075 +vn -0.478233 0.876025 0.0622412 +v -1.1 2.90632 0.825135 +vn -0.468506 0.877314 0.104026 +v -1.09615 2.9188 0.674673 +vn -0.47342 0.880617 0.01968 +v -1.09817 2.9175 0.596709 +vn -0.469765 0.88242 -0.0256212 +v -1.10532 2.91404 0.671853 +vn -0.459905 0.887792 0.0177033 +v -1.06892 2.91147 0.909139 +vn -0.501497 0.852077 0.149884 +v -1.06017 2.92753 0.8368 +vn -0.513191 0.851481 0.107775 +v -1.0433 2.92565 0.916462 +vn -0.517333 0.842173 0.152023 +v -1.03032 2.94482 0.845006 +vn -0.522115 0.845492 0.111982 +v -1.04625 2.93557 0.84028 +vn -0.520721 0.846657 0.109645 +v -1.06619 2.93584 0.681298 +vn -0.511858 0.858816 0.0209056 +v -1.04937 2.94182 0.762138 +vn -0.520695 0.851122 0.0668436 +v -1.039 2.95273 0.674276 +vn -0.527397 0.849455 0.0166879 +v -1.05617 2.94161 0.691815 +vn -0.519322 0.853911 0.0337646 +v -1.0678 2.89753 0.981313 +vn -0.500705 0.843391 0.194898 +v -1.0678 2.87868 1.05382 +vn -0.502664 0.828982 0.245187 +v -1.05613 2.90366 0.985145 +vn -0.509762 0.837774 0.195646 +v -1.07485 2.85202 1.12153 +vn -0.505923 0.807626 0.302957 +v -1.07577 2.82869 1.17813 +vn -0.513663 0.785214 0.345816 +v -1.05872 2.86299 1.11913 +vn -0.512588 0.808651 0.288681 +v -1.04149 2.91163 0.989574 +vn -0.516987 0.83322 0.196136 +v -1.03838 2.89495 1.06037 +vn -0.516591 0.821435 0.241614 +v -1.02471 2.9207 0.995448 +vn -0.518436 0.83195 0.197697 +v -1.04369 2.8708 1.12412 +vn -0.519127 0.804301 0.289149 +v -1.0452 2.8447 1.1879 +vn -0.525278 0.780461 0.339063 +v -1.02487 2.88084 1.13034 +vn -0.525631 0.800708 0.287367 +v -1.07817 2.89229 0.977719 +vn -0.491182 0.849144 0.194153 +v -1.08855 2.90136 0.902716 +vn -0.482304 0.863316 0.148552 +v -1.09715 2.88334 0.969949 +vn -0.477566 0.857072 0.193282 +v -1.08764 2.88771 0.97402 +vn -0.482613 0.853997 0.194354 +v -1.08236 2.8513 1.11079 +vn -0.493563 0.818926 0.29284 +v -1.08858 2.86993 1.04163 +vn -0.489071 0.838348 0.240794 +v -1.10169 2.84366 1.09974 +vn -0.492279 0.820005 0.291983 +v -1.09191 2.84753 1.1052 +vn -0.492991 0.818688 0.294466 +v -1.00882 2.52208 -1.09251 +vn -0.708941 0.686101 -0.163304 +v -1.0106 2.50314 -1.16295 +vn -0.675844 0.711791 -0.191281 +v -1.02062 2.51219 -1.08708 +vn -0.651719 0.739897 -0.166777 +v -0.990982 2.50052 -1.23881 +vn -0.744572 0.630026 -0.220635 +v -0.995496 2.47354 -1.29642 +vn -0.716082 0.639 -0.280902 +v -1.00261 2.4901 -1.23267 +vn -0.689493 0.685913 -0.232642 +v -1.03256 2.50353 -1.08199 +vn -0.594876 0.786217 -0.167286 +v -1.03601 2.48552 -1.15174 +vn -0.586523 0.785234 -0.198491 +v -1.04585 2.4954 -1.07658 +vn -0.553237 0.814932 -0.17267 +v -1.0145 2.48093 -1.22696 +vn -0.633747 0.735407 -0.239876 +v -1.02788 2.47226 -1.22088 +vn -0.592897 0.766102 -0.248116 +v -0.986058 2.52685 -1.17568 +vn -0.766378 0.617139 -0.178336 +v -0.99598 2.535 -1.09898 +vn -0.752582 0.639717 -0.156148 +v -0.98156 2.55093 -1.10673 +vn -0.780524 0.606648 -0.150867 +v -0.954371 2.5652 -1.19487 +vn -0.810332 0.563839 -0.159523 +v -0.963796 2.57215 -1.11702 +vn -0.795183 0.589954 -0.140135 +v -0.943008 2.59783 -1.12936 +vn -0.803839 0.580354 -0.130506 +v -0.971405 2.49849 -1.31148 +vn -0.801444 0.546873 -0.242109 +v -0.97848 2.51408 -1.24617 +vn -0.787181 0.58149 -0.205463 +v -0.964543 2.53078 -1.25503 +vn -0.813299 0.548098 -0.19528 +v -0.941909 2.53466 -1.33793 +vn -0.83911 0.498439 -0.217836 +v -0.947424 2.55288 -1.26735 +vn -0.828592 0.529508 -0.181814 +v -0.924152 2.58195 -1.29179 +vn -0.838388 0.516773 -0.173351 +v -1.00398 2.56111 -0.940179 +vn -0.737454 0.661345 -0.137056 +v -0.995929 2.58597 -0.862232 +vn -0.727099 0.673448 -0.133393 +v -0.985343 2.58077 -0.949454 +vn -0.752736 0.646118 -0.126176 +v -1.02594 2.57489 -0.766037 +vn -0.691385 0.704365 -0.160801 +v -1.01638 2.60248 -0.690639 +vn -0.684044 0.707191 -0.178786 +v -1.00647 2.59289 -0.774097 +vn -0.707579 0.690609 -0.149637 +v -0.963477 2.60457 -0.960548 +vn -0.761634 0.637621 -0.115557 +v -0.951384 2.63069 -0.88974 +vn -0.741089 0.662528 -0.108829 +v -0.938668 2.63229 -0.973125 +vn -0.763585 0.637692 -0.101428 +v -0.983565 2.61464 -0.783827 +vn -0.7166 0.683454 -0.139194 +v -0.969399 2.64538 -0.70712 +vn -0.697799 0.699085 -0.156064 +v -0.957495 2.63989 -0.795702 +vn -0.719158 0.683428 -0.125446 +v -1.03041 2.55308 -0.846757 +vn -0.679294 0.718362 -0.15005 +v -1.01896 2.54643 -0.933241 +vn -0.708858 0.690959 -0.14176 +v -1.03219 2.53457 -0.927427 +vn -0.66321 0.733684 -0.147852 +v -1.05591 2.53334 -0.836535 +vn -0.581588 0.798012 -0.1579 +v -1.04409 2.52567 -0.922567 +vn -0.604239 0.782603 -0.149758 +v -1.05601 2.51797 -0.917981 +vn -0.544374 0.825353 -0.149832 +v -1.05007 2.57546 -0.672985 +vn -0.6344 0.747205 -0.198047 +v -1.0413 2.56182 -0.759528 +vn -0.662265 0.730426 -0.166982 +v -1.05473 2.55135 -0.754031 +vn -0.614896 0.768771 -0.175767 +v -1.07564 2.5583 -0.663412 +vn -0.535107 0.817234 -0.213986 +v -1.06669 2.54355 -0.749676 +vn -0.554893 0.812056 -0.180718 +v -1.07854 2.53693 -0.745562 +vn -0.492702 0.850457 -0.184306 +v -1.07813 2.63754 -0.417194 +vn -0.533176 0.789853 -0.303078 +v -1.08841 2.59984 -0.502054 +vn -0.491733 0.822908 -0.284641 +v -1.09262 2.62572 -0.42425 +vn -0.471041 0.826233 -0.308965 +v -1.07046 2.58501 -0.582454 +vn -0.574114 0.782066 -0.242416 +v -1.08237 2.5781 -0.578881 +vn -0.513624 0.820047 -0.252416 +v -1.10157 2.6257 -0.411963 +vn -0.419553 0.846365 -0.328087 +v -1.1109 2.59288 -0.489193 +vn -0.404338 0.863096 -0.302616 +v -1.1137 2.62139 -0.408779 +vn -0.38067 0.862598 -0.333189 +v -1.09405 2.57232 -0.575546 +vn -0.452316 0.852907 -0.260691 +v -1.10653 2.5675 -0.571692 +vn -0.407657 0.872098 -0.270669 +v -1.06409 2.61654 -0.502889 +vn -0.592351 0.760851 -0.265003 +v -1.06483 2.64619 -0.419845 +vn -0.586294 0.757233 -0.287851 +v -1.04854 2.65726 -0.426043 +vn -0.618479 0.736434 -0.274131 +v -1.02694 2.64307 -0.519241 +vn -0.64682 0.723859 -0.240109 +v -1.0292 2.67105 -0.433683 +vn -0.633348 0.72735 -0.264258 +v -1.00549 2.69007 -0.439131 +vn -0.640645 0.722936 -0.258722 +v -1.05675 2.59446 -0.587409 +vn -0.621524 0.748723 -0.230482 +v -1.0414 2.60569 -0.594023 +vn -0.65256 0.724437 -0.222165 +v -1.02662 2.6147 -0.610151 +vn -0.671248 0.711712 -0.207103 +v -0.99921 2.64179 -0.607042 +vn -0.674594 0.709182 -0.2049 +v -1.04808 2.71769 -0.272823 +vn -0.588319 0.750018 -0.302248 +v -1.03342 2.76146 -0.19331 +vn -0.586724 0.752224 -0.299857 +v -1.03136 2.73145 -0.272101 +vn -0.606207 0.739039 -0.293827 +v -1.04891 2.78186 -0.112201 +vn -0.56101 0.770482 -0.302698 +v -1.03564 2.82122 -0.034909 +vn -0.564651 0.775062 -0.283633 +v -1.03301 2.79349 -0.112867 +vn -0.580241 0.759442 -0.294223 +v -1.00714 2.74893 -0.278988 +vn -0.614165 0.735628 -0.285749 +v -0.983922 2.79832 -0.201045 +vn -0.602739 0.745093 -0.285557 +v -0.973941 2.77618 -0.280302 +vn -0.615582 0.737281 -0.278344 +v -1.00961 2.80918 -0.119439 +vn -0.590466 0.754142 -0.287435 +v -0.980103 2.83016 -0.12549 +vn -0.594804 0.753095 -0.281169 +v -1.06612 2.67846 -0.335644 +vn -0.562088 0.768446 -0.305856 +v -1.08102 2.69742 -0.263876 +vn -0.51451 0.792667 -0.327044 +v -1.06625 2.70075 -0.280302 +vn -0.555045 0.770313 -0.313916 +v -1.09434 2.66027 -0.334778 +vn -0.460709 0.822457 -0.333636 +v -1.10099 2.69336 -0.246607 +vn -0.406018 0.842709 -0.353539 +v -1.09119 2.6948 -0.25505 +vn -0.45979 0.819889 -0.341138 +v -1.06549 2.75319 -0.154358 +vn -0.540002 0.781433 -0.312666 +v -1.08023 2.76368 -0.104265 +vn -0.492555 0.807702 -0.324048 +v -1.06575 2.7844 -0.075763 +vn -0.529885 0.789658 -0.309294 +v -1.08924 2.72777 -0.179347 +vn -0.460114 0.820716 -0.338703 +v -1.10289 2.74994 -0.108419 +vn -0.397635 0.850552 -0.344163 +v -1.093 2.76244 -0.089356 +vn -0.436767 0.836409 -0.331141 +v -1.07383 2.8804 0.236408 +vn -0.503044 0.838796 -0.208248 +v -1.07088 2.86132 0.158394 +vn -0.50614 0.830108 -0.233973 +v -1.08546 2.86578 0.206101 +vn -0.475657 0.849991 -0.226419 +v -1.06858 2.83878 0.080454 +vn -0.514699 0.814751 -0.266956 +v -1.06669 2.81316 0.002312 +vn -0.521506 0.804262 -0.284946 +v -1.08163 2.82102 0.051379 +vn -0.481312 0.828999 -0.284779 +v -1.09733 2.86304 0.21989 +vn -0.436796 0.872949 -0.217186 +v -1.09224 2.84357 0.139636 +vn -0.447569 0.857233 -0.254624 +v -1.10466 2.85713 0.210488 +vn -0.406847 0.884329 -0.228992 +v -1.09416 2.81902 0.065594 +vn -0.434656 0.855472 -0.281498 +v -1.0882 2.79234 -0.018959 +vn -0.453563 0.835798 -0.309391 +v -1.10323 2.80842 0.047038 +vn -0.399795 0.866019 -0.300294 +v -1.05795 2.88168 0.20322 +vn -0.52606 0.822297 -0.216998 +v -1.04137 2.87025 0.123426 +vn -0.546189 0.802373 -0.240572 +v -1.04433 2.89107 0.205248 +vn -0.541637 0.813886 -0.210283 +v -1.02382 2.90397 0.201272 +vn -0.552449 0.807276 -0.207619 +v -1.05197 2.83785 0.045104 +vn -0.541469 0.796226 -0.26988 +v -1.0371 2.84829 0.045473 +vn -0.558545 0.78674 -0.262806 +v -1.01495 2.86256 0.040115 +vn -0.569545 0.780559 -0.257577 +v -1.08089 2.90543 0.37727 +vn -0.493009 0.859358 -0.135819 +v -1.07831 2.91744 0.449499 +vn -0.503189 0.857828 -0.104554 +v -1.06729 2.91072 0.360616 +vn -0.510307 0.846525 -0.1516 +v -1.0824 2.92294 0.531798 +vn -0.502152 0.862931 -0.0565184 +v -1.06851 2.93069 0.524565 +vn -0.520907 0.85126 -0.0633417 +v -1.03011 2.93323 0.354356 +vn -0.542712 0.826764 -0.14807 +v -1.01893 2.95334 0.438779 +vn -0.540301 0.834823 -0.105569 +v -1.01097 2.94649 0.35864 +vn -0.544538 0.826914 -0.140327 +v -1.05504 2.93917 0.525806 +vn -0.527914 0.847377 -0.0570994 +v -1.05556 2.94261 0.606632 +vn -0.524232 0.851376 -0.0184224 +v -1.03783 2.94977 0.52411 +vn -0.529868 0.845936 -0.0602662 +v -1.07869 2.8951 0.313743 +vn -0.498259 0.85018 -0.170095 +v -1.08855 2.89965 0.3686 +vn -0.476095 0.867173 -0.146099 +v -1.09635 2.88006 0.28928 +vn -0.450626 0.872414 -0.189288 +v -1.10735 2.88889 0.362807 +vn -0.431716 0.888797 -0.153824 +v -1.09785 2.89413 0.365572 +vn -0.457736 0.876507 -0.149041 +v -1.08967 2.91803 0.521095 +vn -0.477208 0.876096 -0.0687663 +v -1.09868 2.90507 0.441369 +vn -0.461428 0.880144 -0.111489 +v -1.10823 2.90795 0.516629 +vn -0.446503 0.892025 -0.0701923 +v -1.09882 2.91292 0.518659 +vn -0.464424 0.882985 -0.0681693 +v -1.19158 1.41214 1.40206 +vn -0.591462 -0.588159 0.551581 +v -1.19709 1.37962 1.36002 +vn -0.577498 -0.615351 0.536506 +v -1.18115 1.36344 1.35817 +vn -0.56933 -0.634051 0.523299 +v -1.2193 1.42307 1.38382 +vn -0.595045 -0.578945 0.557444 +v -1.22401 1.39054 1.34343 +vn -0.578522 -0.609759 0.541762 +v -1.20879 1.3753 1.34228 +vn -0.573047 -0.626914 0.527822 +v -1.16219 1.31847 1.32138 +vn -0.544796 -0.674756 0.497897 +v -1.17118 1.2944 1.27758 +vn -0.532694 -0.698028 0.478533 +v -1.15138 1.27258 1.26684 +vn -0.516077 -0.72154 0.461567 +v -1.19101 1.335 1.31168 +vn -0.557571 -0.660913 0.502304 +v -1.19605 1.30209 1.26008 +vn -0.548304 -0.692486 0.468855 +v -1.18219 1.2964 1.26787 +vn -0.543846 -0.696957 0.467422 +v -1.21057 1.46077 1.43051 +vn -0.613029 -0.54232 0.574529 +v -1.22734 1.51016 1.45655 +vn -0.629208 -0.497041 0.597535 +v -1.22477 1.46626 1.42054 +vn -0.61418 -0.538454 0.576932 +v -1.24376 1.56121 1.47908 +vn -0.644623 -0.448621 0.619032 +v -1.25979 1.60954 1.49519 +vn -0.659111 -0.400798 0.636344 +v -1.25767 1.566 1.46802 +vn -0.648933 -0.444609 0.617421 +v -1.23788 1.47135 1.41132 +vn -0.615534 -0.534698 0.578979 +v -1.25356 1.52336 1.43968 +vn -0.633957 -0.486234 0.601394 +v -1.25474 1.48238 1.40351 +vn -0.618409 -0.521274 0.588084 +v -1.27026 1.57053 1.45795 +vn -0.653537 -0.439591 0.616157 +v -1.28404 1.62514 1.47949 +vn -0.669522 -0.386021 0.634608 +v -1.28602 1.58133 1.44879 +vn -0.658821 -0.424825 0.620869 +v -1.19494 1.45422 1.441 +vn -0.608498 -0.547575 0.574363 +v -1.15612 1.39526 1.42185 +vn -0.584175 -0.600793 0.545699 +v -1.15232 1.43868 1.47091 +vn -0.602161 -0.559316 0.569709 +v -1.17877 1.44283 1.44709 +vn -0.601853 -0.558557 0.570778 +v -1.22827 1.55525 1.49087 +vn -0.640258 -0.451694 0.621323 +v -1.19139 1.49095 1.47802 +vn -0.620386 -0.511452 0.59459 +v -1.18527 1.54055 1.52411 +vn -0.635444 -0.461273 0.619223 +v -1.21209 1.54355 1.49886 +vn -0.634593 -0.46372 0.618268 +v -1.16285 1.36097 1.37493 +vn -0.56888 -0.634026 0.52382 +v -1.13734 1.28142 1.29569 +vn -0.523751 -0.708858 0.472446 +v -1.12034 1.27259 1.30095 +vn -0.514021 -0.719725 0.466668 +v -1.14391 1.35416 1.38728 +vn -0.565428 -0.640108 0.520147 +v -1.12786 1.31048 1.34788 +vn -0.539238 -0.681049 0.495373 +v -1.11978 1.3451 1.40219 +vn -0.560164 -0.647657 0.516485 +v -1.09648 1.26352 1.31301 +vn -0.50824 -0.727556 0.46082 +v -1.068 1.25301 1.3278 +vn -0.503153 -0.735718 0.453383 +v -1.29978 1.82844 1.54916 +vn -0.693406 -0.169887 0.700233 +v -1.30871 1.78464 1.52778 +vn -0.699934 -0.214194 0.681332 +v -1.29566 1.76814 1.53558 +vn -0.689383 -0.238282 0.684085 +v -1.32429 1.83386 1.5253 +vn -0.721404 -0.163725 0.672882 +v -1.32871 1.7825 1.50546 +vn -0.724862 -0.218926 0.653182 +v -1.31776 1.78089 1.51699 +vn -0.714144 -0.22467 0.662964 +v -1.28479 1.71584 1.52611 +vn -0.681548 -0.291666 0.671136 +v -1.28571 1.67017 1.50336 +vn -0.678709 -0.34001 0.650959 +v -1.27193 1.66562 1.5151 +vn -0.668685 -0.3444 0.658976 +v -1.30937 1.7334 1.50805 +vn -0.701845 -0.273625 0.65768 +v -1.3126 1.68431 1.48188 +vn -0.696116 -0.31943 0.642951 +v -1.29787 1.67418 1.49256 +vn -0.688335 -0.334496 0.643667 +v -1.30492 1.8835 1.55513 +vn -0.696146 -0.109516 0.709498 +v -1.30699 1.93868 1.55911 +vn -0.697129 -0.0483377 0.715314 +v -1.31753 1.88583 1.54281 +vn -0.710709 -0.107589 0.695211 +v -1.30807 1.99242 1.55957 +vn -0.695041 0.00990358 0.718902 +v -1.30581 2.03998 1.55897 +vn -0.691109 0.0683997 0.719507 +v -1.32024 1.99475 1.54741 +vn -0.712286 0.0136851 0.701756 +v -1.32883 1.888 1.53139 +vn -0.72721 -0.105579 0.678247 +v -1.33104 1.94251 1.53498 +vn -0.72785 -0.0452049 0.684245 +v -1.33951 1.89007 1.51991 +vn -0.741153 -0.103024 0.663384 +v -1.33106 1.99725 1.53618 +vn -0.727775 0.0175099 0.685592 +v -1.32751 2.05365 1.53588 +vn -0.719747 0.0794026 0.689681 +v -1.34139 1.99892 1.52486 +vn -0.741098 0.0178797 0.671159 +v -1.28901 1.88075 1.56994 +vn -0.684027 -0.110606 0.721023 +v -1.26439 1.82115 1.58138 +vn -0.676428 -0.173936 0.715676 +v -1.24529 1.87429 1.60958 +vn -0.672219 -0.111453 0.731915 +v -1.26996 1.87756 1.58736 +vn -0.677064 -0.111885 0.72737 +v -1.29256 1.99178 1.57412 +vn -0.680086 0.0124365 0.733027 +v -1.27193 1.93436 1.59173 +vn -0.677296 -0.0492712 0.734059 +v -1.24971 1.99 1.61323 +vn -0.670589 0.0141987 0.741693 +v -1.27385 1.99117 1.59134 +vn -0.674109 0.0144667 0.73849 +v -1.27732 1.76947 1.5541 +vn -0.679379 -0.232101 0.696113 +v -1.25276 1.65311 1.52784 +vn -0.662805 -0.356927 0.65825 +v -1.25816 1.7651 1.57118 +vn -0.672628 -0.235181 0.701614 +v -1.24978 1.7072 1.55706 +vn -0.667861 -0.295307 0.683195 +v -1.23351 1.7599 1.59284 +vn -0.66845 -0.235424 0.705514 +v -1.23752 1.65451 1.54381 +vn -0.659809 -0.349822 0.665038 +v -1.22512 1.59901 1.52396 +vn -0.649154 -0.407647 0.642201 +v -1.2133 1.64836 1.56444 +vn -0.656556 -0.352921 0.666619 +v -1.2959 2.15878 1.54624 +vn -0.674601 0.196113 0.711656 +v -1.28495 2.21518 1.53872 +vn -0.665657 0.24865 0.703615 +v -1.29489 2.21906 1.52779 +vn -0.679011 0.259031 0.686911 +v -1.29769 2.26548 1.50607 +vn -0.677263 0.298991 0.67225 +v -1.31861 2.21998 1.50344 +vn -0.693754 0.258474 0.672233 +v -1.31117 2.19713 1.51949 +vn -0.692932 0.232182 0.682595 +v -1.31482 2.10927 1.53995 +vn -0.687739 0.145379 0.711253 +v -1.30589 2.09177 1.55186 +vn -0.68646 0.121165 0.717002 +v -1.32011 2.14455 1.52645 +vn -0.706127 0.180637 0.684657 +v -1.33432 2.10639 1.52024 +vn -0.730976 0.134811 0.668954 +v -1.32459 2.10463 1.53107 +vn -0.713563 0.128838 0.688643 +v -1.27294 2.32257 1.50296 +vn -0.654678 0.349103 0.670466 +v -1.27061 2.37023 1.4785 +vn -0.652229 0.389868 0.650078 +v -1.28383 2.32077 1.49317 +vn -0.664009 0.346268 0.662714 +v -1.24129 2.42923 1.4697 +vn -0.631148 0.437773 0.640318 +v -1.23391 2.47858 1.44119 +vn -0.625995 0.476357 0.617426 +v -1.25218 2.42639 1.46078 +vn -0.638644 0.436424 0.633773 +v -1.29386 2.32059 1.48302 +vn -0.672544 0.347008 0.653659 +v -1.28931 2.37206 1.4581 +vn -0.673661 0.392435 0.626239 +v -1.30402 2.32104 1.47227 +vn -0.682024 0.34631 0.644138 +v -1.26584 2.41776 1.45284 +vn -0.647391 0.425991 0.631995 +v -1.27288 2.4228 1.44204 +vn -0.654608 0.435358 0.618023 +v -1.24781 2.37842 1.49594 +vn -0.637508 0.396499 0.660585 +v -1.26071 2.32491 1.51358 +vn -0.646269 0.351651 0.677258 +v -1.24534 2.32771 1.52659 +vn -0.639812 0.353056 0.682636 +v -1.21305 2.38905 1.52257 +vn -0.628741 0.401455 0.665972 +v -1.22692 2.3312 1.542 +vn -0.636986 0.354706 0.684421 +v -1.20315 2.33501 1.56205 +vn -0.635514 0.354338 0.685979 +v -1.21059 2.48505 1.4594 +vn -0.615699 0.478946 0.62572 +v -1.22865 2.43226 1.47994 +vn -0.625731 0.43918 0.644656 +v -1.21421 2.43647 1.49104 +vn -0.621299 0.439554 0.648675 +v -1.17672 2.50148 1.47976 +vn -0.608805 0.487426 0.625917 +v -1.19866 2.44697 1.49869 +vn -0.617471 0.448904 0.645922 +v -1.173 2.44718 1.52303 +vn -0.618608 0.444371 0.647965 +v -1.26941 2.21642 1.55275 +vn -0.657621 0.251828 0.710013 +v -1.25898 2.16141 1.57963 +vn -0.660662 0.197835 0.724146 +v -1.25054 2.21857 1.56938 +vn -0.652931 0.253407 0.713769 +v -1.28631 2.10206 1.56829 +vn -0.674412 0.138317 0.725284 +v -1.2734 2.04742 1.58821 +vn -0.672413 0.0784339 0.736009 +v -1.26726 2.10457 1.58534 +vn -0.666755 0.140384 0.731935 +v -1.22637 2.22046 1.59064 +vn -0.649761 0.252774 0.716879 +v -1.21066 2.15933 1.62376 +vn -0.655133 0.193417 0.730336 +v -1.19417 2.21619 1.62128 +vn -0.6486 0.246338 0.720164 +v -1.24328 2.10464 1.60694 +vn -0.662516 0.139659 0.735913 +v -1.23046 2.04687 1.62702 +vn -0.666922 0.0779191 0.741042 +v -1.21164 2.09745 1.63667 +vn -0.660051 0.132675 0.739412 +v -1.17204 2.58656 1.41087 +vn -0.591179 0.557994 0.582366 +v -1.15253 2.63447 1.38222 +vn -0.576913 0.599025 0.555285 +v -1.1647 2.62983 1.37461 +vn -0.579269 0.595626 0.556486 +v -1.19504 2.57889 1.39475 +vn -0.59864 0.554207 0.578347 +v -1.17521 2.6265 1.36715 +vn -0.583465 0.594758 0.553021 +v -1.18549 2.62342 1.35959 +vn -0.587381 0.594463 0.549178 +v -1.19172 2.53638 1.4365 +vn -0.60367 0.518802 0.605332 +v -1.20416 2.53239 1.42751 +vn -0.607037 0.516285 0.604116 +v -1.21482 2.5294 1.41926 +vn -0.611817 0.514921 0.600446 +v -1.22515 2.52671 1.411 +vn -0.618199 0.513522 0.595084 +v -1.1279 2.71702 1.30847 +vn -0.54996 0.67384 0.493441 +v -1.12241 2.74439 1.27492 +vn -0.539256 0.705507 0.459851 +v -1.13808 2.71352 1.30171 +vn -0.557367 0.67423 0.484515 +v -1.09574 2.79728 1.21614 +vn -0.526448 0.759675 0.381767 +v -1.09661 2.82012 1.16698 +vn -0.507739 0.788712 0.346605 +v -1.11196 2.77895 1.22974 +vn -0.525415 0.744896 0.411181 +v -1.15148 2.70513 1.29801 +vn -0.559421 0.667254 0.491752 +v -1.13964 2.74683 1.25006 +vn -0.549368 0.713773 0.434423 +v -1.15827 2.70768 1.28669 +vn -0.559607 0.676083 0.479323 +v -1.11838 2.78835 1.20361 +vn -0.507395 0.767479 0.391824 +v -1.09892 2.76454 1.27045 +vn -0.532702 0.722732 0.440327 +v -1.11598 2.72259 1.31392 +vn -0.544435 0.681273 0.489343 +v -1.10255 2.7294 1.31946 +vn -0.545763 0.683972 0.484072 +v -1.06794 2.77993 1.28294 +vn -0.538905 0.722215 0.433575 +v -1.08837 2.73977 1.32082 +vn -0.547551 0.689704 0.473811 +v -1.06517 2.74554 1.33928 +vn -0.552691 0.684357 0.475593 +v -1.0871 2.79875 1.22464 +vn -0.522265 0.754515 0.397424 +v -1.07387 2.80466 1.23085 +vn -0.525752 0.755181 0.391518 +v -1.05838 2.81175 1.23812 +vn -0.529697 0.754862 0.386787 +v -1.04201 2.817 1.25043 +vn -0.53267 0.749201 0.393649 +v -1.13874 2.64031 1.39025 +vn -0.574403 0.601436 0.555279 +v -1.13887 2.6041 1.42747 +vn -0.586889 0.567174 0.577819 +v -1.12379 2.65112 1.39392 +vn -0.572949 0.609822 0.547583 +v -1.17756 2.54156 1.44614 +vn -0.600043 0.520684 0.607319 +v -1.16216 2.55241 1.45196 +vn -0.597066 0.52934 0.602753 +v -1.10006 2.65513 1.41436 +vn -0.577353 0.605421 0.547841 +v -1.09095 2.6156 1.46504 +vn -0.588012 0.566826 0.577019 +v -1.07371 2.6648 1.43161 +vn -0.578588 0.606254 0.545612 +v -1.13745 2.55489 1.47427 +vn -0.599493 0.52552 0.603686 +v -1.12675 2.51002 1.52171 +vn -0.607765 0.486195 0.627882 +v -1.11006 2.56346 1.49412 +vn -0.599659 0.526584 0.602593 +v -0.98458 2.36111 -1.48979 +vn -0.809079 0.435862 -0.394227 +v -0.994335 2.38162 -1.44648 +vn -0.762294 0.496744 -0.414914 +v -0.982106 2.40185 -1.44608 +vn -0.80311 0.471229 -0.364634 +v -1.00863 2.33935 -1.46965 +vn -0.729627 0.48624 -0.480848 +v -1.01732 2.36446 -1.43138 +vn -0.65443 0.558589 -0.509608 +v -1.00544 2.38071 -1.4291 +vn -0.697214 0.551182 -0.458357 +v -0.972773 2.46983 -1.36472 +vn -0.807022 0.519305 -0.281138 +v -0.984616 2.45701 -1.35658 +vn -0.768716 0.560636 -0.307836 +v -0.99592 2.44644 -1.3496 +vn -0.710436 0.615417 -0.341384 +v -1.00764 2.43775 -1.34325 +vn -0.654158 0.660792 -0.368009 +v -0.995544 2.31402 -1.51626 +vn -0.805476 0.40737 -0.430416 +v -1.00486 2.26586 -1.54207 +vn -0.800516 0.378864 -0.464366 +v -1.00792 2.30285 -1.50473 +vn -0.765927 0.431015 -0.477055 +v -1.01523 2.22072 -1.55955 +vn -0.799321 0.352277 -0.486813 +v -1.02928 2.24404 -1.5214 +vn -0.729879 0.401067 -0.553553 +v -1.01806 2.29526 -1.49657 +vn -0.732344 0.439775 -0.519875 +v -1.03322 2.31961 -1.45717 +vn -0.648079 0.506936 -0.568339 +v -1.04972 2.16168 -1.54955 +vn -0.709256 0.352658 -0.610401 +v -0.98186 2.32821 -1.52958 +vn -0.827405 0.396953 -0.397278 +v -0.954288 2.39861 -1.51713 +vn -0.846291 0.404025 -0.34721 +v -0.944489 2.36999 -1.57124 +vn -0.850393 0.371922 -0.372163 +v -0.96834 2.34776 -1.53942 +vn -0.842132 0.383781 -0.378848 +v -0.994704 2.20496 -1.60682 +vn -0.82926 0.313488 -0.462658 +v -0.974046 2.30362 -1.56944 +vn -0.837549 0.362747 -0.408567 +v -0.963407 2.26948 -1.61934 +vn -0.842358 0.327902 -0.427685 +v -0.985588 2.25518 -1.58676 +vn -0.836558 0.336482 -0.432377 +v -0.972169 2.44357 -1.4112 +vn -0.812575 0.489869 -0.315832 +v -0.965852 2.41652 -1.46565 +vn -0.834681 0.439009 -0.332533 +v -0.958882 2.48691 -1.37582 +vn -0.833489 0.486859 -0.261275 +v -0.94274 2.50816 -1.38934 +vn -0.846308 0.470157 -0.250429 +v -0.949444 2.43671 -1.48178 +vn -0.849262 0.42341 -0.315402 +v -0.942362 2.47879 -1.44126 +vn -0.848273 0.446769 -0.284306 +v -0.928636 2.46341 -1.50319 +vn -0.855659 0.414908 -0.309352 +v -0.922125 2.53707 -1.4062 +vn -0.852191 0.464389 -0.241067 +v -0.903011 2.5932 -1.35805 +vn -0.846264 0.49556 -0.195596 +v -0.894317 2.58019 -1.42223 +vn -0.85439 0.466247 -0.229415 +v -1.05882 2.00271 -1.61178 +vn -0.752483 0.185909 -0.631829 +v -1.06853 2.0765 -1.57237 +vn -0.699053 0.284532 -0.656023 +v -1.04345 2.08727 -1.59795 +vn -0.773617 0.269184 -0.573635 +v -1.08704 1.98737 -1.5855 +vn -0.686744 0.183273 -0.703415 +v -1.02601 2.17107 -1.57605 +vn -0.789408 0.323856 -0.52149 +v -1.06924 1.92033 -1.61701 +vn -0.729808 0.0746588 -0.679563 +v -1.095 1.89894 -1.59333 +vn -0.68276 0.0485075 -0.729031 +v -1.12101 1.84591 -1.57098 +vn -0.668575 -0.0277789 -0.743125 +v -1.03666 1.93226 -1.65306 +vn -0.764465 0.0606598 -0.641805 +v -1.02497 2.02124 -1.6505 +vn -0.795604 0.16703 -0.582336 +v -0.992098 1.95673 -1.70611 +vn -0.785231 0.0514098 -0.617065 +v -0.997963 1.8647 -1.69802 +vn -0.751809 -0.0651407 -0.656155 +v -1.00994 2.11352 -1.63561 +vn -0.819169 0.256695 -0.512904 +v -0.998278 2.07602 -1.67057 +vn -0.818216 0.206658 -0.536484 +v -0.979251 2.1722 -1.65561 +vn -0.835309 0.273889 -0.4767 +v -1.11396 1.46636 -1.38795 +vn -0.630241 -0.589383 -0.505395 +v -1.09086 1.39835 -1.32997 +vn -0.599267 -0.642156 -0.478032 +v -1.15408 1.45902 -1.3251 +vn -0.667238 -0.578457 -0.469235 +v -1.09501 1.36977 -1.28431 +vn -0.59268 -0.665162 -0.454192 +v -1.1355 1.39927 -1.27266 +vn -0.629193 -0.628139 -0.457774 +v -1.19822 1.45582 -1.25574 +vn -0.704086 -0.549849 -0.449365 +v -1.13399 1.35106 -1.20549 +vn -0.603558 -0.658235 -0.449938 +v -1.18325 1.4037 -1.21067 +vn -0.669871 -0.597903 -0.440209 +v -1.06863 1.43741 -1.40685 +vn -0.582228 -0.619588 -0.526423 +v -1.03388 1.42007 -1.42304 +vn -0.550699 -0.634552 -0.542286 +v -1.04761 1.38076 -1.35773 +vn -0.56102 -0.664473 -0.493692 +v -1.07216 1.35372 -1.28939 +vn -0.567911 -0.683565 -0.458493 +v -1.04516 1.31447 -1.26215 +vn -0.548984 -0.705429 -0.448315 +v -1.05406 1.35498 -1.31342 +vn -0.562894 -0.682238 -0.466584 +v -1.03265 1.34104 -1.31824 +vn -0.544774 -0.695386 -0.468679 +v -1.09007 1.49975 -1.45104 +vn -0.600068 -0.548461 -0.58233 +v -1.13074 1.52357 -1.42904 +vn -0.64886 -0.521419 -0.554169 +v -1.1117 1.56481 -1.48298 +vn -0.62749 -0.448232 -0.636667 +v -1.05593 1.48375 -1.46933 +vn -0.566033 -0.56298 -0.602212 +v -1.17074 1.52105 -1.37347 +vn -0.704347 -0.517592 -0.485791 +v -1.21857 1.51703 -1.29317 +vn -0.754868 -0.483024 -0.443692 +v -1.16264 1.55104 -1.41468 +vn -0.707238 -0.468209 -0.529712 +v -1.20819 1.55081 -1.34605 +vn -0.763355 -0.4476 -0.465771 +v -1.19679 1.58731 -1.39633 +vn -0.763507 -0.401738 -0.505632 +v -0.981074 1.39706 -1.44832 +vn -0.548719 -0.638259 -0.539938 +v -0.9477 1.38144 -1.4645 +vn -0.567335 -0.635713 -0.52345 +v -0.963186 1.33419 -1.38547 +vn -0.534641 -0.685288 -0.494509 +v -0.91912 1.3422 -1.44589 +vn -0.566358 -0.664886 -0.486996 +v -0.949588 1.29589 -1.34403 +vn -0.522136 -0.716291 -0.462926 +v -0.963546 1.30218 -1.3381 +vn -0.520593 -0.714552 -0.467331 +v -0.932459 1.3185 -1.39726 +vn -0.54285 -0.689763 -0.479104 +v -0.913379 1.27974 -1.36022 +vn -0.527374 -0.719647 -0.451647 +v -0.933567 1.28868 -1.35099 +vn -0.524464 -0.71788 -0.457805 +v -0.971654 1.45292 -1.51849 +vn -0.581318 -0.571587 -0.579101 +v -1.00343 1.46341 -1.49798 +vn -0.562102 -0.573066 -0.596352 +v -0.996652 1.52126 -1.55469 +vn -0.604444 -0.496878 -0.622704 +v -0.952429 1.51138 -1.59038 +vn -0.616197 -0.49597 -0.611813 +v -1.00664 1.40727 -1.43501 +vn -0.540548 -0.640782 -0.545167 +v -1.02888 1.4725 -1.48342 +vn -0.552982 -0.570579 -0.607165 +v -0.9882 1.34528 -1.37414 +vn -0.532649 -0.683473 -0.49915 +v -0.975737 1.30773 -1.33302 +vn -0.521116 -0.713311 -0.468643 +v -1.01508 1.35712 -1.36138 +vn -0.54091 -0.680188 -0.494733 +v -0.987447 1.31343 -1.32863 +vn -0.525773 -0.710466 -0.467761 +v -0.989124 1.28335 -1.27934 +vn -0.519291 -0.726496 -0.450045 +v -0.998401 1.32127 -1.32812 +vn -0.535404 -0.701988 -0.469633 +v -1.41912 1.71576 -1.00081 +vn -0.910835 -0.255325 -0.324329 +v -1.45193 1.74813 -0.92985 +vn -0.924262 -0.222973 -0.309876 +v -1.42725 1.75775 -1.00848 +vn -0.920287 -0.207801 -0.331498 +v -1.47395 1.70565 -0.822648 +vn -0.922657 -0.280668 -0.26444 +v -1.5049 1.74132 -0.7476 +vn -0.935569 -0.255329 -0.243961 +v -1.49071 1.74821 -0.806544 +vn -0.932394 -0.244042 -0.266616 +v -1.43725 1.80358 -1.0061 +vn -0.928733 -0.160943 -0.333994 +v -1.46969 1.83997 -0.928117 +vn -0.939823 -0.104831 -0.325182 +v -1.44954 1.84372 -0.987996 +vn -0.939425 -0.090217 -0.330667 +v -1.50185 1.7694 -0.785554 +vn -0.940946 -0.216364 -0.2604 +v -1.43212 1.66054 -0.910968 +vn -0.906635 -0.304387 -0.292167 +v -1.40778 1.67162 -0.995152 +vn -0.902717 -0.291405 -0.316519 +v -1.39431 1.62731 -0.990099 +vn -0.895217 -0.320877 -0.309233 +v -1.4021 1.56911 -0.899289 +vn -0.89293 -0.351201 -0.281665 +v -1.37775 1.58012 -0.986967 +vn -0.888119 -0.343719 -0.305124 +v -1.36651 1.54276 -0.976112 +vn -0.881037 -0.364931 -0.300997 +v -1.47139 1.63722 -0.749102 +vn -0.914901 -0.326344 -0.237603 +v -1.45912 1.65556 -0.817596 +vn -0.912875 -0.313808 -0.261121 +v -1.44265 1.60567 -0.8118 +vn -0.904523 -0.340264 -0.25702 +v -1.44228 1.54101 -0.71794 +vn -0.903255 -0.364525 -0.226389 +v -1.42654 1.55927 -0.804718 +vn -0.897932 -0.359848 -0.253431 +v -1.42465 1.52725 -0.763861 +vn -0.89936 -0.365138 -0.240472 +v -1.3439 1.65603 -1.15124 +vn -0.887217 -0.285409 -0.362475 +v -1.30774 1.63143 -1.21795 +vn -0.874577 -0.304062 -0.377706 +v -1.32937 1.60845 -1.1465 +vn -0.875653 -0.32568 -0.356601 +v -1.29285 1.67671 -1.28389 +vn -0.872586 -0.26043 -0.413243 +v -1.25817 1.65132 -1.33747 +vn -0.848666 -0.288871 -0.443079 +v -1.27919 1.63123 -1.28147 +vn -0.856867 -0.308911 -0.412738 +v -1.32145 1.57553 -1.13444 +vn -0.868746 -0.354042 -0.346315 +v -1.2869 1.55715 -1.19827 +vn -0.846499 -0.381313 -0.371536 +v -1.30998 1.53921 -1.12428 +vn -0.856488 -0.381513 -0.347674 +v -1.27654 1.5962 -1.2588 +vn -0.850272 -0.345936 -0.396693 +v -1.24222 1.5841 -1.31667 +vn -0.813436 -0.381313 -0.439229 +v -1.2592 1.56026 -1.26187 +vn -0.820073 -0.397907 -0.41128 +v -1.32733 1.70607 -1.22527 +vn -0.891105 -0.23094 -0.390638 +v -1.35461 1.69498 -1.15406 +vn -0.896495 -0.250971 -0.365116 +v -1.36325 1.7362 -1.15875 +vn -0.902147 -0.213555 -0.374866 +v -1.34044 1.78544 -1.23383 +vn -0.901213 -0.143328 -0.40899 +v -1.37059 1.77728 -1.16261 +vn -0.907497 -0.168357 -0.384845 +v -1.37529 1.81722 -1.1659 +vn -0.912087 -0.115244 -0.393467 +v -1.27351 1.7223 -1.34687 +vn -0.86667 -0.202142 -0.456094 +v -1.30061 1.71512 -1.28978 +vn -0.881536 -0.215502 -0.420064 +v -1.30659 1.75382 -1.29466 +vn -0.886514 -0.17268 -0.429271 +v -1.28274 1.79748 -1.35512 +vn -0.875613 -0.108495 -0.470671 +v -1.31138 1.79249 -1.29859 +vn -0.890581 -0.124459 -0.437465 +v -1.31424 1.83062 -1.30103 +vn -0.892139 -0.0735391 -0.445736 +v -1.38592 1.25613 -0.420606 +vn -0.879508 -0.447053 -0.163124 +v -1.35724 1.23543 -0.504982 +vn -0.843528 -0.502382 -0.189931 +v -1.37187 1.229 -0.418889 +vn -0.853881 -0.494557 -0.162177 +v -1.35664 1.27238 -0.593151 +vn -0.861084 -0.458001 -0.220836 +v -1.32304 1.25394 -0.673175 +vn -0.811843 -0.522557 -0.260473 +v -1.34268 1.24536 -0.589224 +vn -0.835521 -0.501627 -0.224222 +v -1.35748 1.20776 -0.423796 +vn -0.816072 -0.55372 -0.165594 +v -1.3244 1.18471 -0.494691 +vn -0.758367 -0.623516 -0.190018 +v -1.33643 1.18238 -0.435917 +vn -0.7714 -0.612587 -0.172274 +v -1.32774 1.22189 -0.588137 +vn -0.798599 -0.554812 -0.233289 +v -1.29169 1.20709 -0.663787 +vn -0.733466 -0.624957 -0.267313 +v -1.31302 1.19825 -0.578783 +vn -0.753824 -0.616486 -0.227366 +v -1.38693 1.29412 -0.507748 +vn -0.887789 -0.420748 -0.186551 +v -1.40103 1.28698 -0.419598 +vn -0.896626 -0.411765 -0.162824 +v -1.41355 1.31872 -0.426038 +vn -0.909662 -0.382467 -0.16197 +v -1.4137 1.36151 -0.518352 +vn -0.908838 -0.375258 -0.182192 +v -1.42768 1.35468 -0.429315 +vn -0.91646 -0.366906 -0.159628 +v -1.44285 1.3947 -0.432311 +vn -0.919867 -0.359278 -0.157365 +v -1.3521 1.31019 -0.68163 +vn -0.861269 -0.442866 -0.249169 +v -1.37168 1.30253 -0.594008 +vn -0.87987 -0.423313 -0.215951 +v -1.3838 1.33363 -0.602067 +vn -0.893411 -0.395633 -0.21282 +v -1.37938 1.3773 -0.69589 +vn -0.887434 -0.395426 -0.236852 +v -1.39758 1.36835 -0.607074 +vn -0.901596 -0.379339 -0.207911 +v -1.41248 1.407 -0.611492 +vn -0.904684 -0.372604 -0.206672 +v -1.42446 1.28123 -0.247911 +vn -0.907292 -0.404937 -0.113343 +v -1.43574 1.28513 -0.161198 +vn -0.909822 -0.405123 -0.0899914 +v -1.4376 1.31356 -0.251846 +vn -0.918207 -0.378313 -0.117371 +v -1.44369 1.2848 -0.07095 +vn -0.914242 -0.399292 -0.0687528 +v -1.45723 1.31808 -0.072978 +vn -0.925898 -0.370833 -0.0720815 +v -1.45387 1.35331 -0.248332 +vn -0.925934 -0.360148 -0.113753 +v -1.46476 1.35707 -0.160536 +vn -0.929543 -0.357967 -0.0883725 +v -1.46788 1.37914 -0.211806 +vn -0.930684 -0.35183 -0.100216 +v -1.47281 1.35774 -0.069515 +vn -0.933979 -0.350802 -0.0679778 +v -1.47969 1.36168 0.021296 +vn -0.93623 -0.348329 -0.046263 +v -1.48832 1.39972 -0.067065 +vn -0.938488 -0.339482 -0.0631879 +v -1.41132 1.27889 -0.333796 +vn -0.898285 -0.418042 -0.135373 +v -1.41037 1.25111 -0.247101 +vn -0.889679 -0.442344 -0.113149 +v -1.38109 1.22016 -0.334637 +vn -0.850065 -0.508538 -0.137035 +v -1.3811 1.19877 -0.24367 +vn -0.82832 -0.550058 -0.106406 +v -1.39603 1.22338 -0.2463 +vn -0.863739 -0.491421 -0.111625 +v -1.42943 1.25409 -0.072011 +vn -0.896847 -0.437128 -0.067704 +v -1.40649 1.22511 -0.159742 +vn -0.865654 -0.493032 -0.086965 +v -1.39933 1.20068 -0.074044 +vn -0.83403 -0.548202 -0.0622024 +v -1.41488 1.22586 -0.073093 +vn -0.869638 -0.489332 -0.0654551 +v -1.28468 1.25414 1.05725 +vn -0.584065 -0.732424 0.34989 +v -1.28715 1.22922 0.998048 +vn -0.580665 -0.749577 0.317746 +v -1.26449 1.21554 1.00546 +vn -0.556942 -0.765185 0.322968 +v -1.23857 1.22688 1.07226 +vn -0.542074 -0.759612 0.359368 +v -1.24264 1.20279 1.01216 +vn -0.537856 -0.776237 0.328887 +v -1.22552 1.19029 1.00984 +vn -0.521439 -0.789239 0.324351 +v -1.28745 1.31118 1.15935 +vn -0.597139 -0.687053 0.413985 +v -1.28471 1.28116 1.11093 +vn -0.584943 -0.714595 0.383661 +v -1.26245 1.26976 1.12231 +vn -0.562728 -0.728067 0.391479 +v -1.24342 1.29222 1.18731 +vn -0.557895 -0.708602 0.432014 +v -1.24044 1.2588 1.13297 +vn -0.547709 -0.736751 0.396502 +v -1.21983 1.24854 1.14181 +vn -0.537426 -0.743323 0.398301 +v -1.26986 1.17213 0.87985 +vn -0.561986 -0.784598 0.261873 +v -1.25814 1.14072 0.803284 +vn -0.54019 -0.810027 0.228149 +v -1.25165 1.15874 0.877341 +vn -0.535113 -0.803035 0.262275 +v -1.28093 1.13759 0.733055 +vn -0.56709 -0.799913 0.196337 +v -1.26366 1.12521 0.730364 +vn -0.536275 -0.820489 0.198005 +v -1.2356 1.14657 0.871692 +vn -0.515753 -0.817124 0.257503 +v -1.22021 1.1179 0.806659 +vn -0.495519 -0.838033 0.228388 +v -1.21543 1.13854 0.885681 +vn -0.504447 -0.822201 0.263663 +v -1.24834 1.11364 0.72243 +vn -0.515727 -0.83514 0.191227 +v -1.22879 1.10482 0.735166 +vn -0.501359 -0.84234 0.197741 +v -1.2918 1.20678 0.932222 +vn -0.58565 -0.75916 0.284061 +v -1.32048 1.20822 0.871923 +vn -0.621429 -0.742946 0.248711 +v -1.29673 1.18147 0.847641 +vn -0.591372 -0.770329 0.23848 +v -1.3359 1.23916 0.920713 +vn -0.653202 -0.707303 0.270278 +v -1.36305 1.24941 0.87609 +vn -0.708085 -0.66719 0.231244 +v -1.34569 1.22634 0.858708 +vn -0.674924 -0.703019 0.224148 +v -1.30165 1.16369 0.774907 +vn -0.596348 -0.772932 0.216666 +v -1.32903 1.17392 0.730192 +vn -0.638156 -0.747063 0.186155 +v -1.30673 1.149 0.700876 +vn -0.604069 -0.778216 0.1717 +v -1.34257 1.20352 0.793889 +vn -0.671038 -0.711332 0.20908 +v -1.36805 1.21116 0.730291 +vn -0.725363 -0.665425 0.176234 +v -1.35336 1.19335 0.718872 +vn -0.690662 -0.703983 0.165513 +v -1.31003 1.2443 0.989943 +vn -0.613884 -0.726121 0.309668 +v -1.33012 1.28466 1.03956 +vn -0.650486 -0.682351 0.333562 +v -1.33804 1.26297 0.975587 +vn -0.65845 -0.695226 0.288279 +v -1.30656 1.29358 1.09933 +vn -0.615957 -0.693752 0.373236 +v -1.32952 1.33593 1.13484 +vn -0.6668 -0.633101 0.393142 +v -1.32937 1.30998 1.09076 +vn -0.657702 -0.661866 0.359669 +v -1.35525 1.28688 0.991797 +vn -0.692986 -0.656821 0.297247 +v -1.32771 1.463 1.30377 +vn -0.676187 -0.529212 0.512548 +v -1.35687 1.50514 1.30503 +vn -0.738724 -0.468594 0.484465 +v -1.36701 1.46876 1.25088 +vn -0.757936 -0.487312 0.433658 +v -1.38326 1.59353 1.33936 +vn -0.782061 -0.368544 0.502549 +v -1.40021 1.58998 1.30913 +vn -0.814522 -0.356267 0.457852 +v -1.38745 1.54544 1.29323 +vn -0.788387 -0.417749 0.451588 +v -1.41453 1.58638 1.27822 +vn -0.850332 -0.34166 0.400256 +v -1.31986 1.49844 1.34731 +vn -0.662878 -0.498331 0.558801 +v -1.34062 1.50602 1.32873 +vn -0.697228 -0.477436 0.534722 +v -1.28468 1.44875 1.34028 +vn -0.619434 -0.556697 0.553525 +v -1.28603 1.4924 1.37971 +vn -0.623369 -0.511625 0.591313 +v -1.29997 1.49176 1.36418 +vn -0.637963 -0.514002 0.573415 +v -1.35351 1.5505 1.349 +vn -0.723974 -0.432787 0.537175 +v -1.34692 1.59157 1.38808 +vn -0.714099 -0.396739 0.576767 +v -1.36622 1.59717 1.36716 +vn -0.748616 -0.376229 0.545918 +v -1.31444 1.53812 1.38665 +vn -0.666125 -0.460853 0.586423 +v -1.31117 1.58205 1.42247 +vn -0.666804 -0.421371 0.61467 +v -1.32826 1.5864 1.40672 +vn -0.685432 -0.411088 0.600991 +v -1.3148 1.42171 1.27607 +vn -0.647667 -0.57361 0.501498 +v -1.30222 1.38105 1.24215 +vn -0.629487 -0.618285 0.470605 +v -1.29312 1.41319 1.29279 +vn -0.618288 -0.590175 0.519051 +v -1.27201 1.33617 1.21898 +vn -0.583337 -0.669825 0.459404 +v -1.25091 1.32949 1.23553 +vn -0.567589 -0.675542 0.470624 +v -1.27195 1.40503 1.30806 +vn -0.596436 -0.601306 0.531692 +v -1.25988 1.36677 1.2755 +vn -0.58329 -0.640609 0.499392 +v -1.25267 1.39733 1.32033 +vn -0.582613 -0.609516 0.537636 +v -1.23027 1.31834 1.24383 +vn -0.555519 -0.685398 0.470773 +v -1.33237 1.4239 1.25437 +vn -0.693097 -0.555336 0.459586 +v -1.34484 1.39545 1.19796 +vn -0.711319 -0.565514 0.417396 +v -1.31228 1.35167 1.18712 +vn -0.648374 -0.632471 0.423782 +v -1.18111 1.72517 -1.49034 +vn -0.741505 -0.202765 -0.639575 +v -1.14924 1.78263 -1.53811 +vn -0.697672 -0.12274 -0.705825 +v -1.14252 1.70779 -1.52563 +vn -0.682709 -0.232873 -0.692588 +v -1.1866 1.7992 -1.50123 +vn -0.750784 -0.0970483 -0.653379 +v -1.2243 1.73032 -1.43416 +vn -0.814429 -0.191961 -0.547592 +v -1.20556 1.76269 -1.47051 +vn -0.788495 -0.148527 -0.596837 +v -1.25342 1.76588 -1.39921 +vn -0.849859 -0.149495 -0.505361 +v -1.25618 1.80133 -1.40364 +vn -0.853244 -0.0984884 -0.512128 +v -1.22952 1.80427 -1.44548 +vn -0.820646 -0.0915745 -0.564052 +v -1.20844 1.83631 -1.47851 +vn -0.791613 -0.0433475 -0.609484 +v -1.25742 1.83782 -1.40635 +vn -0.853772 -0.0469786 -0.518523 +v -1.2574 1.87417 -1.40821 +vn -0.852434 0.00728873 -0.522784 +v -1.19711 1.68911 -1.45692 +vn -0.774399 -0.249602 -0.581382 +v -1.16992 1.65229 -1.47376 +vn -0.719811 -0.309173 -0.621518 +v -1.18301 1.61782 -1.43797 +vn -0.747166 -0.35693 -0.560664 +v -1.2129 1.65725 -1.41869 +vn -0.794783 -0.292556 -0.531724 +v -1.24348 1.69011 -1.3864 +vn -0.837396 -0.240946 -0.490625 +v -1.22928 1.62145 -1.36967 +vn -0.808561 -0.346938 -0.47525 +v -1.12993 1.63445 -1.50711 +vn -0.658043 -0.341312 -0.671182 +v -1.15305 1.58297 -1.45186 +vn -0.687965 -0.417252 -0.593805 +v -1.1417 1.22318 -0.982259 +vn -0.559072 -0.732267 -0.388874 +v -1.14445 1.18308 -0.899043 +vn -0.537531 -0.76206 -0.361006 +v -1.15966 1.19841 -0.907975 +vn -0.557466 -0.744278 -0.367807 +v -1.09971 1.19449 -0.985274 +vn -0.526101 -0.757955 -0.385645 +v -1.10158 1.1614 -0.915017 +vn -0.511623 -0.779421 -0.361586 +v -1.12003 1.17221 -0.91162 +vn -0.525371 -0.768977 -0.364225 +v -1.18065 1.17762 -0.830304 +vn -0.570644 -0.747982 -0.338952 +v -1.17818 1.14018 -0.745681 +vn -0.543124 -0.783258 -0.302527 +v -1.1981 1.15486 -0.746879 +vn -0.569557 -0.763558 -0.304277 +v -1.14095 1.14503 -0.819856 +vn -0.523616 -0.785043 -0.33096 +v -1.1412 1.11642 -0.74735 +vn -0.504503 -0.809329 -0.300772 +v -1.15683 1.12206 -0.73571 +vn -0.521516 -0.802282 -0.290454 +v -1.12831 1.25678 -1.06173 +vn -0.558954 -0.717719 -0.415271 +v -1.10845 1.27862 -1.12506 +vn -0.558536 -0.711871 -0.425766 +v -1.1084 1.23575 -1.05113 +vn -0.541337 -0.735505 -0.407415 +v -1.10356 1.31223 -1.18591 +vn -0.565922 -0.694556 -0.444211 +v -1.09033 1.33517 -1.23807 +vn -0.573436 -0.68494 -0.449475 +v -1.08228 1.29354 -1.18299 +vn -0.550252 -0.710479 -0.438682 +v -1.08399 1.22584 -1.06503 +vn -0.531343 -0.741803 -0.409148 +v -1.06594 1.25297 -1.13593 +vn -0.535877 -0.730047 -0.424108 +v -1.06544 1.21551 -1.07013 +vn -0.522333 -0.749263 -0.407153 +v -1.06192 1.29115 -1.2044 +vn -0.546069 -0.711365 -0.442458 +v -1.04295 1.27228 -1.1969 +vn -0.535152 -0.72331 -0.436388 +v -1.14694 1.2626 -1.04619 +vn -0.577197 -0.708181 -0.4066 +v -1.15479 1.29983 -1.09746 +vn -0.597169 -0.681736 -0.422641 +v -1.17165 1.27159 -1.02565 +vn -0.605956 -0.69099 -0.394145 +v -1.18857 1.30084 -1.04945 +vn -0.629482 -0.664806 -0.402227 +v -1.12021 1.31633 -1.17088 +vn -0.576314 -0.689517 -0.438666 +v -1.17231 1.35757 -1.16171 +vn -0.638601 -0.63662 -0.432324 +v -1.13825 1.32329 -1.15766 +vn -0.596353 -0.676427 -0.432214 +v -1.17655 1.21338 -0.911563 +vn -0.587116 -0.721072 -0.367898 +v -1.21506 1.16981 -0.751056 +vn -0.604298 -0.734598 -0.308527 +v -1.22265 1.25386 -0.91089 +vn -0.655944 -0.66306 -0.360678 +v -1.25871 1.24613 -0.824701 +vn -0.711169 -0.621402 -0.328782 +v -1.24652 1.27323 -0.900002 +vn -0.708282 -0.616633 -0.343659 +v -1.26003 1.21125 -0.752263 +vn -0.684527 -0.661569 -0.306185 +v -1.28326 1.23175 -0.74028 +vn -0.740418 -0.606551 -0.289615 +v -1.54183 1.78915 0.981839 +vn -0.969929 -0.162676 0.181035 +v -1.53072 1.72749 0.979863 +vn -0.965446 -0.195096 0.172774 +v -1.52009 1.74075 1.04938 +vn -0.963797 -0.181012 0.195779 +v -1.56206 1.76239 0.829016 +vn -0.970685 -0.193798 0.142173 +v -1.54817 1.69987 0.831111 +vn -0.965062 -0.2249 0.134443 +v -1.5403 1.71425 0.906121 +vn -0.965878 -0.209363 0.152471 +v -1.51837 1.66785 0.976148 +vn -0.96068 -0.22312 0.165263 +v -1.50519 1.61045 0.970522 +vn -0.955313 -0.248829 0.159564 +v -1.49716 1.62597 1.03804 +vn -0.953448 -0.239789 0.18286 +v -1.53391 1.63966 0.826632 +vn -0.960405 -0.248406 0.126159 +v -1.51834 1.58033 0.822896 +vn -0.955821 -0.268199 0.120313 +v -1.51219 1.59502 0.898735 +vn -0.956003 -0.258663 0.138391 +v -1.55113 1.85207 0.982266 +vn -0.973998 -0.124278 0.189429 +v -1.56282 1.83975 0.909356 +vn -0.975108 -0.142571 0.169816 +v -1.56166 1.97734 0.98109 +vn -0.978671 -0.0280189 0.203513 +v -1.57635 1.96815 0.904114 +vn -0.982813 -0.0414837 0.179882 +v -1.55799 1.91539 0.981542 +vn -0.977249 -0.0797047 0.196547 +v -1.57436 1.83029 0.829147 +vn -0.976819 -0.155731 0.146873 +v -1.58438 1.82045 0.745037 +vn -0.978405 -0.165933 0.123246 +v -1.57375 1.79295 0.788327 +vn -0.974311 -0.181581 0.133212 +v -1.58977 1.96246 0.823135 +vn -0.987131 -0.0484625 0.152396 +v -1.59967 1.93649 0.742682 +vn -0.988069 -0.0787791 0.13234 +v -1.58391 1.89795 0.827018 +vn -0.983055 -0.106801 0.148983 +v -1.51673 1.81242 1.11829 +vn -0.964103 -0.133513 0.229522 +v -1.52332 1.8724 1.12063 +vn -0.966882 -0.0946714 0.237015 +v -1.5377 1.86248 1.05374 +vn -0.971247 -0.109019 0.211647 +v -1.4878 1.83219 1.23484 +vn -0.948045 -0.111508 0.297953 +v -1.49213 1.88949 1.23894 +vn -0.950659 -0.0740732 0.301264 +v -1.50808 1.88138 1.18251 +vn -0.960425 -0.0822399 0.266122 +v -1.52772 1.93273 1.12147 +vn -0.968477 -0.0504743 0.243936 +v -1.52955 1.99277 1.12091 +vn -0.968395 0.000235366 0.24942 +v -1.54617 1.98579 1.05248 +vn -0.974187 -0.0123004 0.225409 +v -1.49445 1.94702 1.24138 +vn -0.951209 -0.0271627 0.307348 +v -1.49452 2.00427 1.24218 +vn -0.950636 0.0186938 0.309744 +v -1.51225 1.99883 1.18436 +vn -0.960775 0.0110977 0.277106 +v -1.5084 1.7535 1.1143 +vn -0.960395 -0.168131 0.222202 +v -1.49561 1.7652 1.17427 +vn -0.954346 -0.157695 0.253685 +v -1.48803 1.64114 1.10082 +vn -0.949531 -0.231633 0.211511 +v -1.47763 1.65528 1.15871 +vn -0.943064 -0.225326 0.244659 +v -1.49871 1.6963 1.10856 +vn -0.955809 -0.199699 0.215752 +v -1.48176 1.77575 1.22899 +vn -0.943942 -0.152605 0.292722 +v -1.46931 1.79014 1.27353 +vn -0.930534 -0.144845 0.336342 +v -1.46567 1.66751 1.21149 +vn -0.929461 -0.226464 0.291232 +v -1.45466 1.6825 1.25521 +vn -0.913322 -0.226528 0.338419 +v -1.47425 1.72067 1.22138 +vn -0.938319 -0.185778 0.291622 +v -1.23951 1.42832 -1.14743 +vn -0.759276 -0.515296 -0.397454 +v -1.26128 1.41104 -1.08094 +vn -0.785485 -0.496839 -0.369004 +v -1.27337 1.43975 -1.09264 +vn -0.806649 -0.465829 -0.363759 +v -1.2646 1.48843 -1.17178 +vn -0.809716 -0.448856 -0.378006 +v -1.28566 1.47098 -1.10358 +vn -0.825379 -0.438451 -0.355682 +v -1.29793 1.50385 -1.11413 +vn -0.843514 -0.407255 -0.35018 +v -1.22218 1.44732 -1.20466 +vn -0.737507 -0.538939 -0.406974 +v -1.23162 1.4724 -1.21932 +vn -0.7616 -0.498156 -0.414495 +v -1.24276 1.50267 -1.23325 +vn -0.787086 -0.462526 -0.408123 +v -1.25353 1.53397 -1.24662 +vn -0.809899 -0.429087 -0.399936 +v -1.31285 1.39998 -0.941963 +vn -0.840681 -0.441589 -0.313455 +v -1.34411 1.41243 -0.869434 +vn -0.864115 -0.414374 -0.285655 +v -1.3258 1.4323 -0.950771 +vn -0.854291 -0.418173 -0.308736 +v -1.34963 1.36143 -0.775428 +vn -0.868224 -0.419812 -0.264472 +v -1.36177 1.39334 -0.784463 +vn -0.875604 -0.404181 -0.264492 +v -1.3389 1.46655 -0.959592 +vn -0.865824 -0.398343 -0.302772 +v -1.37061 1.48405 -0.887067 +vn -0.880477 -0.382857 -0.279609 +v -1.35103 1.50164 -0.969806 +vn -0.871105 -0.385371 -0.30441 +v -1.37711 1.43117 -0.789738 +vn -0.885898 -0.387259 -0.255372 +v -1.40979 1.45689 -0.709024 +vn -0.898015 -0.375681 -0.228984 +v -1.38917 1.46634 -0.800343 +vn -0.890031 -0.378236 -0.254523 +v -1.31826 1.35004 -0.852991 +vn -0.835502 -0.462371 -0.296902 +v -1.29967 1.37023 -0.933582 +vn -0.820623 -0.471958 -0.322233 +v -1.28613 1.34219 -0.925675 +vn -0.796385 -0.507546 -0.328889 +v -1.29021 1.29566 -0.840117 +vn -0.785102 -0.534426 -0.313056 +v -1.27166 1.31656 -0.918761 +vn -0.766185 -0.545882 -0.339077 +v -1.25681 1.29266 -0.912277 +vn -0.734223 -0.580655 -0.35179 +v -1.33615 1.33064 -0.769158 +vn -0.852381 -0.445351 -0.27406 +v -1.3225 1.3018 -0.763331 +vn -0.830806 -0.480546 -0.280779 +v -1.30809 1.27553 -0.75806 +vn -0.80187 -0.52258 -0.289679 +v -1.29342 1.2511 -0.752711 +vn -0.769975 -0.561985 -0.302177 +v -1.24898 1.3839 -1.06936 +vn -0.75999 -0.531154 -0.374553 +v -1.21998 1.37925 -1.11705 +vn -0.711868 -0.572632 -0.406615 +v -1.23603 1.3591 -1.05864 +vn -0.732238 -0.564767 -0.380611 +v -1.20178 1.39221 -1.16591 +vn -0.69603 -0.577818 -0.426227 +v -1.22249 1.3362 -1.04937 +vn -0.700867 -0.598207 -0.388503 +v -1.19711 1.33492 -1.09004 +vn -0.657064 -0.629242 -0.415117 +v -1.212 1.31782 -1.03866 +vn -0.675991 -0.628731 -0.384361 +v -0.155986 4.88749 2.16042 +vn -0.135119 -0.12506 0.982905 +v -0.076717 4.87814 2.1617 +vn -0.0160308 -0.43194 0.90176 +v -0.078641 4.90196 2.16966 +vn -0.0651942 -0.162449 0.984561 +v -0.151481 4.86318 2.15349 +vn -0.0292402 -0.405197 0.913762 +v -0.07409 4.85394 2.14571 +vn 0.0249717 -0.621919 0.782684 +v -0.230166 4.86177 2.14466 +vn -0.232024 -0.0748385 0.969827 +v -0.299428 4.82143 2.12138 +vn -0.356721 -0.0376221 0.933453 +v -0.223493 4.83693 2.13958 +vn -0.0660163 -0.36302 0.92944 +v -0.146206 4.83867 2.13791 +vn 0.0588742 -0.605534 0.793639 +v -0.290959 4.79692 2.1187 +vn -0.123252 -0.32953 0.936066 +v -0.215868 4.8123 2.12513 +vn 0.0835826 -0.577607 0.812025 +v -0.235767 4.88852 2.14088 +vn -0.365179 0.241477 0.899074 +v -0.157506 4.91172 2.15961 +vn -0.227308 0.177901 0.957435 +v -0.225892 4.91599 2.13232 +vn -0.435031 0.518479 0.736157 +v -0.302219 4.85069 2.11683 +vn -0.531601 0.246535 0.810322 +v -0.283323 4.87904 2.11877 +vn -0.55261 0.394553 0.734132 +v -0.078945 4.92525 2.17005 +vn -0.107702 0.146656 0.983307 +v -0.153629 4.93559 2.15244 +vn -0.278128 0.447464 0.849953 +v -0.0768 4.94763 2.16332 +vn -0.128766 0.438372 0.889522 +v -0.410719 4.71952 2.05985 +vn -0.57676 -0.0436251 0.815748 +v -0.353384 4.74389 2.08973 +vn -0.203704 -0.33319 0.920592 +v -0.358071 4.77055 2.09395 +vn -0.434299 -0.0361451 0.900043 +v -0.413837 4.68201 2.05024 +vn -0.334882 -0.326194 0.883998 +v -0.344198 4.71896 2.07753 +vn 0.0516305 -0.541417 0.839167 +v -0.282089 4.77226 2.10542 +vn 0.0889691 -0.553316 0.828206 +v -0.439007 4.68628 2.0359 +vn -0.645539 -0.0596074 0.761398 +v -0.472046 4.64978 2.00375 +vn -0.695475 -0.0262425 0.718071 +v -0.500391 4.61416 1.97198 +vn -0.71992 -0.11853 0.68386 +v -0.468933 4.61853 1.99958 +vn -0.472952 -0.332728 0.815848 +v -0.402131 4.65783 2.04021 +vn -0.0427165 -0.547265 0.835868 +v -0.456025 4.59649 1.99223 +vn -0.183852 -0.575165 0.79711 +v -0.438931 4.71889 2.02968 +vn -0.783786 0.24001 0.572778 +v -0.459616 4.72058 1.99195 +vn -0.828673 0.403424 0.388009 +v -0.48253 4.66954 1.98639 +vn -0.815905 0.213398 0.537364 +v -0.503146 4.66639 1.95089 +vn -0.845837 0.342096 0.409305 +v -0.393216 4.7542 2.07243 +vn -0.627102 0.102634 0.772146 +v -0.36794 4.7956 2.08293 +vn -0.665854 0.268305 0.696168 +v -0.407057 4.7533 2.0577 +vn -0.765452 0.267252 0.585371 +v -0.401101 4.78776 2.04025 +vn -0.788011 0.471163 0.396287 +v -0.430785 4.75543 2.01629 +vn -0.812683 0.433686 0.389183 +v -0.344332 4.83469 2.08887 +vn -0.677613 0.397465 0.618758 +v -0.36413 4.82805 2.06487 +vn -0.763727 0.512214 0.392883 +v -0.132957 4.97565 2.12127 +vn -0.244133 0.856666 0.454448 +v -0.072414 4.96805 2.14976 +vn -0.127598 0.686349 0.715992 +v -0.067178 4.98424 2.12943 +vn -0.113319 0.877626 0.465759 +v -0.144413 4.95784 2.1397 +vn -0.279861 0.671444 0.686178 +v -0.193173 4.9617 2.10311 +vn -0.405926 0.833335 0.375202 +v -0.212739 4.94075 2.1186 +vn -0.458394 0.68776 0.562905 +v -0.174905 4.97455 2.08362 +vn -0.314241 0.939828 0.134073 +v -0.12152 4.98639 2.09677 +vn -0.191059 0.96792 0.163179 +v -0.15499 4.97934 2.05819 +vn -0.21312 0.970005 -0.116917 +v -0.192143 4.96797 2.04851 +vn -0.312092 0.940988 -0.130917 +v -0.060866 4.99385 2.10256 +vn -0.0937714 0.981115 0.169175 +v -0.102534 4.98954 2.06642 +vn -0.130531 0.985702 -0.106557 +v -0.044655 4.99557 2.07097 +vn -0.0639196 0.992645 -0.102814 +v -0.1347 4.30196 2.04795 +vn -0.127988 -0.927429 0.351418 +v -0.073048 4.28381 2.00911 +vn -0.0526796 -0.950344 0.306711 +v -0.066545 4.30011 2.06171 +vn -0.0655967 -0.942154 0.328699 +v -0.147906 4.28554 1.99557 +vn -0.112733 -0.938765 0.325595 +v -0.081568 4.26637 1.95463 +vn -0.0508642 -0.940327 0.33645 +v -0.20276 4.30563 2.0272 +vn -0.20036 -0.903794 0.378169 +v -0.222037 4.28963 1.97446 +vn -0.188841 -0.919774 0.344028 +v -0.164743 4.26838 1.94078 +vn -0.118291 -0.928866 0.35102 +v -0.246082 4.27359 1.91797 +vn -0.208668 -0.908564 0.361897 +v -0.188134 4.32315 2.07299 +vn -0.247418 -0.843255 0.477185 +v -0.124828 4.31947 2.09418 +vn -0.167272 -0.879173 0.446178 +v -0.177717 4.34353 2.10833 +vn -0.328401 -0.686064 0.649206 +v -0.237627 4.34749 2.07809 +vn -0.421186 -0.616976 0.664788 +v -0.061769 4.31741 2.10846 +vn -0.0911819 -0.90089 0.424363 +v -0.117938 4.33978 2.13034 +vn -0.232018 -0.742091 0.628863 +v -0.058473 4.33768 2.14511 +vn -0.131298 -0.773583 0.619944 +v -0.513122 4.69927 1.87108 +vn -0.800051 0.55985 0.215607 +v -0.544528 4.68323 1.79607 +vn -0.766445 0.608925 0.204383 +v -0.559773 4.6423 1.83542 +vn -0.835801 0.463818 0.293784 +v -0.57418 4.67325 1.72046 +vn -0.725404 0.648792 0.229909 +v -0.594829 4.62867 1.75888 +vn -0.812485 0.501918 0.296558 +v -0.628595 4.6234 1.67979 +vn -0.782705 0.532519 0.322175 +v -0.487956 4.73884 1.83469 +vn -0.717397 0.689497 0.099673 +v -0.45957 4.75856 1.90884 +vn -0.760934 0.634849 0.133966 +v -0.513193 4.72399 1.76225 +vn -0.669825 0.733791 0.113509 +v -0.452965 4.77178 1.79888 +vn -0.619463 0.78501 0.0050126 +v -0.482819 4.71511 1.93928 +vn -0.822099 0.500142 0.27205 +v -0.429421 4.7768 1.98277 +vn -0.791066 0.56998 0.222122 +v -0.527394 4.65868 1.90166 +vn -0.845604 0.428737 0.318023 +v -0.530963 4.63398 1.91871 +vn -0.862621 0.289401 0.414888 +v -0.121065 4.96229 1.98133 +vn -0.128461 0.937506 -0.323389 +v -0.125981 4.94461 1.93186 +vn -0.13339 0.947995 -0.288986 +v -0.176428 4.95095 1.9769 +vn -0.210881 0.92749 -0.308694 +v -0.130068 4.92983 1.87845 +vn -0.145045 0.969471 -0.197707 +v -0.184875 4.9325 1.92692 +vn -0.214785 0.937001 -0.275494 +v -0.191207 4.91692 1.8725 +vn -0.229928 0.954177 -0.191521 +v -0.063614 4.95262 1.93735 +vn -0.0618323 0.952455 -0.29834 +v -0.061417 4.97006 1.98675 +vn -0.0606173 0.942527 -0.328586 +v -0.065662 4.93803 1.88446 +vn -0.067208 0.976315 -0.20565 +v -0.115979 4.97831 2.02586 +vn -0.130153 0.952437 -0.275543 +v -0.058332 4.98572 2.03176 +vn -0.0644467 0.959311 -0.274897 +v -0.167316 4.96744 2.01982 +vn -0.210255 0.938361 -0.274358 +v -0.370805 4.90121 1.38811 +vn -0.387162 0.684287 0.617946 +v -0.460487 4.8673 1.3665 +vn -0.440187 0.615466 0.653787 +v -0.448062 4.85661 1.3855 +vn -0.439947 0.670365 0.597543 +v -0.527328 4.8232 1.35975 +vn -0.503808 0.624002 0.597326 +v -0.294548 4.9445 1.3837 +vn -0.334346 0.705495 0.624891 +v -0.374492 4.91688 1.37053 +vn -0.362905 0.63876 0.678444 +v -0.224082 4.98125 1.37648 +vn -0.280287 0.723778 0.630543 +v -0.298287 4.96034 1.36593 +vn -0.30345 0.656901 0.690216 +v -0.292386 4.93446 1.39769 +vn -0.373182 0.76341 0.5272 +v -0.367727 4.89238 1.4011 +vn -0.416833 0.742824 0.523891 +v -0.291728 4.92775 1.40946 +vn -0.405486 0.810371 0.422943 +v -0.22227 4.97045 1.39141 +vn -0.317078 0.784941 0.532287 +v -0.221961 4.96305 1.40423 +vn -0.347342 0.833031 0.430596 +v -0.522627 4.81661 1.37105 +vn -0.496718 0.684367 0.533773 +v -0.444938 4.84971 1.39658 +vn -0.456638 0.732283 0.505216 +v -0.366654 4.88654 1.41162 +vn -0.442133 0.791853 0.421292 +v -0.520715 4.81215 1.37949 +vn -0.485595 0.754996 0.440657 +v -0.44366 4.84505 1.40567 +vn -0.465124 0.785886 0.407483 +v -0.821584 4.60686 1.12651 +vn -0.797471 0.135952 0.587841 +v -0.836615 4.60491 1.10736 +vn -0.78251 0.147571 0.604897 +v -0.826735 4.53128 1.13661 +vn -0.775993 0.14402 0.614078 +v -0.862295 4.59927 1.07598 +vn -0.784028 0.16985 0.597035 +v -0.844961 4.52549 1.11568 +vn -0.764233 0.154521 0.626155 +v -0.828351 4.44656 1.1556 +vn -0.763576 0.158739 0.625903 +v -0.812128 4.45449 1.1736 +vn -0.779554 0.149207 0.608303 +v -0.855211 4.43696 1.12575 +vn -0.766295 0.152816 0.62405 +v -0.81719 4.67167 1.1167 +vn -0.80035 0.173606 0.573847 +v -0.804205 4.6702 1.13541 +vn -0.813477 0.171516 0.555731 +v -0.783362 4.72337 1.14664 +vn -0.79307 0.251008 0.555009 +v -0.837971 4.67423 1.08713 +vn -0.801234 0.195835 0.565396 +v -0.801 4.7307 1.11821 +vn -0.793358 0.260672 0.550121 +v -0.813073 4.60944 1.13801 +vn -0.833538 0.128313 0.537355 +v -0.808026 4.62021 1.14413 +vn -0.892051 0.163965 0.421141 +v -0.796867 4.67021 1.14674 +vn -0.845958 0.202498 0.493305 +v -0.772208 4.71898 1.16478 +vn -0.800167 0.269416 0.535862 +v -0.793295 4.66971 1.15407 +vn -0.892187 0.2651 0.365682 +v -0.765986 4.71644 1.17591 +vn -0.814157 0.334975 0.47428 +v -0.816127 4.53565 1.14947 +vn -0.81183 0.123235 0.570741 +v -0.810649 4.54596 1.15604 +vn -0.88005 0.0932428 0.465636 +v -0.802876 4.45994 1.18465 +vn -0.815622 0.120671 0.565861 +v -0.731959 4.28562 1.3104 +vn -0.803248 -0.0178634 0.595377 +v -0.703686 4.24321 1.3438 +vn -0.785261 -0.11124 0.60909 +v -0.699634 4.24727 1.34977 +vn -0.790652 -0.117004 0.600982 +v -0.743003 4.27612 1.29574 +vn -0.791682 -0.0138074 0.610777 +v -0.715746 4.23123 1.32632 +vn -0.775471 -0.11839 0.620184 +v -0.709092 4.23779 1.33585 +vn -0.780227 -0.115014 0.614831 +v -0.66195 4.21131 1.38839 +vn -0.75877 -0.236871 0.606763 +v -0.620873 4.17481 1.41985 +vn -0.69594 -0.362336 0.619984 +v -0.61808 4.17879 1.42528 +vn -0.699247 -0.366754 0.613633 +v -0.669904 4.20185 1.37506 +vn -0.749661 -0.236024 0.618305 +v -0.62908 4.16291 1.40381 +vn -0.686703 -0.367307 0.627316 +v -0.624539 4.16945 1.41256 +vn -0.691304 -0.365275 0.623437 +v -0.758737 4.32604 1.27207 +vn -0.802339 0.060439 0.5938 +v -0.780874 4.36753 1.23566 +vn -0.796652 0.113051 0.593772 +v -0.764045 4.32203 1.26547 +vn -0.794279 0.0681866 0.603714 +v -0.798151 4.40994 1.20297 +vn -0.786742 0.143952 0.600262 +v -0.804455 4.40622 1.19576 +vn -0.776526 0.151843 0.611515 +v -0.771195 4.3167 1.25676 +vn -0.788755 0.0665862 0.611091 +v -0.794686 4.35845 1.21959 +vn -0.781791 0.121066 0.611675 +v -0.779955 4.31032 1.2463 +vn -0.784325 0.0641239 0.617028 +v -0.813002 4.40135 1.18628 +vn -0.770133 0.152706 0.619335 +v -0.823428 4.39555 1.1749 +vn -0.765996 0.151689 0.624693 +v -0.754569 4.3293 1.27748 +vn -0.812576 0.0495672 0.580743 +v -0.725528 4.29135 1.31954 +vn -0.820981 -0.0450811 0.569173 +v -0.749218 4.33366 1.28506 +vn -0.840644 0.00432073 0.541571 +v -0.751562 4.3317 1.28159 +vn -0.825742 0.0290962 0.563297 +v -0.793193 4.413 1.20885 +vn -0.801075 0.131665 0.583904 +v -0.772948 4.3731 1.24565 +vn -0.824683 0.0802411 0.559874 +v -0.787005 4.41708 1.21704 +vn -0.84302 0.0839773 0.531287 +v -0.789697 4.41525 1.21332 +vn -0.819861 0.11133 0.561634 +v -0.696454 4.25053 1.35469 +vn -0.796853 -0.123936 0.591325 +v -0.568144 4.14998 1.45877 +vn -0.611552 -0.492356 0.619346 +v -0.615889 4.18197 1.42977 +vn -0.702846 -0.370539 0.607214 +v -0.694085 4.25293 1.35843 +vn -0.803957 -0.140511 0.577849 +v -0.657206 4.21694 1.39669 +vn -0.767978 -0.255334 0.587379 +v -0.692206 4.25488 1.36163 +vn -0.811425 -0.158545 0.562541 +v -0.614175 4.18431 1.43317 +vn -0.705577 -0.383174 0.596103 +v -0.564938 4.15547 1.46643 +vn -0.615557 -0.507415 0.603008 +v -0.612787 4.18621 1.43615 +vn -0.708406 -0.394723 0.58511 +v -0.310704 4.0771 1.54992 +vn -0.234533 -0.743358 0.626428 +v -0.236889 4.06418 1.55765 +vn -0.166614 -0.753507 0.635978 +v -0.236128 4.06814 1.56252 +vn -0.165164 -0.758987 0.62981 +v -0.312696 4.06776 1.53837 +vn -0.235672 -0.732589 0.63857 +v -0.239002 4.05234 1.54318 +vn -0.160426 -0.753011 0.638153 +v -0.237489 4.05874 1.55103 +vn -0.165237 -0.751556 0.63864 +v -0.159045 4.06203 1.57131 +vn -0.101728 -0.773292 0.625837 +v -0.070383 4.05543 1.57326 +vn -0.0322162 -0.770212 0.636974 +v -0.089644 4.06009 1.57751 +vn -0.0680592 -0.784839 0.615951 +v -0.166155 4.0539 1.56037 +vn -0.110583 -0.759906 0.640558 +v -0.081161 4.04302 1.55757 +vn -0.0463708 -0.762211 0.645665 +v -0.090342 4.05139 1.56686 +vn -0.0643644 -0.757543 0.649604 +v -0.382102 4.08963 1.53351 +vn -0.31463 -0.713455 0.626091 +v -0.449426 4.10561 1.51289 +vn -0.406466 -0.666856 0.62457 +v -0.383151 4.08567 1.52859 +vn -0.314819 -0.707328 0.632911 +v -0.511617 4.12576 1.4881 +vn -0.507392 -0.594884 0.623431 +v -0.513392 4.12182 1.48302 +vn -0.506192 -0.589502 0.629489 +v -0.384467 4.0803 1.52191 +vn -0.313932 -0.704938 0.63601 +v -0.452572 4.09629 1.50111 +vn -0.404184 -0.658615 0.634714 +v -0.386113 4.07371 1.51387 +vn -0.312796 -0.701615 0.640231 +v -0.515671 4.11649 1.47615 +vn -0.503643 -0.589094 0.631911 +v -0.573325 4.14066 1.44645 +vn -0.605423 -0.488852 0.628082 +v -0.51851 4.10997 1.46791 +vn -0.501266 -0.587871 0.634933 +v -0.381267 4.09277 1.5376 +vn -0.314933 -0.720779 0.617491 +v -0.309516 4.08263 1.5571 +vn -0.23359 -0.763889 0.601589 +v -0.37989 4.09699 1.54344 +vn -0.313157 -0.746158 0.587521 +v -0.380529 4.09509 1.54069 +vn -0.313754 -0.73372 0.602672 +v -0.51022 4.12888 1.49231 +vn -0.509195 -0.599801 0.617219 +v -0.447383 4.11108 1.52019 +vn -0.40689 -0.684751 0.604613 +v -0.508087 4.13306 1.49832 +vn -0.509832 -0.622741 0.59352 +v -0.509057 4.13119 1.49549 +vn -0.509164 -0.612037 0.605114 +v -0.235458 4.07127 1.56655 +vn -0.163808 -0.76878 0.618178 +v -0.158358 4.06754 1.57839 +vn -0.103435 -0.792141 0.60151 +v -0.080356 4.06208 1.58076 +vn -0.0425865 -0.799601 0.59902 +v -0.079418 4.06433 1.58376 +vn -0.0469819 -0.799409 0.598947 +v -0.308441 4.08629 1.56238 +vn -0.231129 -0.788103 0.570502 +v -0.234689 4.07557 1.57235 +vn -0.162418 -0.795995 0.583105 +v -0.234257 4.07729 1.57485 +vn -0.160978 -0.808544 0.565989 +v -0.157554 4.07126 1.58365 +vn -0.100444 -0.816871 0.568007 +v -0.079298 4.06629 1.58646 +vn -0.0480466 -0.812709 0.580685 +v -0.079142 4.06804 1.58896 +vn -0.0476041 -0.825044 0.563059 +v -0.667462 4.77761 1.26494 +vn -0.655314 0.519224 0.548608 +v -0.676079 4.78825 1.24567 +vn -0.663411 0.470677 0.581678 +v -0.726022 4.75296 1.2109 +vn -0.740357 0.40238 0.53848 +v -0.693301 4.79962 1.21795 +vn -0.677694 0.424565 0.600396 +v -0.735818 4.75974 1.19324 +vn -0.744245 0.360036 0.562561 +v -0.751379 4.7701 1.1663 +vn -0.750441 0.343003 0.564966 +v -0.603638 4.81588 1.29769 +vn -0.586714 0.545106 0.598854 +v -0.600647 4.79829 1.31791 +vn -0.582527 0.578407 0.571059 +v -0.542175 4.82989 1.34099 +vn -0.52819 0.576285 0.623628 +v -0.625683 4.8359 1.25923 +vn -0.602187 0.49802 0.623977 +v -0.663232 4.77128 1.27661 +vn -0.637498 0.586023 0.500172 +v -0.660937 4.76786 1.28424 +vn -0.594169 0.68704 0.418257 +v -0.596304 4.79149 1.32961 +vn -0.55973 0.641664 0.524377 +v -0.594136 4.78752 1.33754 +vn -0.526823 0.726893 0.440551 +v -0.72072 4.74871 1.22195 +vn -0.730892 0.48448 0.480704 +v -0.718165 4.74609 1.22937 +vn -0.69432 0.611036 0.380203 +v -0.762986 4.71481 1.18328 +vn -0.818358 0.461552 0.342432 +v -0.103312 5.02415 1.36849 +vn -0.143595 0.746128 0.650133 +v -0.164127 5.02473 1.35274 +vn -0.194675 0.668192 0.718067 +v -0.160747 5.00769 1.37118 +vn -0.217179 0.737321 0.63968 +v -0.10545 5.04263 1.34943 +vn -0.130506 0.662998 0.737158 +v -0.168613 5.05229 1.32832 +vn -0.189864 0.612483 0.767344 +v -0.227867 4.9974 1.35846 +vn -0.250132 0.667579 0.701264 +v -0.045517 5.0344 1.36593 +vn -0.0614162 0.742578 0.666937 +v -0.050935 5.05561 1.34489 +vn -0.0630217 0.650926 0.75652 +v -0.103225 5.07346 1.3251 +vn -0.12511 0.588697 0.798613 +v -0.044668 5.08036 1.32626 +vn -0.049685 0.581128 0.812294 +v -0.049876 5.02027 1.38354 +vn -0.0776001 0.821601 0.564757 +v -0.102581 5.01198 1.38466 +vn -0.16086 0.818103 0.552116 +v -0.050159 5.01154 1.39802 +vn -0.0807789 0.877773 0.472218 +v -0.159285 4.99622 1.38679 +vn -0.244607 0.804106 0.541831 +v -0.10253 5.00368 1.39875 +vn -0.172834 0.871214 0.459473 +v -0.159157 4.9883 1.40038 +vn -0.266385 0.855021 0.444947 +v -0.364271 4.82827 1.73101 +vn -0.516589 0.856195 -0.00815214 +v -0.368539 4.82696 1.68015 +vn -0.519112 0.85311 0.0522179 +v -0.420496 4.79343 1.70988 +vn -0.534877 0.844516 0.0264441 +v -0.378745 4.8247 1.63718 +vn -0.517902 0.848812 0.106281 +v -0.427732 4.79212 1.65925 +vn -0.520483 0.849462 0.0866679 +v -0.483172 4.75589 1.67818 +vn -0.546214 0.831672 0.0998615 +v -0.432388 4.79562 1.61222 +vn -0.50723 0.850018 0.142081 +v -0.493295 4.7572 1.62622 +vn -0.515469 0.843076 0.153345 +v -0.321017 4.85439 1.69797 +vn -0.489897 0.870836 0.0405692 +v -0.310924 4.8592 1.74391 +vn -0.467491 0.883886 -0.0140403 +v -0.269649 4.88135 1.69744 +vn -0.422267 0.904677 0.0570155 +v -0.317096 4.86081 1.64607 +vn -0.487323 0.867625 0.0987032 +v -0.35771 4.83501 1.78552 +vn -0.510906 0.856626 -0.0718751 +v -0.306047 4.86479 1.79889 +vn -0.444314 0.891636 -0.0870081 +v -0.255927 4.88541 1.75228 +vn -0.379713 0.925103 -0.00129619 +v -0.252499 4.88915 1.80845 +vn -0.351122 0.932247 -0.0873466 +v -0.411166 4.80004 1.76531 +vn -0.550301 0.834377 -0.0313731 +v -0.469876 4.76032 1.73544 +vn -0.580694 0.812864 0.0452367 +v -0.764837 4.54012 1.42198 +vn -0.948468 -0.18764 0.255341 +v -0.765218 4.51076 1.37162 +vn -0.89069 -0.409193 0.19807 +v -0.745451 4.49948 1.43885 +vn -0.862623 -0.466204 0.196305 +v -0.785431 4.55969 1.35299 +vn -0.963293 -0.149182 0.223183 +v -0.781079 4.52087 1.31595 +vn -0.924585 -0.315773 0.213143 +v -0.736925 4.47406 1.38926 +vn -0.758524 -0.609907 0.229466 +v -0.721044 4.46896 1.44827 +vn -0.731494 -0.666825 0.14234 +v -0.743325 4.46021 1.34842 +vn -0.858707 -0.345659 0.378341 +v -0.777094 4.59513 1.38542 +vn -0.938524 0.15084 0.310515 +v -0.754912 4.57177 1.4569 +vn -0.929839 0.123416 0.346652 +v -0.751018 4.62954 1.4207 +vn -0.822961 0.425971 0.375877 +v -0.792104 4.61681 1.32411 +vn -0.944647 0.203106 0.257663 +v -0.799608 4.57593 1.29593 +vn -0.977049 -0.0914918 0.192363 +v -0.765272 4.65204 1.36112 +vn -0.813232 0.476812 0.333622 +v -0.73778 4.52136 1.50113 +vn -0.933332 -0.205254 0.294553 +v -0.703559 4.50592 1.59151 +vn -0.920618 -0.209136 0.329733 +v -0.726161 4.5515 1.53667 +vn -0.921116 0.115301 0.371821 +v -0.729652 4.60668 1.48948 +vn -0.83008 0.39601 0.39261 +v -0.702021 4.58802 1.56545 +vn -0.838451 0.379352 0.39127 +v -0.718676 4.48651 1.51816 +vn -0.842429 -0.486237 0.232136 +v -0.696949 4.4602 1.52341 +vn -0.718353 -0.672451 0.178266 +v -0.687576 4.47673 1.60091 +vn -0.812556 -0.515043 0.272916 +v -0.551872 4.31808 1.62958 +vn -0.7719 -0.463093 0.435563 +v -0.522279 4.28001 1.63889 +vn -0.706646 -0.506332 0.494247 +v -0.516836 4.30016 1.66891 +vn -0.717237 -0.533593 0.448162 +v -0.593597 4.32254 1.56171 +vn -0.811206 -0.3234 0.487193 +v -0.559167 4.27488 1.58118 +vn -0.74499 -0.421095 0.517367 +v -0.559674 4.3011 1.60164 +vn -0.774499 -0.40895 0.482609 +v -0.480876 4.28256 1.70025 +vn -0.638448 -0.609073 0.470547 +v -0.436919 4.24456 1.70477 +vn -0.532852 -0.684286 0.497817 +v -0.441325 4.26924 1.73402 +vn -0.568934 -0.67745 0.466234 +v -0.470735 4.23176 1.6517 +vn -0.575038 -0.627256 0.525244 +v -0.481338 4.26091 1.67348 +vn -0.634791 -0.595968 0.491795 +v -0.602676 4.35455 1.5666 +vn -0.855084 -0.274234 0.440031 +v -0.630943 4.38341 1.52183 +vn -0.874897 0.062458 0.480265 +v -0.650721 4.37421 1.4852 +vn -0.86637 -0.0947284 0.490337 +v -0.622709 4.34771 1.52598 +vn -0.850451 -0.23231 0.47198 +v -0.631803 4.32872 1.50075 +vn -0.83576 -0.239155 0.494278 +v -0.681072 4.4132 1.43253 +vn -0.761899 0.282487 0.582848 +v -0.691879 4.39046 1.41649 +vn -0.855174 -0.0691681 0.513706 +v -0.554124 4.33952 1.65205 +vn -0.787152 -0.490004 0.37455 +v -0.504425 4.31227 1.70596 +vn -0.670243 -0.636471 0.381679 +v -0.584961 4.3639 1.61052 +vn -0.884901 -0.204746 0.418365 +v -0.60854 4.37287 1.56436 +vn -0.891444 -0.100314 0.441887 +v -0.546623 4.35344 1.68829 +vn -0.853561 -0.347793 0.387908 +v -0.437645 4.28757 1.76636 +vn -0.541431 -0.732583 0.412522 +v -0.359681 4.26798 1.81924 +vn -0.394712 -0.814211 0.425749 +v -0.209075 4.22717 1.83372 +vn -0.167649 -0.873154 0.457708 +v -0.165509 4.21362 1.82079 +vn -0.114321 -0.878195 0.464439 +v -0.157301 4.22361 1.84208 +vn -0.104954 -0.884937 0.453731 +v -0.233507 4.20733 1.78756 +vn -0.191901 -0.857559 0.477248 +v -0.182498 4.19069 1.77469 +vn -0.131878 -0.861965 0.489514 +v -0.174108 4.20224 1.79754 +vn -0.123747 -0.870281 0.476757 +v -0.103457 4.22523 1.85514 +vn -0.0654467 -0.892952 0.445369 +v -0.05524 4.21128 1.83256 +vn -0.0309861 -0.88635 0.461977 +v -0.052386 4.22311 1.85588 +vn -0.0298656 -0.895297 0.444467 +v -0.112582 4.20047 1.80659 +vn -0.0699783 -0.876433 0.476412 +v -0.052496 4.18881 1.79142 +vn -0.0281434 -0.871958 0.48877 +v -0.057417 4.19927 1.80987 +vn -0.0338112 -0.877671 0.47807 +v -0.2581 4.23233 1.82292 +vn -0.224871 -0.863663 0.45113 +v -0.305599 4.23668 1.80401 +vn -0.298008 -0.832343 0.46733 +v -0.353941 4.24642 1.7865 +vn -0.381223 -0.801644 0.460473 +v -0.338401 4.22042 1.75403 +vn -0.337133 -0.804905 0.488332 +v -0.285345 4.21235 1.77234 +vn -0.257849 -0.841666 0.474461 +v -0.254189 4.18553 1.74135 +vn -0.210942 -0.839291 0.501094 +v -0.38918 4.23113 1.73156 +vn -0.43432 -0.756022 0.489691 +v -0.370151 4.20336 1.70523 +vn -0.382652 -0.769422 0.511435 +v -0.273944 4.25484 1.85823 +vn -0.252465 -0.872001 0.419375 +v -0.183048 4.24737 1.88352 +vn -0.138115 -0.901848 0.409384 +v -0.050035 4.23346 1.87757 +vn -0.0294534 -0.903836 0.426863 +v -0.096468 4.24724 1.90324 +vn -0.061444 -0.917495 0.392973 +v -0.62094 4.68229 1.58036 +vn -0.639343 0.699747 0.318739 +v -0.640567 4.6937 1.51934 +vn -0.605898 0.719224 0.340007 +v -0.68383 4.64294 1.53226 +vn -0.724016 0.575172 0.380761 +v -0.652375 4.70849 1.46683 +vn -0.568014 0.752299 0.333775 +v -0.703445 4.66173 1.46788 +vn -0.697981 0.604837 0.3834 +v -0.71673 4.68141 1.4114 +vn -0.669091 0.649758 0.360738 +v -0.562265 4.72543 1.58239 +vn -0.533358 0.809745 0.244626 +v -0.603098 4.70817 1.55263 +vn -0.554027 0.778044 0.296143 +v -0.55203 4.71783 1.63442 +vn -0.579258 0.787873 0.209085 +v -0.57574 4.73227 1.53391 +vn -0.499575 0.824048 0.267153 +v -0.614887 4.71988 1.50131 +vn -0.516703 0.799216 0.307036 +v -0.501081 4.76252 1.57834 +vn -0.489984 0.84928 0.196568 +v -0.600193 4.67256 1.64889 +vn -0.683179 0.676133 0.275881 +v -0.534654 4.71706 1.69522 +vn -0.623928 0.765213 0.15863 +v -0.658614 4.62888 1.60342 +vn -0.751763 0.555157 0.355883 +v -0.133686 4.92007 1.76568 +vn -0.174129 0.984437 0.0237137 +v -0.147584 4.92139 1.708 +vn -0.207903 0.973324 0.0970351 +v -0.196982 4.90573 1.75971 +vn -0.275228 0.961278 0.0139439 +v -0.190615 4.91756 1.64988 +vn -0.299129 0.944322 0.13703 +v -0.210307 4.90483 1.70276 +vn -0.318909 0.944506 0.0787736 +v -0.252031 4.89452 1.64594 +vn -0.406412 0.906328 0.115752 +v -0.073538 4.93272 1.70766 +vn -0.0958857 0.989002 0.112608 +v -0.067291 4.92838 1.77212 +vn -0.080194 0.996474 0.0246833 +v -0.12832 4.93285 1.65308 +vn -0.19095 0.968759 0.158252 +v -0.073526 4.94192 1.64741 +vn -0.0992139 0.979713 0.174123 +v -0.132176 4.92161 1.8228 +vn -0.159804 0.983778 -0.0815028 +v -0.066802 4.92983 1.82919 +vn -0.0745046 0.993529 -0.0857224 +v -0.194511 4.90806 1.81632 +vn -0.251769 0.964175 -0.083537 +v -0.369395 4.84549 1.55184 +vn -0.500097 0.845938 0.185182 +v -0.376198 4.85235 1.50655 +vn -0.489133 0.845181 0.215449 +v -0.43898 4.81054 1.5255 +vn -0.486165 0.846508 0.216952 +v -0.442221 4.8253 1.46679 +vn -0.475959 0.843263 0.249742 +v -0.451985 4.81246 1.49136 +vn -0.475787 0.845766 0.24147 +v -0.512298 4.77857 1.49386 +vn -0.458562 0.853522 0.24743 +v -0.515383 4.78716 1.45981 +vn -0.453282 0.851987 0.26202 +v -0.303697 4.88476 1.54731 +vn -0.469954 0.864242 0.179521 +v -0.239228 4.91749 1.54749 +vn -0.399169 0.897433 0.187822 +v -0.300262 4.8956 1.50675 +vn -0.46136 0.864263 0.200491 +v -0.368202 4.86584 1.47311 +vn -0.478693 0.848006 0.227464 +v -0.233984 4.92899 1.50598 +vn -0.394841 0.895356 0.206005 +v -0.296672 4.90533 1.47419 +vn -0.453529 0.865658 0.212007 +v -0.307055 4.87408 1.59362 +vn -0.476793 0.866599 0.147222 +v -0.370251 4.83609 1.59664 +vn -0.510062 0.847259 0.148289 +v -0.244678 4.90581 1.59485 +vn -0.402217 0.90161 0.159128 +v -0.435161 4.80272 1.56737 +vn -0.495885 0.848465 0.184949 +v -0.507148 4.77022 1.53385 +vn -0.471303 0.852279 0.226923 +v -0.810237 4.59407 1.22714 +vn -0.998602 0.0056544 0.0525561 +v -0.803724 4.53756 1.21403 +vn -0.983479 -0.166117 0.0719284 +v -0.800461 4.53441 1.23892 +vn -0.969886 -0.205623 0.13054 +v -0.810244 4.60078 1.20104 +vn -0.998138 0.0508423 -0.0336888 +v -0.804789 4.53871 1.19539 +vn -0.990402 -0.134292 0.0326987 +v -0.783108 4.46727 1.24718 +vn -0.949884 -0.198696 0.241331 +v -0.776596 4.46829 1.2713 +vn -0.93237 -0.224721 0.283172 +v -0.788153 4.46876 1.22711 +vn -0.962057 -0.172327 0.211542 +v -0.801494 4.64799 1.23143 +vn -0.935455 0.345239 0.0757174 +v -0.770922 4.69552 1.24354 +vn -0.753402 0.645346 0.126148 +v -0.79887 4.65611 1.20569 +vn -0.921335 0.388446 -0.0158516 +v -0.808642 4.60439 1.18202 +vn -0.99333 0.0782653 -0.0846745 +v -0.767202 4.70271 1.22236 +vn -0.742076 0.665344 0.0814851 +v -0.795551 4.66128 1.18741 +vn -0.914231 0.401833 -0.0520685 +v -0.801839 4.63049 1.2692 +vn -0.953163 0.246585 0.175144 +v -0.806683 4.57896 1.25554 +vn -0.988134 -0.0806678 0.130705 +v -0.773529 4.68487 1.27275 +vn -0.779153 0.594785 0.197868 +v -0.772377 4.67052 1.31176 +vn -0.800502 0.536897 0.266343 +v -0.793486 4.52931 1.2717 +vn -0.949703 -0.24776 0.19152 +v -0.765423 4.46706 1.30297 +vn -0.904823 -0.261669 0.335894 +v -0.683571 4.32632 1.41056 +vn -0.855919 -0.203578 0.475351 +v -0.65696 4.28542 1.43749 +vn -0.827478 -0.273266 0.490515 +v -0.648977 4.28974 1.45322 +vn -0.824234 -0.274248 0.495405 +v -0.695827 4.31668 1.38396 +vn -0.861564 -0.214499 0.460106 +v -0.668611 4.27663 1.41264 +vn -0.831029 -0.277711 0.481941 +v -0.663218 4.28095 1.42429 +vn -0.829293 -0.274987 0.486471 +v -0.610748 4.25769 1.49409 +vn -0.775215 -0.361145 0.518282 +v -0.57611 4.22283 1.51622 +vn -0.70866 -0.465998 0.529762 +v -0.567855 4.2289 1.53251 +vn -0.706892 -0.466157 0.531979 +v -0.625552 4.24747 1.46442 +vn -0.7802 -0.361381 0.51058 +v -0.588615 4.21182 1.48974 +vn -0.711109 -0.463949 0.528277 +v -0.582784 4.21716 1.50221 +vn -0.709868 -0.465489 0.52859 +v -0.71265 4.35958 1.36926 +vn -0.870933 -0.164551 0.463032 +v -0.738143 4.3989 1.33209 +vn -0.893376 -0.170488 0.415708 +v -0.718824 4.35721 1.35634 +vn -0.881369 -0.177 0.438017 +v -0.758603 4.43309 1.29992 +vn -0.914917 -0.196221 0.352738 +v -0.7486 4.39486 1.30633 +vn -0.909885 -0.175941 0.375706 +v -0.72399 4.3542 1.3443 +vn -0.888431 -0.183142 0.420891 +v -0.728432 4.35116 1.33349 +vn -0.892786 -0.183924 0.411224 +v -0.767141 4.43041 1.27518 +vn -0.933015 -0.194521 0.302728 +v -0.755324 4.39033 1.2871 +vn -0.9194 -0.165915 0.356617 +v -0.719674 4.39736 1.36857 +vn -0.871615 -0.150974 0.466363 +v -0.663204 4.33102 1.44861 +vn -0.848955 -0.203783 0.487594 +v -0.692222 4.36249 1.40835 +vn -0.86516 -0.158075 0.47593 +v -0.744024 4.43294 1.33303 +vn -0.887167 -0.184576 0.422926 +v -0.639847 4.29381 1.47057 +vn -0.819193 -0.270631 0.50565 +v -0.519726 4.20378 1.56764 +vn -0.610281 -0.577076 0.542715 +v -0.558543 4.23496 1.55024 +vn -0.703638 -0.461852 0.539988 +v -0.629341 4.29673 1.4888 +vn -0.809058 -0.27493 0.51946 +v -0.590779 4.26942 1.53153 +vn -0.771719 -0.362645 0.522435 +v -0.548005 4.24026 1.56814 +vn -0.687207 -0.464704 0.558388 +v -0.280701 4.14322 1.66202 +vn -0.220073 -0.825408 0.519874 +v -0.216587 4.12677 1.6582 +vn -0.152864 -0.83988 0.520802 +v -0.21253 4.13624 1.67469 +vn -0.150592 -0.842365 0.517439 +v -0.290141 4.12591 1.63079 +vn -0.223652 -0.820868 0.525505 +v -0.222873 4.11038 1.6301 +vn -0.155356 -0.836811 0.524988 +v -0.21991 4.11823 1.64348 +vn -0.153989 -0.838195 0.523179 +v -0.142568 4.13201 1.684 +vn -0.0932917 -0.851287 0.51634 +v -0.063955 4.12139 1.67607 +vn -0.0336164 -0.854782 0.517898 +v -0.079231 4.13273 1.69354 +vn -0.0513734 -0.856163 0.514146 +v -0.147725 4.11348 1.65281 +vn -0.096125 -0.847605 0.521849 +v -0.066011 4.10382 1.64726 +vn -0.0332397 -0.852766 0.521234 +v -0.08233 4.1134 1.6615 +vn -0.0547416 -0.852723 0.519488 +v -0.346312 4.15309 1.64494 +vn -0.302905 -0.793661 0.52759 +v -0.408376 4.16618 1.6238 +vn -0.395361 -0.745815 0.536143 +v -0.352406 4.14437 1.6284 +vn -0.30337 -0.792712 0.528749 +v -0.466459 4.183 1.59795 +vn -0.502936 -0.674826 0.54006 +v -0.474072 4.17544 1.58145 +vn -0.503582 -0.674773 0.539524 +v -0.357464 4.13654 1.61373 +vn -0.304534 -0.791094 0.530499 +v -0.421072 4.15069 1.59274 +vn -0.399138 -0.743836 0.536094 +v -0.361946 4.12931 1.60047 +vn -0.305917 -0.789371 0.532266 +v -0.480314 4.16859 1.56699 +vn -0.504568 -0.67335 0.540381 +v -0.534354 4.19072 1.53699 +vn -0.614427 -0.575809 0.539373 +v -0.485815 4.16222 1.55401 +vn -0.505825 -0.671332 0.541714 +v -0.339478 4.16223 1.66276 +vn -0.303172 -0.796692 0.522846 +v -0.268081 4.16298 1.69897 +vn -0.212923 -0.831031 0.513859 +v -0.322057 4.18161 1.70277 +vn -0.289397 -0.805203 0.517588 +v -0.331181 4.17185 1.68232 +vn -0.297023 -0.803077 0.516571 +v -0.457943 4.19076 1.61569 +vn -0.50132 -0.671545 0.545624 +v -0.393398 4.18524 1.66111 +vn -0.401713 -0.748287 0.527913 +v -0.44834 4.198 1.6331 +vn -0.48297 -0.66886 0.565125 +v -0.20802 4.14621 1.69232 +vn -0.148362 -0.844691 0.514282 +v -0.06118 4.14206 1.71051 +vn -0.0329903 -0.858715 0.511391 +v -0.202731 4.15689 1.71144 +vn -0.146003 -0.847422 0.51045 +v -0.135681 4.15322 1.7205 +vn -0.0890105 -0.85671 0.508061 +v -0.196896 4.16789 1.73149 +vn -0.144283 -0.850963 0.505019 +v -0.075122 4.15463 1.73058 +vn -0.0473264 -0.861276 0.505928 +v -0.057548 4.1649 1.74939 +vn -0.0312369 -0.8643 0.502006 +v -0.665503 4.73289 1.38246 +vn -0.507352 0.8137 0.283702 +v -0.662242 4.74414 1.35379 +vn -0.484893 0.833652 0.26439 +v -0.725619 4.71267 1.32494 +vn -0.608963 0.746662 0.267694 +v -0.66117 4.75224 1.32956 +vn -0.481556 0.838643 0.254522 +v -0.724056 4.72356 1.29455 +vn -0.586803 0.777576 0.225913 +v -0.721348 4.73156 1.27169 +vn -0.57737 0.79209 0.198084 +v -0.593385 4.7619 1.41264 +vn -0.444092 0.854211 0.270381 +v -0.588 4.75311 1.44868 +vn -0.450828 0.849136 0.275178 +v -0.591354 4.7713 1.38625 +vn -0.445027 0.853657 0.270595 +v -0.516489 4.79516 1.43242 +vn -0.4518 0.850937 0.267923 +v -0.659363 4.72253 1.42122 +vn -0.532564 0.786925 0.311648 +v -0.626614 4.74345 1.4165 +vn -0.46274 0.839191 0.285709 +v -0.622215 4.73223 1.45585 +vn -0.483816 0.821895 0.300685 +v -0.583266 4.7427 1.4886 +vn -0.469668 0.839045 0.274619 +v -0.723808 4.69868 1.36369 +vn -0.638854 0.700825 0.317349 +v -0.116787 4.9562 1.55061 +vn -0.188704 0.955502 0.22673 +v -0.171632 4.95303 1.50589 +vn -0.296961 0.92777 0.225959 +v -0.177168 4.94118 1.54866 +vn -0.298259 0.931576 0.207867 +v -0.112319 4.96805 1.50688 +vn -0.188685 0.95078 0.245797 +v -0.166933 4.96324 1.47117 +vn -0.295879 0.925354 0.237016 +v -0.229439 4.93897 1.47232 +vn -0.390971 0.894462 0.216979 +v -0.057669 4.96444 1.55072 +vn -0.087722 0.96712 0.238711 +v -0.055245 4.97613 1.5066 +vn -0.0876238 0.96219 0.257898 +v -0.108603 4.97824 1.4714 +vn -0.188511 0.947779 0.257252 +v -0.053275 4.98615 1.47095 +vn -0.0874781 0.95907 0.269317 +v -0.06099 4.95229 1.6014 +vn -0.0877831 0.973778 0.20988 +v -0.12223 4.94409 1.59982 +vn -0.190155 0.961667 0.197581 +v -0.183016 4.92905 1.59744 +vn -0.298642 0.937284 0.179756 +v -0.269341 5.54722 0.211712 +vn -0.300687 0.924174 -0.235563 +v -0.341653 5.5247 0.227049 +vn -0.366808 0.907518 -0.204603 +v -0.322791 5.5386 0.256557 +vn -0.353522 0.914706 -0.195793 +v -0.290259 5.51776 0.130393 +vn -0.30712 0.911691 -0.272942 +v -0.367679 5.49203 0.142096 +vn -0.373246 0.889572 -0.263342 +v -0.349365 5.51076 0.182482 +vn -0.363319 0.901007 -0.237036 +v -0.373592 5.52562 0.29944 +vn -0.401865 0.902473 -0.15507 +v -0.433075 5.50283 0.339027 +vn -0.459556 0.88332 -0.092487 +v -0.399586 5.52238 0.363058 +vn -0.44653 0.889322 -0.0985762 +v -0.496121 5.45901 0.262628 +vn -0.475228 0.867078 -0.149445 +v -0.526115 5.45026 0.336484 +vn -0.521133 0.851981 -0.0504741 +v -0.461671 5.48333 0.30155 +vn -0.468816 0.875175 -0.119499 +v -0.204215 5.55758 0.178797 +vn -0.24181 0.933043 -0.26638 +v -0.138319 5.56429 0.152553 +vn -0.170378 0.94147 -0.290872 +v -0.212241 5.54377 0.139213 +vn -0.241685 0.928772 -0.281017 +v -0.070214 5.56831 0.134951 +vn -0.089204 0.948203 -0.304882 +v -0.072573 5.55471 0.094557 +vn -0.0892056 0.943594 -0.318861 +v -0.22269 5.52802 0.097034 +vn -0.240687 0.924339 -0.296086 +v -0.149246 5.5353 0.069455 +vn -0.169982 0.931994 -0.320145 +v -0.225237 5.51293 0.054656 +vn -0.246811 0.91371 -0.322829 +v -0.074587 5.54007 0.052725 +vn -0.0890558 0.93801 -0.334973 +v -0.079021 5.52424 0.010986 +vn -0.0998599 0.931436 -0.349934 +v -0.195 5.57021 0.216167 +vn -0.24039 0.936916 -0.253774 +v -0.24035 5.57409 0.284074 +vn -0.30324 0.927601 -0.218179 +v -0.175264 5.59375 0.286256 +vn -0.243541 0.938258 -0.245683 +v -0.185337 5.58228 0.252128 +vn -0.241909 0.938313 -0.24708 +v -0.067402 5.58058 0.173511 +vn -0.0888534 0.951812 -0.293528 +v -0.126275 5.58851 0.227459 +vn -0.171384 0.946521 -0.27336 +v -0.060958 5.60332 0.246791 +vn -0.0902569 0.953859 -0.286368 +v -0.064342 5.59227 0.210886 +vn -0.0899155 0.953386 -0.288044 +v -0.306082 5.552 0.29034 +vn -0.35386 0.916721 -0.185486 +v -0.439154 5.50514 0.418953 +vn -0.506318 0.861881 -0.0283522 +v -0.387938 5.53227 0.402739 +vn -0.461133 0.883798 -0.0791005 +v -0.290036 5.56477 0.323446 +vn -0.356526 0.916964 -0.179071 +v -0.336252 5.55243 0.363543 +vn -0.406282 0.903204 -0.138409 +v -0.274088 5.57695 0.354419 +vn -0.360244 0.91574 -0.17789 +v -0.358239 5.54929 0.421439 +vn -0.45391 0.886403 -0.0908552 +v -0.394872 5.53259 0.471144 +vn -0.510566 0.859498 -0.024181 +v -0.347999 5.55795 0.456353 +vn -0.470749 0.878784 -0.078322 +v -0.133732 5.56075 0.978461 +vn -0.251948 0.613474 0.748446 +v -0.138621 5.52399 1.0007 +vn -0.295866 0.444143 0.845695 +v -0.069503 5.55591 0.996513 +vn -0.117306 0.599604 0.791653 +v -0.126575 5.49054 1.01924 +vn -0.266396 0.33433 0.904022 +v -0.069862 5.51832 1.01936 +vn -0.132556 0.4479 0.884202 +v -0.054431 5.48667 1.03462 +vn -0.099327 0.331089 0.938357 +v -0.190264 5.53408 0.971798 +vn -0.453904 0.472923 0.755192 +v -0.190174 5.56524 0.947658 +vn -0.434965 0.623098 0.650042 +v -0.202623 5.50024 0.981337 +vn -0.494036 0.355328 0.793518 +v -0.126757 5.59705 0.943681 +vn -0.206845 0.772744 0.600068 +v -0.119238 5.62876 0.89327 +vn -0.154407 0.892195 0.424437 +v -0.178122 5.59895 0.916359 +vn -0.359643 0.766588 0.531977 +v -0.165877 5.62693 0.873318 +vn -0.27853 0.881237 0.381893 +v -0.066191 5.59412 0.960737 +vn -0.0931029 0.766573 0.635373 +v -0.062655 5.62823 0.907303 +vn -0.0658306 0.893718 0.443773 +v -0.420117 5.48072 0.693147 +vn -0.676964 0.686034 0.266601 +v -0.411032 5.46456 0.748402 +vn -0.682568 0.651307 0.331511 +v -0.397389 5.47544 0.756185 +vn -0.700825 0.630474 0.333685 +v -0.453216 5.45688 0.672321 +vn -0.636782 0.726024 0.259611 +v -0.44103 5.44018 0.739159 +vn -0.618473 0.719925 0.314959 +v -0.424996 5.45262 0.744086 +vn -0.653924 0.684339 0.32259 +v -0.370297 5.4701 0.815372 +vn -0.699118 0.584567 0.411723 +v -0.351154 5.45488 0.864455 +vn -0.667642 0.584915 0.460574 +v -0.339245 5.46498 0.869413 +vn -0.682132 0.552152 0.4794 +v -0.336628 5.43946 0.903795 +vn -0.584852 0.643413 0.493931 +v -0.365493 5.44777 0.85331 +vn -0.637721 0.633588 0.438039 +v -0.376092 5.43332 0.860489 +vn -0.592669 0.692113 0.411975 +v -0.436914 5.48668 0.626234 +vn -0.650206 0.734918 0.192686 +v -0.446611 5.4929 0.557956 +vn -0.604891 0.787173 0.120275 +v -0.455434 5.47428 0.611509 +vn -0.638461 0.744347 0.195745 +v -0.446636 5.49978 0.489783 +vn -0.556598 0.829544 0.0453275 +v -0.470134 5.48536 0.466817 +vn -0.555271 0.83051 0.0439006 +v -0.475498 5.46102 0.597826 +vn -0.617448 0.763076 0.190978 +v -0.491057 5.46472 0.522157 +vn -0.587866 0.799885 0.120817 +v -0.496849 5.44696 0.585809 +vn -0.598634 0.778544 0.188432 +v -0.495749 5.46928 0.445481 +vn -0.555149 0.830645 0.0428807 +v -0.484629 5.47673 0.371838 +vn -0.509829 0.859512 -0.0362447 +v -0.525865 5.45067 0.413953 +vn -0.551507 0.83357 0.0316456 +v -0.419276 5.49858 0.641339 +vn -0.653622 0.731759 0.193151 +v -0.388285 5.50499 0.71383 +vn -0.68931 0.679921 0.250119 +v -0.37212 5.53983 0.633489 +vn -0.627846 0.768819 0.121356 +v -0.403349 5.50908 0.65495 +vn -0.641284 0.740961 0.199328 +v -0.424698 5.5133 0.512712 +vn -0.559516 0.827577 0.0453645 +v -0.407164 5.51808 0.595468 +vn -0.612054 0.782215 0.116317 +v -0.383844 5.53896 0.555134 +vn -0.567137 0.822618 0.0406824 +v -0.403986 5.52616 0.534671 +vn -0.563654 0.824889 0.0430397 +v -0.384 5.48605 0.76513 +vn -0.712945 0.613763 0.339122 +v -0.305428 5.4606 0.916151 +vn -0.626484 0.532882 0.568819 +v -0.328862 5.47526 0.873326 +vn -0.703571 0.502439 0.502536 +v -0.371712 5.49589 0.773139 +vn -0.69754 0.627048 0.34677 +v -0.358102 5.52522 0.743486 +vn -0.70438 0.658691 0.264528 +v -0.347013 5.49263 0.825432 +vn -0.726098 0.552187 0.409721 +v -0.319948 5.48465 0.876743 +vn -0.680737 0.519162 0.516785 +v -0.321545 5.51253 0.844975 +vn -0.725238 0.532977 0.435851 +v -0.117975 5.66681 0.749178 +vn -0.158193 0.979363 0.125789 +v -0.060466 5.67207 0.750375 +vn -0.0531978 0.989641 0.133341 +v -0.086133 5.67501 0.706193 +vn -0.090402 0.993217 0.0731258 +v -0.026808 5.67821 0.703081 +vn -0.0356683 0.996219 0.0792132 +v -0.114731 5.67311 0.665388 +vn -0.156568 0.987617 0.00999211 +v -0.059343 5.67918 0.657484 +vn -0.0767483 0.996877 0.0186123 +v -0.119257 5.67022 0.593228 +vn -0.185981 0.980051 -0.0700795 +v -0.029582 5.68121 0.609856 +vn -0.043769 0.998834 -0.0203754 +v -0.116863 5.65159 0.830018 +vn -0.145892 0.952347 0.267862 +v -0.087935 5.66371 0.792456 +vn -0.0817693 0.978149 0.191151 +v -0.064151 5.65497 0.83528 +vn -0.0558008 0.957233 0.283885 +v -0.027717 5.66527 0.797623 +vn -0.0305548 0.978772 0.20266 +v -0.16166 5.64638 0.814897 +vn -0.250924 0.941182 0.226306 +v -0.172459 5.65551 0.747358 +vn -0.273344 0.953816 0.124572 +v -0.160981 5.66367 0.680508 +vn -0.242031 0.969811 0.0297995 +v -0.168091 5.66071 0.618115 +vn -0.280092 0.957841 -0.0639492 +v -0.199216 5.65119 0.693816 +vn -0.372037 0.927233 0.0427413 +v -0.152398 5.64338 0.4606 +vn -0.262035 0.948341 -0.178851 +v -0.208815 5.62433 0.458006 +vn -0.343213 0.923746 -0.169994 +v -0.21593 5.63059 0.512345 +vn -0.367995 0.920684 -0.130076 +v -0.185424 5.62129 0.405634 +vn -0.305193 0.927528 -0.215753 +v -0.241095 5.60152 0.410642 +vn -0.37148 0.908837 -0.189785 +v -0.22423 5.61385 0.436095 +vn -0.367002 0.910973 -0.188251 +v -0.267652 5.60881 0.527097 +vn -0.4463 0.890037 -0.0930034 +v -0.258036 5.60567 0.47129 +vn -0.416254 0.897753 -0.144128 +v -0.306919 5.58364 0.491703 +vn -0.475426 0.874411 -0.0968312 +v -0.286395 5.59711 0.511302 +vn -0.471787 0.876109 -0.0992468 +v -0.079862 5.65166 0.424509 +vn -0.15031 0.963516 -0.221459 +v -0.13276 5.63711 0.407591 +vn -0.226687 0.948405 -0.221678 +v -0.045699 5.64435 0.379883 +vn -0.0817211 0.962821 -0.257484 +v -0.142826 5.62774 0.380785 +vn -0.241564 0.937998 -0.24861 +v -0.096122 5.63259 0.36172 +vn -0.164927 0.95006 -0.264925 +v -0.153847 5.61653 0.350476 +vn -0.246934 0.935264 -0.253582 +v -0.049199 5.63488 0.348827 +vn -0.0853852 0.955889 -0.281043 +v -0.053603 5.62426 0.313942 +vn -0.089097 0.954297 -0.285269 +v -0.071374 5.6667 0.492311 +vn -0.145862 0.976399 -0.159277 +v -0.135279 5.65932 0.526159 +vn -0.238008 0.961612 -0.136582 +v -0.062181 5.67693 0.56813 +vn -0.114955 0.990678 -0.0730867 +v -0.038467 5.66281 0.451385 +vn -0.0756542 0.974707 -0.210291 +v -0.033057 5.6756 0.525775 +vn -0.0621289 0.990597 -0.12189 +v -0.189228 5.64842 0.56586 +vn -0.339422 0.934132 -0.110409 +v -0.178001 5.4495 1.01504 +vn -0.372969 0.43316 0.820528 +v -0.16249 5.42827 1.0337 +vn -0.272571 0.558552 0.783406 +v -0.099549 5.44545 1.04126 +vn -0.192498 0.411312 0.890936 +v -0.081095 5.42561 1.05546 +vn -0.116347 0.563602 0.817812 +v -0.242457 5.45617 0.975396 +vn -0.501708 0.498026 0.70729 +v -0.244118 5.43278 0.992024 +vn -0.415627 0.583354 0.69782 +v -0.274598 5.45981 0.947363 +vn -0.56642 0.51145 0.646209 +v -0.271919 5.44803 0.958968 +vn -0.524127 0.545512 0.653994 +v -0.289065 5.42089 0.973388 +vn -0.457053 0.651268 0.605766 +v -0.333481 5.40414 0.955344 +vn -0.486576 0.678603 0.55022 +v -0.282286 5.40772 0.991512 +vn -0.439432 0.623764 0.646388 +v -0.222778 5.4742 0.978726 +vn -0.519082 0.378061 0.766566 +v -0.151473 5.46783 1.0185 +vn -0.331907 0.320985 0.887021 +v -0.286059 5.48154 0.920338 +vn -0.643997 0.458081 0.612722 +v -0.074783 5.46402 1.03897 +vn -0.137003 0.292049 0.94654 +v -0.496926 4.39173 1.79046 +vn -0.822915 0.391527 0.411724 +v -0.493073 4.37068 1.80854 +vn -0.8883 0.0115168 0.459118 +v -0.460574 4.39478 1.85666 +vn -0.78274 0.431125 0.44883 +v -0.45818 4.37417 1.87184 +vn -0.857923 0.0651666 0.509629 +v -0.417887 4.39614 1.92297 +vn -0.723663 0.444342 0.528083 +v -0.42475 4.37317 1.92358 +vn -0.804883 0.0592942 0.590464 +v -0.527658 4.37011 1.73729 +vn -0.904134 0.00462529 0.427223 +v -0.531269 4.391 1.7187 +vn -0.831989 0.394281 0.390302 +v -0.563301 4.37498 1.65933 +vn -0.902878 0.0896733 0.420439 +v -0.491832 4.41027 1.77292 +vn -0.641433 0.702363 0.308626 +v -0.48229 4.42239 1.75113 +vn -0.370022 0.917158 0.148004 +v -0.524776 4.40842 1.70493 +vn -0.642991 0.709159 0.289233 +v -0.56692 4.39551 1.63543 +vn -0.767904 0.526505 0.364851 +v -0.513348 4.41906 1.69091 +vn -0.351497 0.928027 0.123353 +v -0.551552 4.40994 1.63687 +vn -0.537748 0.815422 0.214277 +v -0.455824 4.41359 1.83706 +vn -0.600246 0.730134 0.326512 +v -0.415859 4.41685 1.89726 +vn -0.545405 0.756724 0.36042 +v -0.447217 4.4263 1.80956 +vn -0.350809 0.922874 0.158859 +v -0.408234 4.43012 1.86485 +vn -0.317183 0.932107 0.174848 +v -0.316063 4.39903 2.03221 +vn -0.592215 0.402148 0.698253 +v -0.283473 4.37381 2.06213 +vn -0.588309 -0.159285 0.792793 +v -0.26259 4.39735 2.07501 +vn -0.530533 0.359042 0.76787 +v -0.337367 4.3763 2.01836 +vn -0.666038 -0.0638104 0.743183 +v -0.226598 4.37075 2.10001 +vn -0.505478 -0.244808 0.827382 +v -0.207306 4.39477 2.11133 +vn -0.457615 0.321259 0.829085 +v -0.366348 4.39955 1.98336 +vn -0.649493 0.445299 0.616334 +v -0.385718 4.37774 1.97029 +vn -0.735456 0.0403243 0.676372 +v -0.322574 4.42021 2.00267 +vn -0.424265 0.78506 0.451309 +v -0.318362 4.43548 1.96254 +vn -0.243033 0.943343 0.225919 +v -0.371118 4.41917 1.95288 +vn -0.485519 0.776182 0.402259 +v -0.365139 4.43328 1.91607 +vn -0.279945 0.939285 0.198428 +v -0.271345 4.41987 2.04624 +vn -0.370167 0.78382 0.498601 +v -0.218042 4.4185 2.08357 +vn -0.31166 0.782313 0.539309 +v -0.268675 4.43664 2.00369 +vn -0.205559 0.945041 0.25425 +v -0.216883 4.43674 2.03902 +vn -0.165642 0.945786 0.279378 +v -0.095615 4.38847 2.16125 +vn -0.260548 0.260977 0.929519 +v -0.054654 4.36163 2.16779 +vn -0.177198 -0.421019 0.889575 +v -0.040728 4.38635 2.17404 +vn -0.151525 0.23898 0.959129 +v -0.111778 4.36351 2.15311 +vn -0.300597 -0.38465 0.872746 +v -0.151529 4.39157 2.14032 +vn -0.366644 0.288214 0.884593 +v -0.169152 4.36709 2.13057 +vn -0.411107 -0.321868 0.852873 +v -0.108696 4.41385 2.13689 +vn -0.174167 0.780201 0.600793 +v -0.109746 4.43452 2.08997 +vn -0.0830371 0.945533 0.314757 +v -0.163653 4.41632 2.11403 +vn -0.245639 0.781437 0.5736 +v -0.16371 4.43591 2.06794 +vn -0.123466 0.946105 0.2994 +v -0.053467 4.4111 2.15277 +vn -0.105462 0.773359 0.625135 +v -0.055087 4.43269 2.106 +vn -0.0446704 0.944 0.326909 +v -0.628627 4.41191 1.49145 +vn -0.331042 0.898119 0.289471 +v -0.65248 4.42045 1.44746 +vn -0.113672 0.938896 0.324888 +v -0.642606 4.4052 1.48958 +vn -0.633877 0.611779 0.473208 +v -0.677518 4.4326 1.41483 +vn -0.719179 -0.0192329 0.694558 +v -0.674893 4.42471 1.42769 +vn -0.421477 0.696175 0.581117 +v -0.654555 4.39607 1.47867 +vn -0.831805 0.166655 0.529459 +v -0.707279 4.44376 1.38965 +vn -0.78847 -0.298198 0.537953 +v -0.608824 4.41216 1.51119 +vn -0.152412 0.975268 0.160071 +v -0.630493 4.41737 1.4666 +vn 0.129203 0.989606 0.0631342 +v -0.611497 4.41345 1.48642 +vn 0.716249 0.503089 -0.483621 +v -0.649732 4.42271 1.43977 +vn -0.840062 0.0553223 0.539663 +v -0.629142 4.41639 1.46149 +vn 0.671545 -0.0989089 -0.734333 +v -0.60448 4.40236 1.55018 +vn -0.591435 0.721398 0.360263 +v -0.582767 4.40819 1.57144 +vn -0.404832 0.890568 0.207362 +v -0.590232 4.41181 1.52665 +vn 0.207384 0.972384 -0.107054 +v -0.566296 4.41252 1.5782 +vn -0.107083 0.99425 -0.000657284 +v -0.602201 4.38539 1.57527 +vn -0.857611 0.261092 0.443097 +v -0.13553 4.78494 2.07913 +vn 0.142002 -0.763062 0.630534 +v -0.208163 4.7869 2.10093 +vn 0.178522 -0.693338 0.698149 +v -0.200372 4.75891 2.06684 +vn 0.224304 -0.743077 0.630495 +v -0.140846 4.81329 2.11329 +vn 0.115082 -0.715931 0.688621 +v -0.272426 4.74727 2.08204 +vn 0.230171 -0.668361 0.70733 +v -0.262352 4.72027 2.04849 +vn 0.300427 -0.717918 0.627963 +v -0.068647 4.80074 2.08755 +vn 0.066082 -0.774219 0.629459 +v -0.071348 4.82886 2.12122 +vn 0.052137 -0.728883 0.682651 +v -0.066076 4.76661 2.04369 +vn 0.069861 -0.785479 0.614933 +v -0.130306 4.75106 2.03501 +vn 0.1486 -0.775795 0.613237 +v -0.066349 4.72599 1.99192 +vn 0.0744038 -0.777874 0.624 +v -0.192464 4.72593 2.02268 +vn 0.235265 -0.759643 0.606294 +v -0.124857 4.70925 1.98094 +vn 0.139762 -0.767401 0.62575 +v -0.252018 4.68921 2.00492 +vn 0.32182 -0.737996 0.593121 +v -0.184431 4.68584 1.96884 +vn 0.219051 -0.75863 0.613594 +v -0.554901 4.43985 1.75677 +vn -0.282547 -0.875281 0.392492 +v -0.606195 4.43621 1.68911 +vn -0.489997 -0.814192 0.311439 +v -0.583066 4.42134 1.68059 +vn -0.372015 -0.881063 0.292118 +v -0.57527 4.45565 1.7721 +vn -0.410868 -0.810525 0.417417 +v -0.626812 4.45604 1.70203 +vn -0.602651 -0.721975 0.339947 +v -0.618174 4.41892 1.60862 +vn -0.47335 -0.85868 0.196491 +v -0.643925 4.43601 1.61089 +vn -0.577656 -0.786748 0.217579 +v -0.516585 4.46639 1.82895 +vn -0.125239 -0.864895 0.486078 +v -0.473372 4.50481 1.89307 +vn 0.0617569 -0.821139 0.567378 +v -0.535194 4.48294 1.84912 +vn -0.274524 -0.795827 0.539718 +v -0.490818 4.52299 1.91709 +vn -0.109833 -0.756715 0.644453 +v -0.5526 4.50122 1.86193 +vn -0.479912 -0.639034 0.601099 +v -0.496627 4.45167 1.80299 +vn -0.000456698 -0.89917 0.437599 +v -0.533198 4.42685 1.73803 +vn -0.153456 -0.92093 0.358245 +v -0.477126 4.43882 1.77179 +vn 0.0913865 -0.916646 0.389112 +v -0.455054 4.48753 1.86115 +vn 0.172726 -0.846583 0.503451 +v -0.43717 4.47086 1.82262 +vn 0.235113 -0.859851 0.453186 +v -0.592532 4.40681 1.60832 +vn -0.352164 -0.920528 0.169139 +v -0.559506 4.41013 1.67019 +vn -0.244394 -0.933362 0.262883 +v -0.512036 4.41675 1.71565 +vn -0.0391385 -0.948453 0.31449 +v -0.567884 4.39927 1.60784 +vn -0.20522 -0.971161 0.121372 +v -0.536979 4.40278 1.65796 +vn -0.115286 -0.969383 0.21681 +v -0.375428 4.61235 1.9896 +vn 0.31902 -0.714972 0.622127 +v -0.442093 4.57551 1.97426 +vn 0.0650498 -0.708223 0.702985 +v -0.426295 4.55509 1.94662 +vn 0.224083 -0.760046 0.610013 +v -0.389469 4.63526 2.02 +vn 0.189346 -0.668221 0.719465 +v -0.320776 4.66972 2.02313 +vn 0.34074 -0.702518 0.624792 +v -0.332924 4.69494 2.05548 +vn 0.242181 -0.655148 0.715632 +v -0.308185 4.6416 1.98091 +vn 0.378037 -0.723861 0.57716 +v -0.360756 4.58787 1.94967 +vn 0.378247 -0.735597 0.561983 +v -0.295603 4.60917 1.92982 +vn 0.370625 -0.737857 0.564096 +v -0.241591 4.6523 1.95205 +vn 0.306414 -0.745329 0.59211 +v -0.409713 4.53441 1.91008 +vn 0.310505 -0.780524 0.542558 +v -0.346251 4.56078 1.90139 +vn 0.386841 -0.752023 0.53368 +v -0.393463 4.51281 1.8659 +vn 0.343048 -0.795328 0.499772 +v -0.662071 4.42632 1.47532 +vn -0.482468 -0.875097 0.0378285 +v -0.644074 4.41888 1.45574 +vn -0.244879 -0.962607 -0.11585 +v -0.632719 4.41284 1.49243 +vn -0.331847 -0.943063 -0.0225645 +v -0.673319 4.43171 1.43236 +vn -0.451243 -0.891732 0.0345415 +v -0.618792 4.41117 1.4796 +vn 0.266177 -0.886986 -0.377366 +v -0.605727 4.4048 1.51155 +vn -0.0576942 -0.987963 -0.143531 +v -0.692341 4.44498 1.46028 +vn -0.603322 -0.792526 0.0889122 +v -0.705252 4.44968 1.40997 +vn -0.612185 -0.770676 0.176882 +v -0.671242 4.43846 1.52931 +vn -0.606672 -0.782197 0.141834 +v -0.643514 4.42086 1.5367 +vn -0.499818 -0.859023 0.110734 +v -0.615671 4.4079 1.54553 +vn -0.371096 -0.925803 0.0719411 +v -0.589346 4.40013 1.55583 +vn -0.185865 -0.982573 0.00196125 +v -0.559504 4.40375 1.55995 +vn 0.792696 -0.197156 -0.576856 +v -0.537777 4.40797 1.59042 +vn 0.592922 0.558908 -0.579712 +v -0.544215 4.39925 1.5828 +vn 0.569051 -0.683936 -0.456521 +v -0.513855 4.41187 1.61979 +vn 0.317314 0.850109 -0.42027 +v -0.52463 4.40329 1.60058 +vn 0.708304 -0.139659 -0.691954 +v -0.526076 4.39725 1.60956 +vn 0.212493 -0.95591 -0.202691 +v -0.507246 4.4066 1.61725 +vn 0.554437 0.430373 -0.712305 +v -0.509725 4.40056 1.61535 +vn 0.542201 -0.633483 -0.552012 +v -0.574219 4.40865 1.5418 +vn 0.692113 0.529378 -0.490652 +v -0.551418 4.41192 1.58364 +vn 0.275767 0.922086 -0.271496 +v -0.524817 4.41627 1.62543 +vn 0.0995376 0.97577 -0.194845 +v -0.537726 4.41648 1.63209 +vn -0.211582 0.977122 0.0215987 +v -0.581616 4.40212 1.53358 +vn 0.475236 -0.78769 -0.39204 +v -0.59615 4.40809 1.50704 +vn 0.781983 -0.245289 -0.573007 +v -0.565561 4.3976 1.56794 +vn 0.121539 -0.978903 -0.16425 +v -0.545416 4.39637 1.60773 +vn -0.0314925 -0.999172 0.0257605 +v -0.478982 4.40547 1.6664 +vn 0.128136 -0.979563 0.155041 +v -0.490254 4.40178 1.63559 +vn 0.346818 -0.910777 -0.22406 +v -0.468376 4.40638 1.65505 +vn 0.365351 -0.919658 -0.144044 +v -0.505175 4.3989 1.63351 +vn 0.131728 -0.991271 -0.00550636 +v -0.48057 4.40593 1.63892 +vn 0.680993 -0.166206 -0.713179 +v -0.459166 4.41092 1.65873 +vn 0.744275 0.00631949 -0.667843 +v -0.496384 4.40454 1.62507 +vn 0.688564 -0.0737853 -0.721412 +v -0.517188 4.3993 1.64516 +vn 0.00347724 -0.989603 0.143785 +v -0.492908 4.40981 1.69144 +vn 0.0515372 -0.964828 0.25778 +v -0.445532 4.42017 1.70688 +vn 0.159015 -0.946312 0.281439 +v -0.40774 4.44152 1.74265 +vn 0.201431 -0.894225 0.399734 +v -0.459446 4.42816 1.73802 +vn 0.142617 -0.928773 0.342112 +v -0.420975 4.45512 1.78073 +vn 0.245973 -0.874062 0.418943 +v -0.442603 4.41444 1.68123 +vn 0.249276 -0.965468 0.0757221 +v -0.401957 4.43017 1.71325 +vn 0.00280472 -0.878478 0.477774 +v -0.428747 4.41887 1.68582 +vn 0.896819 -0.0018221 -0.442394 +v -0.463783 4.42305 1.69432 +vn 0.0378462 0.985954 -0.162671 +v -0.501792 4.42154 1.67301 +vn -0.0574094 0.996247 -0.0647836 +v -0.472174 4.42601 1.72339 +vn -0.113966 0.993232 -0.0224034 +v -0.492088 4.41801 1.65474 +vn 0.142711 0.959901 -0.241295 +v -0.458796 4.41697 1.67085 +vn 0.154556 0.929869 -0.333851 +v -0.486653 4.41112 1.63937 +vn 0.369605 0.787441 -0.493284 +v -0.42753 4.42323 1.70258 +vn -0.0238629 0.979172 -0.201625 +v -0.431127 4.42835 1.73451 +vn -0.0490567 0.992964 -0.107775 +v -0.392182 4.43121 1.734 +vn -0.179523 0.980682 -0.0776771 +v -0.398761 4.42763 1.71063 +vn -0.547522 0.333244 0.767573 +v -0.438287 4.43057 1.77322 +vn -0.143653 0.989623 0.00308253 +v -0.394248 4.43441 1.77377 +vn -0.122379 0.991177 -0.0509045 +v -0.40036 4.43523 1.82104 +vn -0.160168 0.986612 0.0307245 +v -0.321317 4.50212 1.80077 +vn 0.223655 -0.769332 0.598421 +v -0.366241 4.46971 1.77411 +vn 0.228607 -0.829061 0.51029 +v -0.3143 4.47649 1.76893 +vn -0.0782442 -0.586713 0.806006 +v -0.358744 4.45235 1.74451 +vn -0.0445596 -0.728371 0.683733 +v -0.320685 4.45615 1.75892 +vn -0.497249 0.37595 0.781924 +v -0.363751 4.4397 1.73394 +vn -0.539459 0.370511 0.756112 +v -0.378632 4.49059 1.81772 +vn 0.320763 -0.813783 0.484632 +v -0.332776 4.53131 1.84859 +vn 0.34232 -0.769295 0.539446 +v -0.273216 4.53511 1.82299 +vn 0.188791 -0.721461 0.666222 +v -0.22236 4.56484 1.84096 +vn 0.136147 -0.686496 0.714274 +v -0.283632 4.57257 1.87376 +vn 0.314845 -0.745989 0.586833 +v -0.231422 4.60955 1.89379 +vn 0.250754 -0.738834 0.625497 +v -0.266894 4.50109 1.78962 +vn -0.0946411 -0.4826 0.870713 +v -0.274216 4.47329 1.7811 +vn -0.446538 0.385433 0.807494 +v -0.216983 4.52338 1.80671 +vn -0.100731 -0.408644 0.907118 +v -0.225212 4.48909 1.80005 +vn -0.37987 0.397788 0.835143 +v -0.114047 4.60483 1.86494 +vn 0.0484912 -0.642018 0.765155 +v -0.055383 4.61884 1.8736 +vn 0.0393318 -0.634991 0.771518 +v -0.119142 4.659 1.92033 +vn 0.110252 -0.735043 0.668996 +v -0.029253 4.64954 1.90098 +vn 0.0338278 -0.710891 0.702488 +v -0.060381 4.67672 1.93241 +vn 0.0682509 -0.741494 0.667479 +v -0.031066 4.70503 1.96307 +vn 0.0316156 -0.768223 0.639402 +v -0.056334 4.56195 1.8362 +vn -0.041067 -0.297038 0.953982 +v -0.111783 4.55348 1.82981 +vn -0.073364 -0.31944 0.944762 +v -0.068287 4.51641 1.83456 +vn -0.118291 0.441589 0.889385 +v -0.169175 4.58827 1.85488 +vn 0.0829754 -0.661601 0.745251 +v -0.165139 4.54104 1.82012 +vn -0.0949167 -0.35601 0.929649 +v -0.122289 4.51085 1.82696 +vn -0.211266 0.430246 0.877641 +v -0.174406 4.5018 1.81541 +vn -0.299789 0.414097 0.859447 +v -0.176438 4.63852 1.90913 +vn 0.172952 -0.737525 0.652797 +v -0.106844 4.46504 1.93934 +vn -0.0768713 0.972443 0.220101 +v -0.054139 4.48608 1.87866 +vn -0.0748565 0.896603 0.436463 +v -0.10805 4.48413 1.86911 +vn -0.142876 0.895821 0.420823 +v -0.051612 4.46444 1.95518 +vn -0.0305628 0.974373 0.222852 +v -0.108341 4.45029 2.01959 +vn -0.0559349 0.978854 0.196763 +v -0.057096 4.44893 2.03735 +vn -0.0286432 0.978106 0.206128 +v -0.027064 4.45643 1.99945 +vn -0.00871396 0.982967 0.183573 +v -0.161498 4.45027 1.99991 +vn -0.0877381 0.979175 0.183079 +v -0.159401 4.46312 1.92307 +vn -0.121361 0.972552 0.19853 +v -0.213639 4.44928 1.97431 +vn -0.119357 0.979726 0.160909 +v -0.160193 4.47957 1.85611 +vn -0.213845 0.895908 0.389383 +v -0.210792 4.45963 1.90169 +vn -0.160447 0.972825 0.16694 +v -0.211214 4.47258 1.83871 +vn -0.277467 0.898722 0.339576 +v -0.308384 4.44815 1.84499 +vn -0.192959 0.97867 0.0705075 +v -0.358367 4.43978 1.86577 +vn -0.165885 0.984096 0.063546 +v -0.312771 4.44385 1.90663 +vn -0.161113 0.981993 0.0986574 +v -0.353159 4.44121 1.81086 +vn -0.171955 0.98505 0.0104304 +v -0.307939 4.45235 1.7922 +vn -0.329116 0.928447 0.172249 +v -0.352118 4.44121 1.76416 +vn -0.286774 0.956529 0.0530341 +v -0.260699 4.46323 1.81724 +vn -0.321142 0.908438 0.267597 +v -0.260675 4.45451 1.87547 +vn -0.187376 0.974454 0.123812 +v -0.264282 4.4471 1.94301 +vn -0.145289 0.980522 0.132163 +v -0.592323 5.36252 0.646488 +vn -0.577405 0.786043 0.22077 +v -0.564869 5.36763 0.694815 +vn -0.560624 0.787412 0.256288 +v -0.556198 5.38183 0.668473 +vn -0.553454 0.798446 0.237008 +v -0.571621 5.39532 0.575661 +vn -0.573424 0.798798 0.181951 +v -0.545075 5.39801 0.63864 +vn -0.562809 0.796166 0.222184 +v -0.533535 5.41434 0.608568 +vn -0.566842 0.797785 0.205499 +v -0.64071 5.34508 0.573712 +vn -0.609606 0.772509 0.177796 +v -0.6376 5.36705 0.456658 +vn -0.6277 0.775419 0.0686857 +v -0.604152 5.38477 0.515142 +vn -0.58357 0.800005 0.139424 +v -0.591496 5.40219 0.456122 +vn -0.585165 0.806757 0.0820136 +v -0.503904 5.37659 0.787771 +vn -0.526821 0.793782 0.303923 +v -0.463462 5.38875 0.824264 +vn -0.524172 0.784147 0.332202 +v -0.495076 5.39167 0.762952 +vn -0.533681 0.793826 0.29159 +v -0.487186 5.35067 0.875796 +vn -0.518786 0.766882 0.377828 +v -0.464913 5.34396 0.91659 +vn -0.492881 0.737883 0.461082 +v -0.466084 5.36614 0.872312 +vn -0.506209 0.78051 0.366819 +v -0.471069 5.40864 0.761229 +vn -0.54321 0.783383 0.302049 +v -0.42347 5.42322 0.808349 +vn -0.570795 0.741802 0.352028 +v -0.465155 5.42734 0.723685 +vn -0.576417 0.762692 0.293334 +v -0.439927 5.37781 0.883162 +vn -0.496516 0.776877 0.387213 +v -0.406451 5.37541 0.92654 +vn -0.479655 0.735397 0.478667 +v -0.418243 5.39734 0.871617 +vn -0.50843 0.774067 0.377253 +v -0.540596 5.36689 0.746538 +vn -0.549231 0.786707 0.281847 +v -0.56196 5.3349 0.790956 +vn -0.564306 0.765092 0.310148 +v -0.525862 5.36099 0.789848 +vn -0.542094 0.782215 0.30704 +v -0.587022 5.30011 0.828 +vn -0.589473 0.734398 0.336426 +v -0.526648 5.32585 0.870503 +vn -0.541149 0.755655 0.368975 +v -0.503562 5.35864 0.833015 +vn -0.532108 0.778845 0.332057 +v -0.562828 5.29386 0.880755 +vn -0.577919 0.718185 0.387582 +v -0.536532 5.2961 0.912767 +vn -0.542882 0.700034 0.463931 +v -0.601721 5.33407 0.714789 +vn -0.582751 0.7668 0.269108 +v -0.642875 5.3224 0.652783 +vn -0.610945 0.757334 0.230635 +v -0.620183 5.30174 0.761804 +vn -0.608037 0.734499 0.301335 +v -0.853463 5.03517 0.74228 +vn -0.852623 0.463487 0.241276 +v -0.887984 4.9594 0.746226 +vn -0.901901 0.37016 0.222614 +v -0.853262 4.99547 0.808695 +vn -0.852556 0.42644 0.302155 +v -0.91131 4.94804 0.637109 +vn -0.940985 0.318063 0.115686 +v -0.930354 4.88776 0.627187 +vn -0.95803 0.270373 0.0952721 +v -0.910305 4.92755 0.69265 +vn -0.937852 0.311218 0.153546 +v -0.908389 4.89622 0.75636 +vn -0.929422 0.301476 0.212808 +v -0.89292 4.88417 0.823355 +vn -0.899617 0.308337 0.309222 +v -0.885289 4.93308 0.794545 +vn -0.895923 0.34672 0.277683 +v -0.838223 5.08593 0.690476 +vn -0.831962 0.506734 0.225963 +v -0.885063 5.00758 0.661226 +vn -0.903152 0.398976 0.158541 +v -0.872273 5.05911 0.588015 +vn -0.897383 0.430143 0.0983927 +v -0.856254 5.07667 0.637203 +vn -0.868216 0.464308 0.174981 +v -0.847765 5.10029 0.611266 +vn -0.856247 0.497094 0.140494 +v -0.916246 4.95735 0.533186 +vn -0.951002 0.306991 0.0367637 +v -0.903019 4.98391 0.597165 +vn -0.932769 0.348218 0.0931936 +v -0.89698 5.00924 0.553905 +vn -0.928614 0.365955 0.0612522 +v -0.888508 5.03463 0.458464 +vn -0.922274 0.385884 -0.0224708 +v -0.882962 5.0464 0.524189 +vn -0.911995 0.40814 0.0410648 +v -0.870617 5.07519 0.496249 +vn -0.899775 0.43569 0.024055 +v -0.802022 5.10462 0.765128 +vn -0.77705 0.559226 0.288893 +v -0.812429 5.06526 0.809704 +vn -0.790256 0.525946 0.314447 +v -0.761038 5.11894 0.832998 +vn -0.723999 0.591413 0.355043 +v -0.820592 5.13582 0.633467 +vn -0.810643 0.553426 0.191253 +v -0.744151 5.15733 0.801116 +vn -0.715599 0.612605 0.335608 +v -0.812609 5.03383 0.857107 +vn -0.794804 0.489736 0.358393 +v -0.772244 5.08449 0.865469 +vn -0.731188 0.568802 0.376601 +v -0.777013 5.05583 0.897518 +vn -0.737762 0.541548 0.403029 +v -0.425552 5.33199 0.968541 +vn -0.460492 0.686723 0.562458 +v -0.367337 5.3525 0.988985 +vn -0.438773 0.674158 0.594129 +v -0.474532 5.30234 0.963325 +vn -0.480562 0.663584 0.573338 +v -0.505479 5.31057 0.925485 +vn -0.508069 0.708996 0.489071 +v -0.530383 5.27196 0.948881 +vn -0.528228 0.63414 0.564661 +v -0.700546 5.09482 0.96724 +vn -0.646083 0.583998 0.49145 +v -0.743609 5.06607 0.940064 +vn -0.696422 0.558927 0.450107 +v -0.714584 5.06461 0.983293 +vn -0.65264 0.55418 0.516668 +v -0.73301 5.09531 0.918518 +vn -0.688032 0.585113 0.429248 +v -0.72491 5.04132 0.99438 +vn -0.661713 0.520382 0.539758 +v -0.679357 5.12844 0.953783 +vn -0.632126 0.604224 0.485109 +v -0.664447 5.16315 0.928894 +vn -0.632806 0.618337 0.466065 +v -0.719425 5.12779 0.894836 +vn -0.682878 0.601401 0.414723 +v -0.703115 5.16266 0.869963 +vn -0.679416 0.616389 0.398069 +v -0.666726 5.10607 0.994257 +vn -0.590258 0.588439 0.552571 +v -0.638435 5.15488 0.970552 +vn -0.581076 0.615678 0.532251 +v -0.681016 5.08152 1.00436 +vn -0.600151 0.562172 0.569018 +v -0.625694 5.23437 0.884532 +vn -0.633762 0.64366 0.429007 +v -0.683872 5.19904 0.845182 +vn -0.674738 0.633363 0.37892 +v -0.644924 5.19863 0.907814 +vn -0.631042 0.626345 0.457689 +v -0.662769 5.23529 0.819997 +vn -0.663698 0.659396 0.353132 +v -0.607377 5.26786 0.858089 +vn -0.622657 0.685311 0.377686 +v -0.6409 5.26976 0.793404 +vn -0.64043 0.695258 0.326293 +v -0.572838 5.26764 0.909628 +vn -0.589414 0.653336 0.475124 +v -0.587917 5.232 0.935306 +vn -0.580919 0.619351 0.528146 +v -0.611995 5.18936 0.95872 +vn -0.572125 0.620887 0.535885 +v -0.953623 4.58582 0.926545 +vn -0.913435 0.200394 0.35423 +v -0.962641 4.52966 0.930719 +vn -0.921568 0.148057 0.358876 +v -0.943642 4.54694 0.967621 +vn -0.8877 0.163012 0.430599 +v -0.990519 4.55952 0.815118 +vn -0.965007 0.175741 0.194618 +v -0.998684 4.497 0.822161 +vn -0.973326 0.116041 0.197916 +v -0.981995 4.5153 0.880308 +vn -0.950672 0.140399 0.276604 +v -0.960364 4.41674 0.965155 +vn -0.918177 0.0361347 0.394518 +v -0.945954 4.36303 0.998489 +vn -0.904994 -0.0194166 0.424982 +v -0.940189 4.42572 1.00598 +vn -0.880907 0.0708609 0.467954 +v -1.00111 4.43223 0.835935 +vn -0.975866 0.0409141 0.214503 +v -0.995059 4.36419 0.860532 +vn -0.966209 -0.0488053 0.253098 +v -0.981995 4.41271 0.908633 +vn -0.950154 0.0112383 0.311577 +v -0.939362 4.64123 0.927884 +vn -0.898788 0.244737 0.363709 +v -0.959551 4.63316 0.875819 +vn -0.93142 0.238864 0.27459 +v -0.90431 4.72935 0.944095 +vn -0.863098 0.314289 0.395328 +v -0.888658 4.78049 0.934612 +vn -0.854119 0.347779 0.386691 +v -0.917268 4.74782 0.896529 +vn -0.88791 0.321871 0.328655 +v -0.977616 4.6222 0.813197 +vn -0.954218 0.226901 0.194892 +v -0.993796 4.603 0.741958 +vn -0.969366 0.206853 0.132447 +v -0.936207 4.74895 0.835748 +vn -0.920133 0.305719 0.244726 +v -0.955157 4.74288 0.751859 +vn -0.946494 0.2821 0.156746 +v -0.95965 4.68576 0.819076 +vn -0.940207 0.26945 0.208345 +v -0.928754 4.60013 0.974471 +vn -0.870686 0.209152 0.445153 +v -0.896388 4.5952 1.03119 +vn -0.816982 0.186908 0.545533 +v -0.901861 4.63987 1.00538 +vn -0.841399 0.226989 0.490432 +v -0.870404 4.67571 1.03955 +vn -0.817162 0.239557 0.52427 +v -0.905921 4.68028 0.975755 +vn -0.855024 0.273353 0.440695 +v -0.859786 4.75959 1.00854 +vn -0.826342 0.322631 0.461593 +v -0.826001 4.74168 1.07582 +vn -0.803255 0.288401 0.521158 +v -0.92395 4.54799 1.00339 +vn -0.848502 0.161899 0.503818 +v -0.921968 4.38354 1.04293 +vn -0.86075 0.0437747 0.507143 +v -0.91814 4.44948 1.03904 +vn -0.842301 0.110822 0.527492 +v -0.883227 4.55839 1.06039 +vn -0.787251 0.163653 0.594519 +v -0.89808 4.46172 1.06624 +vn -0.803377 0.135262 0.579904 +v -0.889213 4.41747 1.08738 +vn -0.805149 0.11169 0.58246 +v -0.881486 4.46916 1.08577 +vn -0.773879 0.152669 0.614657 +v -0.813203 4.2062 1.19402 +vn -0.804643 -0.185539 0.564025 +v -0.769347 4.14424 1.22835 +vn -0.764201 -0.312866 0.564015 +v -0.770392 4.17714 1.24274 +vn -0.779642 -0.231092 0.582026 +v -0.833645 4.15285 1.13867 +vn -0.812123 -0.288729 0.507043 +v -0.786905 4.08756 1.16741 +vn -0.758174 -0.380033 0.529855 +v -0.787192 4.12962 1.19491 +vn -0.775069 -0.322926 0.543127 +v -0.724307 4.13721 1.28171 +vn -0.724855 -0.333934 0.602556 +v -0.670278 4.07912 1.30492 +vn -0.647718 -0.45169 0.613545 +v -0.670101 4.10902 1.32631 +vn -0.671607 -0.40954 0.617431 +v -0.730196 4.08233 1.23922 +vn -0.707801 -0.405985 0.578096 +v -0.675325 4.02601 1.25831 +vn -0.628159 -0.48615 0.607515 +v -0.673476 4.05397 1.28244 +vn -0.636893 -0.473017 0.608787 +v -0.84951 4.25717 1.15384 +vn -0.8296 -0.0844105 0.551941 +v -0.883873 4.28589 1.10389 +vn -0.849008 -0.0733533 0.523264 +v -0.855973 4.22182 1.13498 +vn -0.836473 -0.178775 0.518028 +v -0.907174 4.33671 1.07028 +vn -0.857106 -0.00949229 0.515052 +v -0.923037 4.31595 1.04024 +vn -0.884273 -0.0675101 0.462065 +v -0.874665 4.20754 1.09757 +vn -0.852194 -0.207569 0.480291 +v -0.90791 4.24072 1.04954 +vn -0.876392 -0.17125 0.450124 +v -0.8799 4.16478 1.06497 +vn -0.85103 -0.285478 0.440738 +v -0.939941 4.28465 0.998267 +vn -0.909755 -0.129861 0.394312 +v -0.952069 4.24637 0.949694 +vn -0.924686 -0.197971 0.325214 +v -0.91852 4.20198 1.00774 +vn -0.890335 -0.244526 0.38407 +v -0.834039 4.26617 1.17719 +vn -0.807468 -0.0589747 0.586956 +v -0.784808 4.23889 1.24021 +vn -0.79302 -0.0885793 0.602721 +v -0.80403 4.29246 1.21747 +vn -0.788041 0.0288185 0.614947 +v -0.818734 4.28013 1.19848 +vn -0.798793 -0.0144466 0.601432 +v -0.888572 4.35501 1.09828 +vn -0.826376 0.0440644 0.561392 +v -0.849643 4.32532 1.15525 +vn -0.805029 0.0433267 0.591651 +v -0.852254 4.3805 1.14317 +vn -0.771173 0.123982 0.624437 +v -0.867937 4.37817 1.1238 +vn -0.793081 0.108225 0.599424 +v -0.756842 4.18637 1.2637 +vn -0.765669 -0.214161 0.606536 +v -0.61251 4.07617 1.35957 +vn -0.583258 -0.50385 0.637138 +v -0.657506 4.11824 1.34586 +vn -0.660394 -0.413629 0.62673 +v -0.745185 4.20034 1.28271 +vn -0.767487 -0.179253 0.615494 +v -0.700117 4.16443 1.32409 +vn -0.729589 -0.285447 0.621466 +v -0.734019 4.21279 1.2999 +vn -0.7685 -0.149385 0.622167 +v -0.649253 4.13204 1.3634 +vn -0.668749 -0.394582 0.630142 +v -0.593071 4.10337 1.39882 +vn -0.584999 -0.499855 0.638687 +v -0.641532 4.14443 1.37936 +vn -0.67473 -0.383369 0.630688 +v -0.320465 3.99574 1.45773 +vn -0.228717 -0.682244 0.694429 +v -0.239805 3.97127 1.45599 +vn -0.16048 -0.676956 0.718315 +v -0.243492 3.98869 1.47196 +vn -0.164514 -0.697762 0.697182 +v -0.192755 3.94219 1.43865 +vn -0.131186 -0.659132 0.740496 +v -0.269159 3.95359 1.43271 +vn -0.184671 -0.658064 0.729965 +v -0.247215 3.92182 1.40987 +vn -0.167995 -0.64006 0.749734 +v -0.161524 3.97966 1.47864 +vn -0.102718 -0.699681 0.707033 +v -0.074002 3.95998 1.46817 +vn -0.0427479 -0.683253 0.72893 +v -0.081419 3.97941 1.48653 +vn -0.050417 -0.709675 0.702722 +v -0.062158 3.93632 1.44706 +vn -0.0304184 -0.662717 0.748252 +v -0.073504 3.91003 1.42401 +vn -0.0449618 -0.638261 0.768506 +v -0.406952 4.01757 1.4448 +vn -0.322212 -0.662817 0.675909 +v -0.477116 4.02775 1.41796 +vn -0.398028 -0.62575 0.670828 +v -0.395534 3.99344 1.42682 +vn -0.299974 -0.651479 0.696844 +v -0.548315 4.05536 1.39534 +vn -0.499102 -0.571405 0.651455 +v -0.54529 4.02834 1.37382 +vn -0.479986 -0.575746 0.661914 +v -0.405249 3.94496 1.37874 +vn -0.312692 -0.621193 0.71857 +v -0.477186 3.93225 1.33338 +vn -0.391677 -0.581805 0.712806 +v -0.401345 3.91463 1.35504 +vn -0.307611 -0.593615 0.743637 +v -0.547601 4.00542 1.35225 +vn -0.476716 -0.575934 0.664109 +v -0.611253 4.02535 1.31909 +vn -0.558684 -0.525538 0.641624 +v -0.546512 3.97937 1.33046 +vn -0.464663 -0.574626 0.673716 +v -0.387353 4.02884 1.46521 +vn -0.29585 -0.687194 0.663503 +v -0.329255 4.0322 1.49249 +vn -0.242475 -0.708912 0.662307 +v -0.392038 4.05555 1.49128 +vn -0.310534 -0.697843 0.645433 +v -0.402313 4.04821 1.47844 +vn -0.329311 -0.686936 0.647822 +v -0.536511 4.0651 1.41293 +vn -0.483909 -0.587882 0.648248 +v -0.464562 4.05881 1.45543 +vn -0.396684 -0.645275 0.652887 +v -0.526266 4.09144 1.44471 +vn -0.494049 -0.588009 0.640438 +v -0.53108 4.07893 1.42953 +vn -0.490729 -0.58507 0.645661 +v -0.243687 4.00587 1.48969 +vn -0.163171 -0.716358 0.678385 +v -0.16234 4.01413 1.51483 +vn -0.102842 -0.73706 0.667957 +v -0.081771 3.99626 1.50414 +vn -0.0489418 -0.729626 0.682093 +v -0.081456 4.01135 1.52071 +vn -0.0493197 -0.744796 0.665467 +v -0.251617 4.02516 1.50869 +vn -0.177244 -0.728513 0.661705 +v -0.23104 4.03406 1.52396 +vn -0.149772 -0.745743 0.649181 +v -0.081193 4.02385 1.53502 +vn -0.0495684 -0.755811 0.652911 +v -0.730831 4.838 1.1462 +vn -0.699816 0.429398 0.570855 +v -0.751331 4.86312 1.10053 +vn -0.717315 0.429695 0.548472 +v -0.764551 4.82512 1.11232 +vn -0.74321 0.397699 0.538029 +v -0.82216 4.83758 1.0138 +vn -0.801308 0.373187 0.467586 +v -0.787275 4.85569 1.05575 +vn -0.764024 0.390896 0.513291 +v -0.794501 4.87044 1.03324 +vn -0.7737 0.391055 0.498462 +v -0.798969 4.80934 1.07327 +vn -0.77822 0.366298 0.510098 +v -0.828478 4.7856 1.04315 +vn -0.801826 0.346042 0.487166 +v -0.85801 4.81488 0.96781 +vn -0.828703 0.361245 0.427496 +v -0.874663 4.82602 0.922384 +vn -0.8505 0.366172 0.377581 +v -0.694451 4.88224 1.15341 +vn -0.659201 0.470484 0.586599 +v -0.713035 4.90851 1.11137 +vn -0.67232 0.455539 0.583498 +v -0.714569 4.814 1.1835 +vn -0.69514 0.413358 0.588146 +v -0.68097 4.85377 1.1908 +vn -0.645205 0.465511 0.605814 +v -0.665398 4.83609 1.22057 +vn -0.628365 0.463859 0.624494 +v -0.771995 4.78864 1.12702 +vn -0.760026 0.348017 0.548857 +v -0.122406 5.14497 1.27446 +vn -0.169723 0.544157 0.821637 +v -0.131053 5.1902 1.24246 +vn -0.188028 0.561479 0.805845 +v -0.187695 5.15059 1.25219 +vn -0.261174 0.550696 0.792794 +v -0.185542 5.19446 1.2225 +vn -0.27828 0.564114 0.77739 +v -0.065313 5.19111 1.25229 +vn -0.0838177 0.565759 0.820299 +v -0.060011 5.14731 1.28162 +vn -0.0724864 0.543973 0.835966 +v -0.105799 5.11045 1.29981 +vn -0.137366 0.544067 0.827721 +v -0.054917 5.10836 1.30689 +vn -0.0610793 0.546256 0.835388 +v -0.169876 5.0987 1.29334 +vn -0.213017 0.566091 0.796344 +v -0.36642 4.87787 1.43358 +vn -0.466349 0.842798 0.26872 +v -0.44288 4.84128 1.41499 +vn -0.467 0.821041 0.328334 +v -0.442274 4.83742 1.42683 +vn -0.467453 0.839176 0.277976 +v -0.366322 4.88209 1.42167 +vn -0.457624 0.82488 0.331893 +v -0.518611 4.80525 1.39789 +vn -0.457326 0.836578 0.301647 +v -0.51955 4.8087 1.38774 +vn -0.46987 0.807298 0.357061 +v -0.292732 4.91799 1.43319 +vn -0.440538 0.858853 0.261339 +v -0.223803 4.95241 1.42959 +vn -0.381044 0.884502 0.269187 +v -0.291907 4.92268 1.42051 +vn -0.427383 0.841622 0.330175 +v -0.222502 4.95749 1.41615 +vn -0.368224 0.86558 0.339386 +v -0.294282 4.91254 1.45023 +vn -0.447833 0.865144 0.22577 +v -0.366899 4.87286 1.44989 +vn -0.47214 0.84883 0.237847 +v -0.226049 4.9466 1.44739 +vn -0.387393 0.892328 0.231683 +v -0.517622 4.80101 1.41211 +vn -0.451885 0.848328 0.275935 +v -0.441708 4.83255 1.44349 +vn -0.470035 0.844528 0.256592 +v -0.805544 4.61551 1.15813 +vn -0.983809 0.174849 0.039331 +v -0.807087 4.53975 1.16549 +vn -0.957821 0.0130609 0.287069 +v -0.805694 4.53964 1.17281 +vn -0.991305 -0.0488592 0.122173 +v -0.807083 4.61066 1.1503 +vn -0.968183 0.102116 0.228461 +v -0.794776 4.4645 1.19827 +vn -0.926417 -0.0100702 0.376365 +v -0.792606 4.46592 1.20508 +vn -0.958571 -0.0854576 0.271734 +v -0.797838 4.46298 1.192 +vn -0.871062 0.0662453 0.486684 +v -0.791594 4.66923 1.16057 +vn -0.925491 0.320001 0.202645 +v -0.788236 4.6759 1.16945 +vn -0.856237 0.51629 -0.0173907 +v -0.761671 4.71381 1.18986 +vn -0.776498 0.600235 0.191749 +v -0.79279 4.6658 1.1748 +vn -0.919913 0.384925 -0.0747874 +v -0.807069 4.60718 1.16854 +vn -0.992073 0.0783903 -0.0982121 +v -0.762081 4.71161 1.1973 +vn -0.756324 0.641612 0.1277 +v -0.764124 4.70768 1.20742 +vn -0.749572 0.656345 0.0857477 +v -0.805157 4.53913 1.1822 +vn -0.99409 -0.101946 0.037306 +v -0.790623 4.46727 1.21417 +vn -0.966713 -0.13979 0.214302 +v -0.715238 4.30065 1.33878 +vn -0.868843 -0.184055 0.459603 +v -0.686104 4.26085 1.37345 +vn -0.832854 -0.241687 0.497937 +v -0.684241 4.26257 1.37743 +vn -0.834596 -0.255185 0.48819 +v -0.718555 4.29771 1.33162 +vn -0.859522 -0.143382 0.490574 +v -0.68917 4.25791 1.36719 +vn -0.824538 -0.20242 0.52836 +v -0.687654 4.25936 1.37016 +vn -0.829344 -0.223964 0.511887 +v -0.647796 4.22697 1.41572 +vn -0.784442 -0.34417 0.515944 +v -0.607355 4.19255 1.44786 +vn -0.712987 -0.446918 0.540291 +v -0.605437 4.19458 1.45203 +vn -0.712925 -0.452809 0.535446 +v -0.651266 4.22349 1.40827 +vn -0.782218 -0.320858 0.534027 +v -0.61027 4.18929 1.44148 +vn -0.711721 -0.424012 0.56006 +v -0.608856 4.19088 1.44446 +vn -0.71239 -0.436133 0.549808 +v -0.741135 4.34046 1.30087 +vn -0.895762 -0.139836 0.421968 +v -0.762399 4.3813 1.26521 +vn -0.916138 -0.109164 0.385713 +v -0.742775 4.3391 1.29706 +vn -0.889999 -0.115602 0.441064 +v -0.77939 4.42259 1.23294 +vn -0.938181 -0.101228 0.331013 +v -0.780661 4.42164 1.22926 +vn -0.927241 -0.0651375 0.368756 +v -0.744252 4.33783 1.29386 +vn -0.881093 -0.0878415 0.464714 +v -0.765286 4.37899 1.25828 +vn -0.896033 -0.0470155 0.441492 +v -0.745777 4.33656 1.29088 +vn -0.868883 -0.0549686 0.491956 +v -0.781946 4.42068 1.22612 +vn -0.911453 -0.0271889 0.410505 +v -0.783366 4.41965 1.22312 +vn -0.88971 0.0148154 0.456286 +v -0.739385 4.34195 1.30521 +vn -0.898293 -0.155726 0.410876 +v -0.710898 4.30445 1.34888 +vn -0.870774 -0.206758 0.446099 +v -0.734916 4.34594 1.31679 +vn -0.898366 -0.175057 0.402858 +v -0.737284 4.34382 1.31057 +vn -0.899084 -0.167626 0.404413 +v -0.778115 4.42357 1.23707 +vn -0.94285 -0.126128 0.308426 +v -0.759054 4.38407 1.27467 +vn -0.921388 -0.147583 0.359533 +v -0.775064 4.42589 1.24803 +vn -0.942622 -0.1588 0.293678 +v -0.776659 4.42468 1.2422 +vn -0.944672 -0.147608 0.292927 +v -0.682185 4.26448 1.38206 +vn -0.835383 -0.264497 0.481847 +v -0.642909 4.23173 1.42652 +vn -0.784232 -0.355616 0.508447 +v -0.603279 4.19687 1.45695 +vn -0.712875 -0.458047 0.531038 +v -0.600485 4.19975 1.46313 +vn -0.712452 -0.459982 0.529933 +v -0.679586 4.26684 1.38785 +vn -0.835022 -0.2707 0.47902 +v -0.676632 4.26955 1.3946 +vn -0.834233 -0.274573 0.47819 +v -0.551933 4.17173 1.49681 +vn -0.616011 -0.57113 0.542532 +v -0.597297 4.20306 1.47038 +vn -0.71214 -0.462085 0.528521 +v -0.30496 4.09467 1.57622 +vn -0.227262 -0.813413 0.535454 +v -0.232499 4.08313 1.58416 +vn -0.158504 -0.829252 0.535926 +v -0.231549 4.08588 1.58867 +vn -0.157879 -0.831885 0.532016 +v -0.30706 4.08989 1.56813 +vn -0.228781 -0.805033 0.54734 +v -0.233806 4.07901 1.57751 +vn -0.160078 -0.817759 0.552852 +v -0.233193 4.08096 1.58058 +vn -0.159081 -0.824279 0.543376 +v -0.15565 4.08008 1.59758 +vn -0.0983076 -0.84138 0.531428 +v -0.078475 4.0741 1.59835 +vn -0.0472232 -0.843764 0.534633 +v -0.0777 4.07699 1.60297 +vn -0.0504958 -0.841696 0.537586 +v -0.156811 4.07502 1.58942 +vn -0.0993716 -0.833659 0.543266 +v -0.078976 4.06979 1.59161 +vn -0.047278 -0.833562 0.550399 +v -0.078741 4.07182 1.59473 +vn -0.0469287 -0.839467 0.54138 +v -0.37645 4.10416 1.55519 +vn -0.308551 -0.780769 0.54332 +v -0.377511 4.10213 1.55164 +vn -0.309196 -0.775123 0.550983 +v -0.501778 4.14211 1.51435 +vn -0.506756 -0.664349 0.549399 +v -0.556838 4.16612 1.48538 +vn -0.616513 -0.565568 0.547763 +v -0.503552 4.1398 1.51002 +vn -0.50726 -0.661152 0.55278 +v -0.443764 4.11803 1.53125 +vn -0.403081 -0.725943 0.557254 +v -0.378458 4.10029 1.5486 +vn -0.310479 -0.768526 0.559437 +v -0.50489 4.13795 1.50653 +vn -0.507653 -0.654029 0.560834 +v -0.56016 4.16217 1.47764 +vn -0.617133 -0.552567 0.560194 +v -0.506112 4.13623 1.50352 +vn -0.5086 -0.646145 0.569054 +v -0.373368 4.10966 1.56493 +vn -0.307496 -0.785976 0.536365 +v -0.375016 4.10671 1.55964 +vn -0.307854 -0.783564 0.539679 +v -0.30173 4.10169 1.58835 +vn -0.226284 -0.816717 0.530819 +v -0.368709 4.11775 1.57951 +vn -0.306846 -0.787801 0.534056 +v -0.371196 4.11341 1.57163 +vn -0.30708 -0.786695 0.535549 +v -0.440915 4.12243 1.5392 +vn -0.401633 -0.735438 0.545731 +v -0.499755 4.14474 1.51951 +vn -0.506528 -0.667632 0.545616 +v -0.436594 4.1288 1.55108 +vn -0.400936 -0.739217 0.541118 +v -0.494071 4.15195 1.53365 +vn -0.506216 -0.669714 0.543349 +v -0.497103 4.14809 1.526 +vn -0.506286 -0.668341 0.544972 +v -0.230455 4.08906 1.59405 +vn -0.157458 -0.83399 0.528836 +v -0.067971 4.08066 1.60968 +vn -0.0310322 -0.845633 0.532862 +v -0.229008 4.09312 1.60085 +vn -0.156932 -0.834687 0.527891 +v -0.153855 4.08759 1.60991 +vn -0.0980087 -0.844738 0.52613 +v -0.227357 4.09783 1.60885 +vn -0.156532 -0.835549 0.526645 +v -0.086208 4.08596 1.61666 +vn -0.0606925 -0.852091 0.519863 +v -0.067489 4.09023 1.62515 +vn -0.0319129 -0.852967 0.520988 +v -0.659729 4.7621 1.29991 +vn -0.50462 0.818259 0.275336 +v -0.659901 4.76515 1.29127 +vn -0.54177 0.77295 0.330202 +v -0.717533 4.74109 1.24412 +vn -0.601525 0.769273 0.215376 +v -0.717223 4.74385 1.23605 +vn -0.639671 0.716961 0.277109 +v -0.592952 4.78442 1.34507 +vn -0.489685 0.796012 0.355772 +v -0.592256 4.78119 1.35438 +vn -0.462487 0.834109 0.300613 +v -0.660228 4.75802 1.31207 +vn -0.486623 0.835758 0.254375 +v -0.591778 4.77707 1.36746 +vn -0.449157 0.84952 0.27672 +v -0.718964 4.73719 1.25541 +vn -0.582358 0.789819 0.192472 +v -0.104107 4.99207 1.42622 +vn -0.18588 0.932673 0.309145 +v -0.159799 4.98237 1.41298 +vn -0.281293 0.890392 0.357877 +v -0.161161 4.97705 1.42701 +vn -0.290385 0.912137 0.289279 +v -0.103046 4.99751 1.41179 +vn -0.180944 0.908783 0.375995 +v -0.050956 4.99973 1.42576 +vn -0.0857924 0.942718 0.322371 +v -0.050421 5.00521 1.41126 +vn -0.0837073 0.917154 0.389643 +v -0.051869 4.99379 1.44463 +vn -0.0869934 0.954757 0.284379 +v -0.105892 4.98605 1.4451 +vn -0.187976 0.94372 0.272134 +v -0.163461 4.97106 1.44545 +vn -0.294416 0.921897 0.251844 +v -1.18585 2.14833 -1.41063 +vn -0.76782 0.363448 -0.527596 +v -1.21298 2.14723 -1.36909 +vn -0.800055 0.365364 -0.475838 +v -1.24073 2.14567 -1.3199 +vn -0.822535 0.371316 -0.430768 +v -1.05407 2.37756 -1.371 +vn -0.6164 0.636444 -0.463671 +v -1.02738 2.36267 -1.42116 +vn -0.616881 0.585834 -0.5256 +v -0.919717 1.1523 -1.11569 +vn -0.429072 -0.823938 -0.370166 +v -0.904265 1.18054 -1.19365 +vn -0.461448 -0.796846 -0.390004 +v -0.903051 1.21546 -1.26239 +vn -0.495035 -0.762959 -0.415734 +v -0.888668 1.23966 -1.32268 +vn -0.509779 -0.746201 -0.428148 +v -0.935247 1.1264 -1.03751 +vn -0.398814 -0.849213 -0.3461 +v -0.953371 1.10277 -0.955471 +vn -0.370046 -0.871754 -0.321109 +v -0.971362 1.08049 -0.870461 +vn -0.347086 -0.891406 -0.291422 +v -0.990369 1.06117 -0.783335 +vn -0.33093 -0.908996 -0.253399 +v -0.562488 1.00854 -1.05691 +vn -0.176147 -0.966913 -0.184529 +v -0.586874 0.982536 -0.882888 +vn -0.116464 -0.98213 -0.147842 +v -0.543514 1.04025 -1.22103 +vn -0.229048 -0.943293 -0.240284 +v -0.5313 1.08168 -1.37026 +vn -0.27529 -0.906019 -0.321474 +v -0.356698 0.999927 -1.17507 +vn -0.106691 -0.979805 -0.169115 +v -0.368441 0.977314 -1.00063 +vn -0.0684751 -0.992079 -0.105312 +v -0.399886 0.984388 -1.04059 +vn -0.0895672 -0.987927 -0.126404 +v -0.416316 0.967427 -0.859407 +vn -0.0444103 -0.996504 -0.0707633 +v -0.509048 0.988358 -0.983921 +vn -0.122108 -0.981569 -0.147008 +v -0.557336 0.973942 -0.840296 +vn -0.0794189 -0.990449 -0.112713 +v -0.146144 0.977846 -1.10678 +vn -0.0269837 -0.99362 -0.109507 +v -0.180948 0.983828 -1.14758 +vn -0.0381238 -0.991116 -0.127421 +v -0.071687 0.987279 -1.19513 +vn -0.0123968 -0.990126 -0.139629 +v -0.152193 0.963717 -0.926911 +vn -0.0153192 -0.99861 -0.0504416 +v -0.188169 0.966997 -0.971002 +vn -0.0234426 -0.997438 -0.0675813 +v 0 0.963882 -0.954481 +vn 1.03543e-18 -0.998547 -0.0538832 +v -0.037465 0.96608 -0.989827 +vn -0.00448975 -0.997796 -0.0661985 +v -0.175493 1.0105 -1.3113 +vn -0.053864 -0.977206 -0.205346 +v -0.069858 1.01628 -1.35594 +vn -0.0173327 -0.974509 -0.223677 +v -1.05606 1.01663 -0.431909 +vn -0.22972 -0.967708 -0.103777 +v -1.03977 1.02297 -0.518245 +vn -0.246855 -0.960182 -0.130816 +v -1.025 1.03275 -0.606703 +vn -0.272427 -0.947451 -0.167694 +v -1.00788 1.04504 -0.695182 +vn -0.303474 -0.929871 -0.207951 +v -0.965146 0.981459 -0.179174 +vn -0.184367 -0.982401 -0.0299649 +v -1.06575 1.01105 -0.344453 +vn -0.220805 -0.972577 -0.0730728 +v -1.0794 1.00855 -0.255505 +vn -0.213009 -0.975697 -0.0514128 +v -1.08997 1.00721 -0.165045 +vn -0.21234 -0.976747 -0.0296057 +v -1.09586 1.00661 -0.077563 +vn -0.21008 -0.977576 -0.0145633 +v -0.781402 0.962186 -0.288205 +vn -0.0489662 -0.998729 -0.011906 +v -0.808709 0.964591 -0.333224 +vn -0.078888 -0.996666 -0.0208219 +v -0.64447 0.960213 -0.300291 +vn -0.00150097 -0.999998 -0.00139542 +v -0.673162 0.960349 -0.347563 +vn -0.0057578 -0.999977 -0.00348982 +v -0.795979 0.961304 -0.092631 +vn -0.0399464 -0.999193 -0.00431183 +v -0.824847 0.963049 -0.139739 +vn -0.0632834 -0.99796 -0.00845856 +v -0.657307 0.960052 -0.097922 +vn 0.0015088 -0.999999 -0.000350951 +v -0.728463 0.960014 -0.097361 +vn -0.00832508 -0.999964 -0.0017662 +v -0.6875 0.960002 -0.147142 +vn -8.21754e-05 -0.999999 -0.00110917 +v -0.657889 0.961687 -0.54428 +vn -0.0216166 -0.999581 -0.0192545 +v -0.635907 0.969656 -0.735588 +vn -0.0675373 -0.994067 -0.0852618 +v -0.446508 0.960186 -0.466693 +vn -0.000199021 -1 -0.000728696 +v -0.407628 0.960183 -0.469326 +vn -8.37543e-05 -1 -0.000505268 +v -0.593476 0.960326 -0.454281 +vn -0.00443197 -0.999986 -0.00296941 +v -0.560022 0.960233 -0.457514 +vn -0.00206041 -0.999996 -0.00185471 +v -0.465543 0.962147 -0.712353 +vn -0.0177474 -0.999505 -0.0259733 +v -0.432413 0.960991 -0.667304 +vn -0.0096322 -0.999891 -0.0112288 +v -0.609062 0.965278 -0.695538 +vn -0.0429073 -0.997544 -0.0553689 +v -0.578309 0.962582 -0.650776 +vn -0.0226077 -0.999308 -0.0295409 +v -0.418366 0.960178 -0.261804 +vn 0 -1 0 +v -0.458173 0.960178 -0.260165 +vn -2.86181e-06 -1 -5.18236e-06 +v -0.426586 0.960178 -0.051055 +vn 0 -1 0 +v -0.467081 0.960178 -0.050525 +vn 0 -1 0 +v -0.574245 0.96018 -0.254432 +vn 4.54681e-05 -1 -0.000153506 +v -0.5772 0.960173 -0.20313 +vn 0.000342858 -1 -0.000129534 +v -0.611528 0.960175 -0.252226 +vn 0.000273367 -1 -0.000543614 +v -0.541692 0.960177 -0.153097 +vn 0.000113141 -1 -4.23484e-05 +v -0.580101 0.96017 -0.151724 +vn 0.000475034 -1 -7.20998e-05 +v -0.209874 0.960178 -0.373972 +vn 0 -1 0 +v -0.251294 0.960178 -0.372806 +vn 0 -1 0 +v -0.042005 0.960178 -0.391837 +vn 0 -1 0 +v -0.084105 0.960178 -0.380467 +vn 0 -1 0 +v -0.214929 0.960178 -0.16064 +vn 0 -1 0 +v -0.257292 0.960178 -0.160043 +vn 0 -1 0 +v -0.043084 0.960178 -0.177484 +vn 0 -1 0 +v -0.086227 0.960178 -0.166076 +vn 0 -1 0 +v -0.243906 0.960138 -0.580497 +vn -0.000871065 -0.999999 0.00116539 +v -0.20366 0.960106 -0.582156 +vn -0.000700204 -0.999998 0.00168111 +v -0.237312 0.959903 -0.733029 +vn -0.00637579 -0.999965 -0.00534031 +v -0.196223 0.959945 -0.78206 +vn -0.00776006 -0.999908 -0.0110924 +v -0.081513 0.960039 -0.589501 +vn -0.00017552 -0.999995 0.00302905 +v -0.040689 0.960001 -0.600652 +vn -3.37758e-06 -0.999993 0.0036954 +v -0.07918 0.95927 -0.743533 +vn -0.00254006 -0.999997 -0.00015955 +v -0.039118 0.959307 -0.801212 +vn -0.00232154 -0.999953 -0.00941414 +v -0.999801 0.986572 0.187396 +vn -0.200024 -0.97958 0.020328 +v -1.11102 1.01721 0.357938 +vn -0.22035 -0.973908 0.0542983 +v -1.10735 1.00864 0.096811 +vn -0.211876 -0.977259 0.0085543 +v -1.09929 1.00662 0.011369 +vn -0.212639 -0.977127 -0.00280704 +v -0.930341 0.982675 0.473676 +vn -0.198939 -0.978873 0.0472288 +v -0.971955 1.01318 0.724677 +vn -0.300263 -0.9475 0.109936 +v -1.03849 1.00076 0.358625 +vn -0.21965 -0.974359 0.0487759 +v -1.03741 1.01272 0.538481 +vn -0.243974 -0.96594 0.0862331 +v -0.808668 0.96554 0.486508 +vn -0.0847824 -0.996248 0.0173528 +v -0.839883 0.96977 0.528974 +vn -0.127528 -0.991435 0.0281732 +v -0.668915 0.960686 0.502767 +vn -0.0110285 -0.999936 0.00241856 +v -0.704442 0.961321 0.547301 +vn -0.0213621 -0.999758 0.00533896 +v -0.80393 0.969334 0.674788 +vn -0.133645 -0.990412 0.0349742 +v -0.860506 0.983443 0.750802 +vn -0.228736 -0.971372 0.0641583 +v -0.698078 0.962316 0.737061 +vn -0.0393974 -0.999174 0.00991125 +v -0.887692 0.968296 0.195637 +vn -0.112577 -0.99356 0.0128087 +v -0.911394 0.972027 0.240916 +vn -0.137996 -0.990242 0.0194383 +v -0.836366 0.962985 0.054211 +vn -0.0646173 -0.99791 0.000308744 +v -0.758529 0.960476 0.201606 +vn -0.0197109 -0.999796 0.00439327 +v -0.752509 0.960594 0.250779 +vn -0.0174306 -0.999829 0.00613638 +v -0.785794 0.961478 0.24885 +vn -0.0371113 -0.999277 0.0082887 +v -0.697838 0.959924 0.054348 +vn 0.000541117 -1 0.000437007 +v -0.454743 0.960178 0.21153 +vn 0 -1 0 +v -0.444667 0.960178 0.263797 +vn 0 -1 0 +v -0.485549 0.960178 0.262478 +vn -2.78399e-06 -1 5.61557e-06 +v -0.613452 0.960173 0.20706 +vn 0.000169413 -1 0.000476584 +v -0.604263 0.960192 0.257979 +vn -0.000446003 -1 0.000395542 +v -0.642266 0.960213 0.256294 +vn -0.000660195 -0.999999 0.00117708 +v -0.483949 0.960178 0.158939 +vn 0 -1 0 +v -0.443166 0.960178 0.159616 +vn 0 -1 0 +v -0.64035 0.960125 0.155791 +vn 0.0011593 -0.999999 0.000848939 +v -0.602411 0.960162 0.156648 +vn 0.000657769 -1 0.000287621 +v -0.431758 0.960178 0.624638 +vn -1.39741e-05 -1 -1.01109e-06 +v -0.432648 0.960178 0.572538 +vn 0 -1 0 +v -0.391066 0.960178 0.575185 +vn 0 -1 0 +v -0.426875 0.960187 0.818071 +vn -0.000106544 -0.999999 0.00109929 +v -0.387191 0.960178 0.773511 +vn -1.39e-05 -1 8.88145e-05 +v -0.591537 0.960289 0.608497 +vn -0.00460332 -0.999989 0.000567104 +v -0.593336 0.960257 0.511958 +vn -0.00321329 -0.999995 0.000487839 +v -0.553599 0.960194 0.563025 +vn -0.0011877 -0.999999 0.000185517 +v -0.585069 0.960386 0.800177 +vn -0.00848699 -0.999961 0.00238276 +v -0.548384 0.960208 0.757744 +vn -0.00223651 -0.999997 0.000467848 +v -0.263633 0.960178 0.581674 +vn 0 -1 0 +v -0.220316 0.960178 0.583285 +vn 0 -1 0 +v -0.088593 0.960178 0.590562 +vn 0 -1 0 +v -0.044308 0.960178 0.601733 +vn 0 -1 0 +v -0.261713 0.960178 0.734664 +vn -6.43676e-08 -1 1.71614e-05 +v -0.175356 0.960178 0.738432 +vn -8.87933e-08 -1 1.71716e-05 +v -0.218016 0.960178 0.783954 +vn -3.70279e-06 -1 7.23837e-05 +v -0.087868 0.960178 0.745208 +vn -7.19645e-07 -1 1.43384e-05 +v 0 0.960178 0.767266 +vn -4.3139e-21 -1 2.93573e-05 +v -0.043783 0.960178 0.803246 +vn 1.86748e-06 -1 8.20061e-05 +v -0.275907 0.960178 0.267999 +vn 0 -1 0 +v -0.31877 0.960178 0.267105 +vn 0 -1 0 +v -0.26193 0.960178 0.05479 +vn 0 -1 0 +v -0.218919 0.960178 0.054805 +vn 0 -1 0 +v -0.095082 0.960178 0.26629 +vn 0 -1 0 +v -0.144805 0.960178 0.270047 +vn 0 -1 0 +v -0.087969 0.960178 0.05078 +vn 0 -1 0 +v -0.043979 0.960178 0.039516 +vn 0 -1 0 +v -1.06542 1.10762 1.00991 +vn -0.398495 -0.875678 0.272743 +v -0.939379 1.1749 1.33051 +vn -0.44305 -0.795498 0.413388 +v -1.00029 1.08542 1.04001 +vn -0.430637 -0.863796 0.261548 +v -0.989897 1.12962 1.1742 +vn -0.446346 -0.823836 0.349384 +v -0.829608 1.14236 1.37667 +vn -0.380032 -0.824833 0.4186 +v -0.7021 1.11322 1.42145 +vn -0.295908 -0.865881 0.403347 +v -0.732132 0.964684 0.778741 +vn -0.0818222 -0.996349 0.0243525 +v -0.494235 0.968696 1.08215 +vn -0.0314098 -0.99409 0.103918 +v -0.457346 0.964793 1.0436 +vn -0.017054 -0.997833 0.0635554 +v -0.61005 0.966974 1.02053 +vn -0.0499818 -0.994855 0.0881221 +v -0.503254 0.960559 0.903209 +vn -0.00341844 -0.999906 0.0132445 +v -0.465573 0.960237 0.861311 +vn -0.000832485 -0.999993 0.00368116 +v -0.620534 0.960923 0.841234 +vn -0.0195253 -0.999775 0.0083437 +v -0.407132 1.02102 1.3406 +vn -0.0964587 -0.948446 0.301905 +v -0.368511 1.00704 1.3062 +vn -0.0743697 -0.957842 0.277501 +v -0.408133 1.07463 1.49019 +vn -0.128464 -0.918892 0.373008 +v -0.367841 1.05771 1.45973 +vn -0.105258 -0.931241 0.34887 +v -0.523073 1.01588 1.28296 +vn -0.128632 -0.940977 0.313074 +v -0.558821 1.09051 1.46278 +vn -0.209195 -0.899994 0.382426 +v -0.522159 1.0707 1.43354 +vn -0.175714 -0.914576 0.364247 +v -0.166311 0.991184 1.28301 +vn -0.0250422 -0.974179 0.224385 +v -0.206975 1.00206 1.32126 +vn -0.036461 -0.965534 0.25771 +v 0 0.995056 1.3087 +vn -1.10469e-18 -0.971722 0.236126 +v -0.041502 1.00324 1.33989 +vn -0.00821903 -0.966109 0.258002 +v -0.165394 1.03653 1.44172 +vn -0.0382955 -0.947877 0.316327 +v -0.206661 1.05058 1.47663 +vn -0.0519887 -0.939291 0.33916 +v 0 1.04142 1.46635 +vn -6.49876e-07 -0.945977 0.324233 +v -0.041587 1.05184 1.49518 +vn -0.0107866 -0.939488 0.342412 +v -0.255369 0.961964 1.01791 +vn -0.00422146 -0.999516 0.0308215 +v -0.2956 0.963785 1.06 +vn -0.00900621 -0.998692 0.0503355 +v -0.259958 0.960185 0.83045 +vn -3.99423e-05 -1 0.000845495 +v -0.301122 0.960222 0.875696 +vn -0.000397225 -0.999996 0.00275434 +v -0.085582 0.96179 1.02955 +vn -0.00207694 -0.9996 0.0281983 +v -0.127701 0.963265 1.07007 +vn -0.00423912 -0.999017 0.0441305 +v -0.087226 0.960184 0.841439 +vn -4.76994e-05 -1 0.000741978 +v -0.130224 0.960214 0.884729 +vn -0.000235792 -0.999997 0.00225621 +v -1.00437 2.94714 0.931528 +vn -0.530786 0.832467 0.158952 +v -1.01503 2.95258 0.857569 +vn -0.525278 0.84215 0.121929 +v -1.01393 2.96243 0.779121 +vn -0.534251 0.84189 0.0761429 +v -1.02111 2.96318 0.69659 +vn -0.533215 0.845289 0.0341746 +v -0.770637 3.16949 0.87244 +vn -0.832503 0.533458 0.149539 +v -0.860158 3.08448 0.664918 +vn -0.682138 0.730852 0.023301 +v -0.782198 3.17658 0.719338 +vn -0.850372 0.525123 0.0333503 +v -0.782881 3.17731 0.626672 +vn -0.84129 0.53946 -0.0348418 +v -0.726098 3.14369 1.0918 +vn -0.752655 0.5846 0.30291 +v -0.690941 3.04713 1.32119 +vn -0.591755 0.671868 0.445443 +v -0.663475 3.11445 1.26081 +vn -0.650122 0.621239 0.437498 +v -1.00881 2.92725 1.00957 +vn -0.523314 0.826908 0.205827 +v -0.999788 2.91394 1.07924 +vn -0.527834 0.812863 0.246262 +v -1.00259 2.8927 1.13816 +vn -0.527354 0.799809 0.28671 +v -1.00159 2.87206 1.19295 +vn -0.53134 0.780454 0.329498 +v -0.228748 3.26497 1.44912 +vn -0.248735 0.581082 0.774903 +v -0.188319 3.29475 1.43908 +vn -0.207457 0.570721 0.794506 +v -0.21526 3.15646 1.53911 +vn -0.221815 0.616952 0.755095 +v -0.154545 3.20141 1.51832 +vn -0.163025 0.61109 0.774591 +v -0.077269 3.16809 1.55717 +vn -0.0788285 0.623985 0.77745 +v -0.430774 3.30282 1.32248 +vn -0.489503 0.510652 0.706839 +v -0.54886 3.296 1.22265 +vn -0.67223 0.450311 0.587645 +v -0.460606 3.18089 1.39962 +vn -0.470054 0.588436 0.657869 +v -0.418176 3.21621 1.3979 +vn -0.439512 0.572318 0.692302 +v -0.527032 3.41591 1.1731 +vn -0.679855 0.303157 0.667752 +v -0.521996 3.53198 1.14372 +vn -0.662139 0.0930019 0.743587 +v -0.789381 2.75199 -1.4544 +vn -0.849113 0.504238 -0.157326 +v -0.768264 2.79224 -1.43255 +vn -0.836656 0.534348 -0.120333 +v -0.868575 2.64006 -1.38954 +vn -0.84727 0.497388 -0.18638 +v -0.55504 3.05256 -1.37389 +vn -0.658689 0.738775 0.142616 +v -0.6801 2.90908 -1.53133 +vn -0.835563 0.541202 -0.0945195 +v -0.581479 3.04441 -1.50283 +vn -0.765593 0.64109 0.0535768 +v -0.547505 3.0845 -1.51212 +vn -0.73235 0.674124 0.0960248 +v -0.567109 3.06628 -1.54969 +vn -0.769639 0.636293 0.0527927 +v -0.726586 2.85468 -0.808751 +vn -0.62945 0.775705 -0.0455429 +v -0.603726 2.94526 -0.848963 +vn -0.562019 0.827123 -0.00127732 +v -0.834697 2.76564 -0.762616 +vn -0.670629 0.735965 -0.0928035 +v -0.926121 2.68492 -0.724015 +vn -0.69439 0.706776 -0.135242 +v -0.817298 2.81957 -0.556698 +vn -0.630261 0.753544 -0.186928 +v -0.7871 2.81618 -0.698273 +vn -0.640074 0.759456 -0.116326 +v -0.671547 2.9301 -0.570082 +vn -0.576429 0.797465 -0.178267 +v -0.701463 2.90145 -0.600944 +vn -0.59204 0.789486 -0.161867 +v -0.574385 2.98113 -0.647927 +vn -0.532236 0.834939 -0.140007 +v -0.667366 2.90538 -0.741311 +vn -0.589747 0.803907 -0.0770188 +v -0.696789 2.88053 -0.773638 +vn -0.609365 0.790685 -0.0590827 +v -0.74327 2.95892 -0.291048 +vn -0.59026 0.764137 -0.260169 +v -0.770004 2.92697 -0.324082 +vn -0.595693 0.761536 -0.255368 +v -0.762464 3.00479 -0.114635 +vn -0.598593 0.758251 -0.258344 +v -0.784168 2.97516 -0.151484 +vn -0.595552 0.759787 -0.260847 +v -0.616495 3.0382 -0.335086 +vn -0.554308 0.78494 -0.276787 +v -0.646954 3.00535 -0.367326 +vn -0.564396 0.782742 -0.262244 +v -0.64538 3.08904 -0.13963 +vn -0.596952 0.750026 -0.284795 +v -0.628047 3.08383 -0.189205 +vn -0.583453 0.758581 -0.290065 +v -0.661881 3.05962 -0.183796 +vn -0.589814 0.757598 -0.27958 +v -0.864655 2.93399 -0.087304 +vn -0.59413 0.762515 -0.256087 +v -0.82744 2.98618 -0.016079 +vn -0.598219 0.763772 -0.242458 +v -0.94238 2.97661 0.270181 +vn -0.575214 0.800576 -0.167946 +v -0.770423 3.0856 0.156931 +vn -0.65261 0.725123 -0.219765 +v -0.7817 3.0621 0.111561 +vn -0.630392 0.743026 -0.224763 +v -0.682215 3.1628 0.132801 +vn -0.691598 0.669577 -0.270848 +v -0.713785 3.1231 0.110524 +vn -0.673927 0.695004 -0.250581 +v -0.72605 3.06201 -0.033092 +vn -0.617095 0.743613 -0.257359 +v -0.742903 3.03378 -0.075281 +vn -0.605577 0.752871 -0.2578 +v -0.651792 3.10301 -0.089731 +vn -0.610991 0.737863 -0.286789 +v -0.620461 3.12205 -0.106337 +vn -0.601666 0.739574 -0.301708 +v -0.877273 3.02304 0.260982 +vn -0.60429 0.778029 -0.171769 +v -0.791321 3.09341 0.251106 +vn -0.669734 0.717311 -0.192149 +v -0.782854 3.11385 0.297291 +vn -0.695233 0.694532 -0.185139 +v -0.7632 3.17345 0.43725 +vn -0.79176 0.592254 -0.149506 +v -0.786597 3.15234 0.48454 +vn -0.771339 0.628694 -0.0988974 +v -0.772885 3.17268 0.498323 +vn -0.811629 0.57338 -0.111776 +v -1.00422 2.93538 0.277489 +vn -0.552022 0.815322 -0.174702 +v -0.964744 2.99536 0.501439 +vn -0.561865 0.823927 -0.0738421 +v -0.329871 3.22339 -1.44629 +vn -0.392423 0.841162 0.372088 +v -0.297965 3.22052 -1.4085 +vn -0.336677 0.867498 0.366191 +v -0.307852 3.31354 -1.58743 +vn -0.426041 0.735909 0.526238 +v -0.458155 3.14737 -1.44465 +vn -0.566193 0.787526 0.243366 +v -0.42858 3.15349 -1.40244 +vn -0.504352 0.821662 0.265519 +v -0.432703 3.23247 -1.6155 +vn -0.674656 0.672849 0.303501 +v -0.133568 3.24758 -1.37307 +vn -0.132388 0.912156 0.387873 +v -0.16576 3.25898 -1.41075 +vn -0.171187 0.893347 0.415484 +v -0.18545 3.35548 -1.5765 +vn -0.21031 0.756517 0.619235 +v -0.061199 3.37611 -1.57715 +vn -0.0495692 0.756576 0.652025 +v -0.204292 3.15582 -1.11876 +vn -0.210511 0.956011 0.204274 +v -0.237748 3.1569 -1.1585 +vn -0.242763 0.942966 0.227776 +v -0.201503 3.13091 -0.950419 +vn -0.218253 0.97245 0.0818892 +v -0.238645 3.12552 -0.98651 +vn -0.250593 0.961528 0.112548 +v -0.102193 3.18417 -1.16923 +vn -0.102727 0.965568 0.23901 +v -0.066282 3.15237 -0.964857 +vn -0.07057 0.993448 0.0898975 +v -0.102576 3.15297 -1.00151 +vn -0.108561 0.986773 0.120388 +v -0.403342 3.10279 -1.17889 +vn -0.41209 0.886305 0.211294 +v -0.37123 3.10778 -1.13953 +vn -0.376485 0.904443 0.200602 +v -0.501313 3.03655 -1.11017 +vn -0.506954 0.847952 0.154838 +v -0.402526 3.06926 -0.998657 +vn -0.404065 0.907038 0.118376 +v -0.338204 3.08824 -0.928635 +vn -0.349873 0.934265 0.0688301 +v -0.4726 3.02558 -0.892833 +vn -0.466249 0.883703 0.0410048 +v -0.201505 3.24133 -0.395609 +vn -0.295446 0.850868 -0.434436 +v -0.067281 3.2546 -0.432072 +vn -0.105067 0.883432 -0.456628 +v -0.513506 3.07503 -0.425033 +vn -0.502082 0.820032 -0.274702 +v -0.337342 3.2129 -0.331898 +vn -0.430702 0.809595 -0.398813 +v -0.51762 3.13881 -0.251233 +vn -0.534336 0.776999 -0.332802 +v -0.447084 3.26585 -0.10719 +vn -0.581019 0.686154 -0.437733 +v -0.479161 3.17257 -0.234528 +vn -0.527021 0.770207 -0.359209 +v -0.439477 3.20301 -0.227509 +vn -0.518736 0.762178 -0.387296 +v -0.200258 3.56268 -0.095914 +vn -0.45666 -0.0256198 -0.889272 +v -0.134519 3.56308 -0.126535 +vn -0.336472 -0.00802931 -0.941659 +v -0.066843 3.56137 -0.143247 +vn -0.1811 0.0156247 -0.983341 +v -0.328496 3.56412 -0.011764 +vn -0.623356 -0.0834974 -0.777467 +v -0.447718 3.56772 0.097634 +vn -0.71741 -0.142419 -0.681938 +v -1.24986 1.06238 0.341238 +vn -0.512294 -0.857296 0.0509845 +v -1.28181 1.08111 0.309274 +vn -0.562681 -0.82561 0.0419278 +v -1.28191 1.07844 0.228292 +vn -0.565378 -0.82471 0.0141694 +v -1.24449 1.05364 0.093187 +vn -0.517273 -0.85579 -0.00718078 +v -1.398 1.18465 0.261356 +vn -0.79373 -0.608013 0.0176721 +v -1.39625 1.18234 0.179022 +vn -0.794426 -0.607342 -0.00474388 +v -1.39363 1.18017 0.094981 +vn -0.792714 -0.609184 -0.0223614 +v -1.38884 1.17888 0.010277 +vn -0.792569 -0.608476 -0.0398855 +v -1.39926 1.19015 0.334642 +vn -0.801077 -0.597561 0.0345944 +v -1.4021 1.1995 0.4172 +vn -0.806549 -0.589301 0.0469368 +v -1.39463 1.19938 0.502453 +vn -0.791585 -0.60553 0.0820174 +v -1.39286 1.20966 0.585727 +vn -0.785727 -0.609497 0.105571 +v -1.22953 1.87675 -1.45046 +vn -0.818944 0.0153341 -0.573669 +v -1.55458 1.59861 0.487362 +vn -0.957796 -0.28175 0.0569543 +v -1.56535 1.62694 0.441968 +vn -0.960132 -0.275101 0.0496599 +v -1.51782 1.48014 0.48569 +vn -0.950159 -0.307271 0.0527427 +v -1.52822 1.50513 0.44009 +vn -0.951351 -0.304818 0.0449082 +v -1.55733 1.6427 0.620346 +vn -0.961243 -0.262339 0.0847986 +v -1.51212 1.50023 0.65588 +vn -0.95135 -0.296746 0.0829152 +v -1.57684 1.64335 0.208975 +vn -0.960946 -0.27667 0.00599317 +v -1.56771 1.61396 0.256665 +vn -0.95832 -0.285349 0.0141343 +v -1.56298 1.60124 0.06796 +vn -0.95476 -0.296484 -0.0230366 +v -1.53812 1.51842 0.2102 +vn -0.950616 -0.310366 0.00140003 +v -1.52922 1.49216 0.256056 +vn -0.949449 -0.313784 0.0092774 +v -1.52402 1.48235 0.068278 +vn -0.946146 -0.322384 -0.0296101 +v -1.62512 1.8556 0.294358 +vn -0.985964 -0.16462 0.0278444 +v -1.61854 1.82847 0.345372 +vn -0.98171 -0.186153 0.0399141 +v -1.6402 1.99105 0.285241 +vn -0.998978 -0.0360337 0.0273031 +v -1.63762 1.96957 0.33292 +vn -0.99706 -0.0659457 0.0390196 +v -1.62403 1.83841 0.107639 +vn -0.983751 -0.179365 -0.00789242 +v -1.61845 1.80881 0.15616 +vn -0.979891 -0.199529 0.0009702 +v -1.64054 1.97115 0.103003 +vn -0.998512 -0.0531875 -0.0119975 +v -1.63886 1.944 0.150974 +vn -0.99616 -0.087554 -0.000502909 +v -1.6 1.80611 0.572848 +vn -0.979747 -0.181591 0.0843784 +v -1.61587 1.86947 0.509387 +vn -0.986349 -0.144628 0.0787344 +v -1.6004 1.8806 0.687963 +vn -0.985342 -0.128223 0.11252 +v -1.62011 1.94395 0.564076 +vn -0.99203 -0.0881656 0.0900234 +v -1.21401 1.04961 -0.228359 +vn -0.5027 -0.861583 -0.0704816 +v -1.22765 1.05185 -0.149492 +vn -0.509942 -0.858452 -0.0549441 +v -1.23331 1.0511 -0.072615 +vn -0.514152 -0.856907 -0.0368578 +v -1.23967 1.05226 0.010301 +vn -0.513993 -0.857515 -0.0218782 +v -1.20609 1.05373 -0.313076 +vn -0.497612 -0.86131 -0.102603 +v -1.19285 1.05938 -0.408248 +vn -0.501718 -0.853824 -0.138793 +v -1.17741 1.06468 -0.487148 +vn -0.488245 -0.85585 -0.170696 +v -1.16254 1.07679 -0.578467 +vn -0.493328 -0.842834 -0.215078 +v -1.29276 1.14442 -0.470475 +vn -0.673913 -0.715386 -0.184565 +v -1.34434 1.18005 -0.387244 +vn -0.777179 -0.613628 -0.139478 +v -1.35562 1.17591 -0.304501 +vn -0.777569 -0.615283 -0.129667 +v -1.36517 1.17583 -0.241249 +vn -0.783858 -0.612699 -0.100832 +v -1.37454 1.17661 -0.159691 +vn -0.788641 -0.609777 -0.0788517 +v -1.38278 1.17718 -0.07479 +vn -0.789671 -0.610753 -0.0583193 +v -1.52014 1.46676 0.303497 +vn -0.948877 -0.315128 0.0180811 +v -1.51752 1.45996 0.110689 +vn -0.946274 -0.322661 -0.021316 +v -1.50976 1.44622 0.020876 +vn -0.943224 -0.329418 -0.0425597 +v -1.50473 1.42572 0.073351 +vn -0.94502 -0.32543 -0.0321416 +v -1.48107 1.38357 0.559772 +vn -0.938873 -0.338016 0.0652944 +v -1.38997 1.22111 0.662393 +vn -0.780773 -0.610604 0.132503 +v -1.31943 2.27011 1.48137 +vn -0.702331 0.301009 0.645077 +v -1.34612 2.25995 1.45545 +vn -0.750284 0.290466 0.593889 +v -1.32854 2.21626 1.49429 +vn -0.711586 0.247542 0.657547 +v -1.33623 2.16403 1.50359 +vn -0.728464 0.197134 0.656109 +v -1.34446 2.10888 1.50853 +vn -0.739059 0.13903 0.659137 +v -1.42236 2.17417 1.37364 +vn -0.877241 0.19193 0.440013 +v -1.45327 2.21403 1.28076 +vn -0.909225 0.23338 0.344737 +v -1.45261 2.17039 1.30783 +vn -0.908622 0.186797 0.373513 +v -1.43762 2.26726 1.28153 +vn -0.892822 0.281609 0.351519 +v -1.42973 2.31489 1.26009 +vn -0.885602 0.325316 0.331479 +v -1.40886 2.36654 1.26053 +vn -0.865448 0.370148 0.337624 +v -1.39738 2.41286 1.23584 +vn -0.856553 0.408167 0.31578 +v -1.49522 1.57813 -0.541242 +vn -0.922999 -0.344827 -0.170784 +v -1.49054 1.5372 -0.479737 +vn -0.92169 -0.354395 -0.15777 +v -1.46266 1.59644 -0.723806 +vn -0.910835 -0.345171 -0.226354 +v -1.46241 1.48939 -0.531377 +vn -0.91538 -0.363439 -0.17318 +v -1.47408 1.53152 -0.558215 +vn -0.915052 -0.361929 -0.17801 +v -1.56901 1.76598 -0.458691 +vn -0.960774 -0.239525 -0.139793 +v -1.5694 1.74219 -0.41077 +vn -0.958157 -0.257458 -0.125107 +v -1.59055 1.87582 -0.45525 +vn -0.981852 -0.111699 -0.153263 +v -1.59403 1.8572 -0.412903 +vn -0.980187 -0.149154 -0.13033 +v -1.53177 1.74955 -0.643541 +vn -0.946583 -0.251517 -0.201792 +v -1.53449 1.72563 -0.597566 +vn -0.944127 -0.2727 -0.185093 +v -1.55328 1.85135 -0.641039 +vn -0.968778 -0.12096 -0.21642 +v -1.5593 1.83254 -0.598873 +vn -0.968874 -0.157815 -0.190729 +v -1.5918 1.73949 -0.174162 +vn -0.966059 -0.249765 -0.0659387 +v -1.59477 1.76527 -0.222555 +vn -0.96871 -0.236333 -0.0758131 +v -1.61101 1.78924 -0.033263 +vn -0.975851 -0.215626 -0.0349261 +v -1.61848 1.86619 -0.178063 +vn -0.985959 -0.153117 -0.0666377 +v -1.61824 1.88899 -0.225823 +vn -0.988738 -0.126679 -0.079682 +v -1.63289 1.9198 -0.037203 +vn -0.993759 -0.104987 -0.0376955 +v -1.52444 1.54708 -0.258849 +vn -0.937881 -0.332844 -0.0979534 +v -1.52679 1.5697 -0.309984 +vn -0.938011 -0.328683 -0.110016 +v -1.486 1.44198 -0.257591 +vn -0.93136 -0.347256 -0.109462 +v -1.48645 1.45779 -0.302325 +vn -0.929694 -0.348463 -0.119341 +v -1.54403 1.56019 -0.072728 +vn -0.947385 -0.315312 -0.0551281 +v -1.54986 1.58687 -0.120824 +vn -0.947992 -0.31188 -0.0635699 +v -1.50587 1.45058 -0.075557 +vn -0.940561 -0.3336 -0.0636856 +v -1.51049 1.47226 -0.118372 +vn -0.939505 -0.334825 -0.0722638 +v -1.11025 2.90138 0.820888 +vn -0.467192 0.877988 0.104252 +v -1.11295 2.90692 0.745317 +vn -0.469797 0.880779 0.0593198 +v -1.11547 2.90892 0.668526 +vn -0.455503 0.890039 0.0186393 +v -1.11761 2.90743 0.591236 +vn -0.45678 0.889166 -0.027107 +v -1.10839 2.89199 0.894286 +vn -0.479278 0.865564 0.145228 +v -1.10761 2.87867 0.964785 +vn -0.479511 0.856091 0.192814 +v -1.10891 2.86114 1.03142 +vn -0.492988 0.837014 0.237427 +v -1.11237 2.83935 1.09365 +vn -0.498388 0.817044 0.28991 +v -1.23847 2.79599 0.864692 +vn -0.721352 0.681068 0.125687 +v -1.19815 2.83962 0.837779 +vn -0.651243 0.749581 0.11837 +v -1.20422 2.84296 0.770826 +vn -0.660079 0.747662 0.0727749 +v -1.20741 2.84631 0.699464 +vn -0.655008 0.753644 0.054639 +v -1.2106 2.84667 0.625677 +vn -0.649315 0.760493 0.00629887 +v -1.43838 1.84627 1.36551 +vn -0.891807 -0.115047 0.437543 +v -1.35064 1.8923 1.50767 +vn -0.751276 -0.10054 0.652285 +v -1.35268 1.94656 1.51113 +vn -0.757033 -0.0405287 0.652118 +v -1.35215 2.00072 1.51277 +vn -0.753148 0.0185711 0.657589 +v -1.34967 2.05495 1.5115 +vn -0.749819 0.0782455 0.657 +v -1.34781 1.83687 1.49981 +vn -0.746732 -0.157907 0.646109 +v -1.34027 1.78439 1.49318 +vn -0.731393 -0.214632 0.6473 +v -1.33346 1.73074 1.48046 +vn -0.721683 -0.270797 0.637058 +v -1.32181 1.67979 1.46954 +vn -0.697865 -0.327326 0.637057 +v -1.46974 1.84425 1.29155 +vn -0.929043 -0.105536 0.354601 +v -1.45807 1.7346 1.27665 +vn -0.916217 -0.186904 0.354419 +v -0.986475 1.6789 -1.65922 +vn -0.670618 -0.29856 -0.679068 +v -1.1263 2.46559 -0.971879 +vn -0.552817 0.813966 -0.178474 +v -1.08878 2.48659 -0.984855 +vn -0.517351 0.839825 -0.164446 +v -1.16979 2.43734 -0.955912 +vn -0.617993 0.760386 -0.199745 +v -1.21642 2.40101 -0.936472 +vn -0.683971 0.694421 -0.223524 +v -1.23111 2.41124 -0.856887 +vn -0.672909 0.708788 -0.211692 +v -1.25357 2.43625 -0.712787 +vn -0.648883 0.723319 -0.236138 +v -1.26035 2.45623 -0.632308 +vn -0.627805 0.736879 -0.250739 +v -1.0573 2.50336 -0.996606 +vn -0.540551 0.826925 -0.154919 +v -1.17608 2.66646 1.32035 +vn -0.584444 0.632284 0.508568 +v -1.12859 2.78228 1.20171 +vn -0.529364 0.751258 0.394188 +v -1.1169 2.8137 1.15207 +vn -0.5134 0.788332 0.339048 +v -1.20788 2.64173 1.31307 +vn -0.625299 0.609723 0.487073 +v -1.22842 2.59768 1.33856 +vn -0.651999 0.561117 0.509946 +v -1.24509 2.55163 1.36624 +vn -0.657087 0.534652 0.531398 +v -1.31731 2.59813 1.16342 +vn -0.797544 0.536935 0.275 +v -1.33309 2.55605 1.19512 +vn -0.808202 0.507123 0.299391 +v -1.359 2.50805 1.2036 +vn -0.827993 0.475748 0.296801 +v -1.37339 2.46295 1.23192 +vn -0.836246 0.445461 0.319775 +v -1.1154 2.85181 0.208681 +vn -0.399435 0.888117 -0.227376 +v -1.11447 2.83105 0.132827 +vn -0.402341 0.877096 -0.262343 +v -1.11647 2.80868 0.065082 +vn -0.379983 0.879466 -0.286623 +v -1.11153 2.77911 -0.024404 +vn -0.391284 0.861422 -0.323804 +v -1.11694 2.86927 0.284968 +vn -0.419368 0.887427 -0.191322 +v -1.11792 2.88363 0.361145 +vn -0.419207 0.895119 -0.15175 +v -1.11867 2.89475 0.437524 +vn -0.439101 0.891318 -0.112885 +v -1.1185 2.90273 0.514223 +vn -0.438736 0.895981 -0.068775 +v -1.21572 2.8319 0.415917 +vn -0.627383 0.773766 -0.0876208 +v -1.26504 2.76837 0.28109 +vn -0.675369 0.725667 -0.131467 +v -1.26779 2.75223 0.212395 +vn -0.666896 0.727278 -0.162226 +v -1.27019 2.73228 0.14053 +vn -0.655112 0.731131 -0.190464 +v -1.27116 2.71104 0.06622 +vn -0.642107 0.734575 -0.219311 +v -1.0911 1.33432 1.4198 +vn -0.555943 -0.655279 0.511406 +v -1.07386 1.29047 1.37875 +vn -0.527917 -0.698803 0.482678 +v -1.12121 1.4331 1.49853 +vn -0.60243 -0.561206 0.567562 +v -1.15375 1.53626 1.55332 +vn -0.634638 -0.459893 0.621074 +v -0.815318 1.32744 1.67115 +vn -0.456631 -0.654056 0.603075 +v -0.674769 1.30095 1.73382 +vn -0.350222 -0.688673 0.634882 +v -0.843155 1.43566 1.7497 +vn -0.493718 -0.53054 0.689035 +v -0.698126 1.41077 1.81941 +vn -0.381886 -0.550936 0.742047 +v -0.730246 1.38813 1.78428 +vn -0.404342 -0.579244 0.707802 +v -0.784384 1.2228 1.56059 +vn -0.395535 -0.765321 0.507776 +v -0.458801 1.16251 1.64992 +vn -0.18437 -0.83676 0.515597 +v -0.612371 1.1815 1.61172 +vn -0.278871 -0.81422 0.509192 +v -0.489407 1.11258 1.54531 +vn -0.181299 -0.887012 0.424666 +v -0.448649 1.09288 1.51876 +vn -0.153098 -0.904761 0.397452 +v -0.59911 1.11063 1.48578 +vn -0.241386 -0.881981 0.404775 +v -0.443749 1.32629 1.85077 +vn -0.207023 -0.643223 0.73716 +v -0.481203 1.30209 1.81743 +vn -0.224925 -0.675655 0.702068 +v -0.498672 1.41918 1.90505 +vn -0.245797 -0.530249 0.811431 +v -0.608725 1.34248 1.80654 +vn -0.310946 -0.629102 0.712421 +v -0.642053 1.32069 1.77104 +vn -0.331001 -0.657778 0.676585 +v -0.66436 1.43541 1.85325 +vn -0.357481 -0.519652 0.775996 +v -0.174046 1.2473 1.82469 +vn -0.0744394 -0.735524 0.673397 +v -0.06606 1.31244 1.89571 +vn -0.0260113 -0.653005 0.756907 +v -0.182932 1.37102 1.93385 +vn -0.0821472 -0.585215 0.806706 +v -0.225444 1.34347 1.90821 +vn -0.0974044 -0.615345 0.782217 +v -0.253303 1.13034 1.64896 +vn -0.0856637 -0.872181 0.481624 +v -0.296287 1.15109 1.67664 +vn -0.106993 -0.849283 0.516983 +v -0.248066 1.06578 1.51008 +vn -0.0684983 -0.928789 0.364223 +v -0.289711 1.0822 1.54186 +vn -0.0866255 -0.916633 0.390231 +v -0.085358 1.12782 1.66378 +vn -0.0280357 -0.874975 0.483355 +v -0.128335 1.14585 1.69204 +vn -0.0435479 -0.855513 0.515947 +v -0.083358 1.06327 1.52366 +vn -0.0220194 -0.931735 0.362471 +v -0.12536 1.07735 1.55546 +vn -0.0346274 -0.921521 0.386781 +v -1.20054 1.75959 1.62386 +vn -0.66557 -0.229363 0.710218 +v -1.181 1.6456 1.59475 +vn -0.65473 -0.348673 0.670638 +v -1.10417 2.04478 1.73656 +vn -0.630131 0.0772099 0.77264 +v -1.21177 1.87685 1.64064 +vn -0.669121 -0.104538 0.735764 +v -1.19387 2.04604 1.65979 +vn -0.659163 0.0776772 0.747978 +v -1.21711 1.9956 1.64246 +vn -0.666887 0.0214464 0.74485 +v -0.928212 1.79932 1.85421 +vn -0.545663 -0.156985 0.823169 +v -0.783928 1.77878 1.93503 +vn -0.447403 -0.164753 0.879026 +v -0.785779 2.01166 1.9499 +vn -0.447446 0.0442215 0.893217 +v -0.915416 1.66328 1.82521 +vn -0.539815 -0.290262 0.790157 +v -0.804051 1.6139 1.87566 +vn -0.464035 -0.331524 0.82144 +v -0.769992 1.64381 1.90543 +vn -0.438579 -0.298184 0.847782 +v -0.752529 1.5092 1.85423 +vn -0.426691 -0.439604 0.790369 +v -0.567499 1.64795 1.99032 +vn -0.288344 -0.282981 0.914757 +v -0.495696 1.58818 1.99117 +vn -0.248232 -0.336508 0.908374 +v -0.732942 1.67447 1.93371 +vn -0.408184 -0.262588 0.874319 +v -0.553819 1.51879 1.94396 +vn -0.286343 -0.419587 0.861368 +v -0.524256 1.55198 1.96857 +vn -0.262263 -0.382032 0.886154 +v -0.718477 1.5367 1.88619 +vn -0.400685 -0.407044 0.820833 +v -0.6828 1.56604 1.91641 +vn -0.373634 -0.374165 0.848763 +v -0.484415 1.90498 2.05916 +vn -0.242761 -0.0548091 0.968537 +v -0.437476 1.86538 2.06729 +vn -0.215221 -0.0889625 0.972505 +v -0.484092 2.06985 2.05661 +vn -0.246906 0.0863498 0.965185 +v -0.438173 2.03166 2.07035 +vn -0.219466 0.0516217 0.974253 +v -0.663095 1.89824 2.00285 +vn -0.354526 -0.0586297 0.933206 +v -0.618642 1.86017 2.01598 +vn -0.325477 -0.0924298 0.941021 +v -0.661707 2.05728 2.00143 +vn -0.358089 0.0823729 0.930047 +v -0.619254 2.02027 2.01954 +vn -0.328344 0.0479847 0.943339 +v -0.197312 1.8305 2.1007 +vn -0.0920945 -0.120235 0.988464 +v -0.246462 1.87163 2.09984 +vn -0.115821 -0.0859446 0.989545 +v -0.049597 1.84444 2.11128 +vn -0.0245458 -0.109918 0.993638 +v -0.049655 1.88753 2.11517 +vn -0.0250313 -0.0744611 0.99691 +v -0.197947 2.00175 2.10933 +vn -0.0949728 0.0197765 0.995283 +v -0.246749 2.04233 2.10257 +vn -0.119296 0.0545859 0.991357 +v -0.049667 2.01721 2.1182 +vn -0.0255522 0.0298684 0.999227 +v -0.049609 2.06028 2.11602 +vn -0.0260396 0.0662826 0.997461 +v -0.312336 1.58516 2.02898 +vn -0.146396 -0.339318 0.92921 +v -0.349816 1.62439 2.03613 +vn -0.16526 -0.300033 0.939505 +v -0.238709 1.46623 1.98692 +vn -0.109471 -0.462274 0.879954 +v -0.095894 1.58815 2.05165 +vn -0.0440129 -0.33508 0.941161 +v -0.099984 1.66797 2.07624 +vn -0.0511545 -0.259853 0.964292 +v -0.147857 1.6199 2.05925 +vn -0.069796 -0.297184 0.952266 +v -0.1926 1.49234 2.00498 +vn -0.0824726 -0.432866 0.897678 +v -1.00476 2.54597 1.60864 +vn -0.575153 0.495404 0.650979 +v -1.08159 2.41622 1.62829 +vn -0.607987 0.404217 0.683345 +v -0.86437 2.39974 1.80526 +vn -0.505583 0.372698 0.778128 +v -0.892761 2.42692 1.77261 +vn -0.523586 0.396136 0.754277 +v -0.751277 2.45343 1.84646 +vn -0.436925 0.403388 0.803974 +v -0.841523 2.53444 1.74491 +vn -0.504027 0.469039 0.72523 +v -0.893113 2.57727 1.67757 +vn -0.526344 0.506048 0.683284 +v -0.731103 2.58699 1.7804 +vn -0.434383 0.497066 0.751157 +v -0.956442 2.18386 1.82296 +vn -0.555714 0.204698 0.805779 +v -0.984777 2.21523 1.7943 +vn -0.571515 0.234255 0.786445 +v -0.815619 2.19694 1.90702 +vn -0.470126 0.209477 0.85738 +v -0.849705 2.22955 1.87896 +vn -0.493172 0.23811 0.836711 +v -0.824199 2.0473 1.92736 +vn -0.475838 0.0776401 0.876099 +v -0.861081 2.08203 1.9028 +vn -0.501139 0.108089 0.85859 +v -0.564668 2.30046 1.98756 +vn -0.303871 0.278332 0.91115 +v -0.522695 2.26663 2.01053 +vn -0.276717 0.250209 0.927806 +v -0.694601 2.24713 1.95342 +vn -0.386604 0.244689 0.889193 +v -0.572469 2.14354 2.02189 +vn -0.302386 0.153505 0.940744 +v -0.528898 2.10715 2.04041 +vn -0.274311 0.120681 0.954038 +v -0.70267 2.09347 1.98097 +vn -0.387486 0.11617 0.914527 +v -0.459954 2.53515 1.92537 +vn -0.256888 0.434917 0.86305 +v -0.418488 2.5049 1.95163 +vn -0.230365 0.411916 0.881622 +v -0.44705 2.67182 1.85128 +vn -0.265356 0.520682 0.811466 +v -0.407141 2.645 1.88013 +vn -0.238203 0.499559 0.832887 +v -0.62921 2.50892 1.87744 +vn -0.358516 0.43269 0.827191 +v -0.59192 2.48041 1.90712 +vn -0.332116 0.409776 0.849578 +v -0.611605 2.6429 1.80529 +vn -0.3618 0.52224 0.772248 +v -0.575952 2.61798 1.83739 +vn -0.33623 0.501192 0.797343 +v -0.189699 2.48968 2.00067 +vn -0.103464 0.388149 0.915771 +v -0.235314 2.52347 1.97995 +vn -0.129799 0.411615 0.902067 +v 0 2.51538 2.0006 +vn 9.00759e-07 0.398939 0.916977 +v -0.047084 2.54364 1.98721 +vn -0.0278911 0.417218 0.908378 +v -0.184673 2.63425 1.93139 +vn -0.108957 0.474276 0.873608 +v -0.228873 2.66493 1.90794 +vn -0.137055 0.494932 0.858055 +v 0 2.65878 1.92987 +vn -1.02136e-06 0.481223 0.876598 +v -0.045757 2.6847 1.91453 +vn -0.0299326 0.496722 0.867393 +v -0.291998 2.24782 2.06672 +vn -0.148247 0.224099 0.963225 +v -0.338372 2.28447 2.04975 +vn -0.173979 0.254064 0.951411 +v -0.29499 2.08217 2.09323 +vn -0.144837 0.0896765 0.985383 +v -0.34251 2.12106 2.08135 +vn -0.170597 0.124483 0.977446 +v -0.099824 2.26099 2.08347 +vn -0.0564107 0.228798 0.971838 +v -0.146161 2.29741 2.07118 +vn -0.0758146 0.2577 0.963246 +v -0.100997 2.09366 2.11121 +vn -0.055114 0.0944141 0.994006 +v -0.100512 2.17815 2.10013 +vn -0.0558269 0.164017 0.984876 +v -0.148099 2.13194 2.10388 +vn -0.0741612 0.127911 0.989009 +v -1.05547 2.71211 1.39539 +vn -0.565857 0.646131 0.512173 +v -0.993102 2.73381 1.4368 +vn -0.559948 0.647035 0.517497 +v -1.01786 2.83826 1.24229 +vn -0.533393 0.758471 0.374451 +v -0.769002 2.86954 1.4903 +vn -0.50311 0.68091 0.532204 +v -0.801248 2.89786 1.41931 +vn -0.524499 0.702164 0.481524 +v -0.636831 2.92962 1.53121 +vn -0.461123 0.67147 0.58008 +v -0.626522 3.03796 1.4082 +vn -0.528519 0.661867 0.531601 +v -0.657933 3.04477 1.36561 +vn -0.568843 0.660315 0.490308 +v -0.737323 2.73232 1.66337 +vn -0.460098 0.597425 0.656806 +v -0.762653 2.61134 1.74452 +vn -0.458946 0.520305 0.720174 +v -0.47035 2.81878 1.73466 +vn -0.309337 0.607278 0.731795 +v -0.625549 2.78593 1.68566 +vn -0.395772 0.61475 0.682237 +v -0.522777 2.72118 1.78926 +vn -0.319221 0.561519 0.76341 +v -0.485605 2.69718 1.82099 +vn -0.292578 0.541518 0.788135 +v -0.64565 2.66647 1.77196 +vn -0.38666 0.542353 0.745887 +v -0.333868 2.98027 1.64943 +vn -0.272681 0.63663 0.721351 +v -0.436439 3.09988 1.49113 +vn -0.397673 0.634212 0.663047 +v -0.561464 2.99151 1.51919 +vn -0.440901 0.661698 0.606434 +v -0.546237 3.10854 1.40234 +vn -0.515928 0.624854 0.585983 +v -0.587142 3.07402 1.40326 +vn -0.527416 0.645972 0.551862 +v -0.167531 3.00027 1.68018 +vn -0.148167 0.62414 0.767135 +v -0.207345 3.02385 1.65196 +vn -0.186773 0.628882 0.754734 +v -0.16214 3.10806 1.59246 +vn -0.162883 0.630145 0.759201 +v -0.263661 2.81997 1.80022 +vn -0.180324 0.578701 0.795354 +v -0.304351 2.84473 1.77154 +vn -0.212233 0.594782 0.775366 +v -0.272057 2.69416 1.88289 +vn -0.165337 0.514903 0.841153 +v -0.314145 2.72185 1.85632 +vn -0.194294 0.535056 0.822171 +v -0.088076 2.83597 1.81592 +vn -0.0657069 0.571503 0.817965 +v -0.131145 2.86132 1.79348 +vn -0.0989989 0.584111 0.805614 +v -0.090932 2.70996 1.89742 +vn -0.0590067 0.511371 0.857332 +v -0.135449 2.73792 1.87646 +vn -0.0886916 0.528206 0.844471 +v -0.534633 4.09214 -0.30329 +vn -0.551636 -0.509881 -0.66009 +v -0.54267 4.12419 -0.320711 +vn -0.554833 -0.486916 -0.674591 +v -0.501913 3.98549 -0.237878 +vn -0.526451 -0.595902 -0.606424 +v -0.511445 4.01178 -0.254885 +vn -0.533253 -0.5756 -0.619941 +v -0.729231 4.14594 -0.142705 +vn -0.707042 -0.457152 -0.53954 +v -0.738357 4.17933 -0.158092 +vn -0.714514 -0.428385 -0.553133 +v -0.688669 4.03308 -0.085292 +vn -0.665905 -0.55799 -0.495195 +v -0.700734 4.06122 -0.099999 +vn -0.676833 -0.534687 -0.505971 +v -0.312911 4.08406 -0.439266 +vn -0.353208 -0.521829 -0.776491 +v -0.307133 4.05301 -0.420373 +vn -0.353356 -0.540586 -0.763483 +v -0.063033 4.05487 -0.489971 +vn -0.081732 -0.529904 -0.84411 +v -0.061572 4.02739 -0.472159 +vn -0.0813933 -0.555012 -0.827851 +v -0.292464 3.97577 -0.368239 +vn -0.344705 -0.598862 -0.722871 +v -0.286652 3.95081 -0.349712 +vn -0.341469 -0.617532 -0.708557 +v -0.058256 3.95189 -0.417632 +vn -0.0807476 -0.61503 -0.784358 +v -0.056959 3.92768 -0.398237 +vn -0.0805404 -0.633013 -0.76994 +v -0.321517 4.18481 -0.494079 +vn -0.361156 -0.413629 -0.835749 +v -0.320666 4.21796 -0.510185 +vn -0.363673 -0.389974 -0.845968 +v -0.318105 4.30601 -0.547405 +vn -0.362796 -0.313144 -0.877679 +v -0.316425 4.3364 -0.558323 +vn -0.362562 -0.285837 -0.887043 +v -0.065792 4.17559 -0.557125 +vn -0.081974 -0.43946 -0.894514 +v -0.06519 4.2058 -0.571319 +vn -0.0817567 -0.410961 -0.907979 +v -0.06441 4.29514 -0.607399 +vn -0.082238 -0.333525 -0.939147 +v -0.063973 4.32604 -0.617847 +vn -0.0823716 -0.307372 -0.948018 +v -0.659118 4.25347 -0.294814 +vn -0.660235 -0.343652 -0.667827 +v -0.670353 4.23358 -0.272846 +vn -0.671276 -0.363223 -0.64611 +v -0.865255 4.33722 -0.064229 +vn -0.855363 -0.217882 -0.469981 +v -0.831413 4.31659 -0.111801 +vn -0.816411 -0.252843 -0.519176 +v -0.839609 4.29702 -0.088714 +vn -0.824339 -0.268945 -0.49813 +v -0.654599 4.37289 -0.349323 +vn -0.668725 -0.226889 -0.708046 +v -0.656714 4.34379 -0.337171 +vn -0.668129 -0.257321 -0.698133 +v -0.858335 4.45209 -0.115533 +vn -0.860737 -0.103107 -0.498499 +v -0.824991 4.43511 -0.165622 +vn -0.826283 -0.132786 -0.54738 +v -0.82783 4.40653 -0.15335 +vn -0.825831 -0.164143 -0.539499 +v -0.289949 3.67728 1.27141 +vn -0.289501 -0.159636 0.943772 +v -0.289484 3.59027 1.26825 +vn -0.317628 0.0758906 0.945173 +v -0.150546 3.5883 1.3026 +vn -0.159039 0.124367 0.979408 +v -0.300072 3.76292 1.29406 +vn -0.262932 -0.373267 0.889685 +v -0.55348 3.74854 1.16127 +vn -0.568897 -0.362006 0.73845 +v -0.532362 3.64327 1.14001 +vn -0.616932 -0.164473 0.769638 +v -0.31142 3.83845 1.3313 +vn -0.244992 -0.518249 0.819388 +v -0.320767 3.90438 1.37626 +vn -0.237037 -0.603466 0.761342 +v -0.578895 3.84521 1.19976 +vn -0.540585 -0.484723 0.687613 +v -0.55507 3.95079 1.30031 +vn -0.472378 -0.565402 0.676151 +v -0.717287 3.60055 0.871512 +vn -0.913083 -0.234034 0.333927 +v -0.744809 3.59611 0.743806 +vn -0.959464 -0.266244 0.0924287 +v -0.890347 4.12466 1.01247 +vn -0.861554 -0.336742 0.379908 +v -0.961637 4.20278 0.882769 +vn -0.931911 -0.26598 0.246568 +v -0.965898 4.15803 0.797644 +vn -0.936303 -0.311649 0.161902 +v -0.707308 3.92657 1.13783 +vn -0.678866 -0.480302 0.555384 +v -0.703762 3.58652 0.479332 +vn -0.907783 -0.2547 -0.333253 +v -0.740205 3.59241 0.612048 +vn -0.952113 -0.272129 -0.139375 +v -0.639799 3.5796 0.347942 +vn -0.847924 -0.223674 -0.480619 +v -0.552908 3.57292 0.21991 +vn -0.784694 -0.185342 -0.591526 +v -0.865754 3.9871 0.35315 +vn -0.837293 -0.495243 -0.231679 +v -0.862418 3.9611 0.398029 +vn -0.846287 -0.487264 -0.215341 +v -0.935458 4.12634 0.33134 +vn -0.891049 -0.408516 -0.197857 +v -0.937292 4.10761 0.382926 +vn -0.88988 -0.425277 -0.165085 +v -0.777526 3.94514 0.188442 +vn -0.751768 -0.564827 -0.340317 +v -0.781703 3.92268 0.235519 +vn -0.763466 -0.554873 -0.330509 +v -0.858355 4.05309 0.202045 +vn -0.810841 -0.504353 -0.296925 +v -0.841007 4.02071 0.211149 +vn -0.795995 -0.526022 -0.299486 +v -0.896472 3.96274 0.600478 +vn -0.903076 -0.425278 -0.0599328 +v -0.908345 3.99422 0.562085 +vn -0.900091 -0.427824 -0.0824759 +v -0.897169 3.97164 0.751951 +vn -0.908809 -0.403193 0.107248 +v -0.917975 4.01301 0.723825 +vn -0.916948 -0.391967 0.0746177 +v -0.96591 4.12088 0.611856 +vn -0.934142 -0.356748 -0.0104614 +v -0.976004 4.15096 0.567372 +vn -0.939348 -0.340806 -0.0384206 +v -0.983034 4.19215 0.755375 +vn -0.949689 -0.291161 0.115392 +v -0.944783 4.847 0.358227 +vn -0.962907 0.258779 -0.0764407 +v -0.950913 4.82767 0.37538 +vn -0.968321 0.242866 -0.0580516 +v -0.971002 4.743 0.379567 +vn -0.974403 0.216426 -0.0608117 +v -0.982304 4.70525 0.441343 +vn -0.975035 0.219301 -0.0348349 +v -0.968589 4.7641 0.432777 +vn -0.973819 0.225966 -0.0248093 +v -0.924202 4.92396 0.576697 +vn -0.956295 0.285245 0.0642998 +v -0.952158 4.81584 0.593742 +vn -0.965357 0.25156 0.0693022 +v -0.954417 4.78199 0.667635 +vn -0.959005 0.264184 0.102549 +v -0.942227 4.83753 0.643678 +vn -0.961426 0.256753 0.0986845 +v -0.907644 4.75411 0.047857 +vn -0.927597 0.210058 -0.308934 +v -0.897419 4.77933 0.035553 +vn -0.919864 0.227286 -0.319673 +v -0.799347 4.67925 -0.204578 +vn -0.825413 0.118559 -0.551939 +v -0.827864 4.69365 -0.155703 +vn -0.853185 0.141698 -0.501994 +v -0.817022 4.72121 -0.165451 +vn -0.84554 0.163783 -0.508171 +v -0.942676 4.65075 0.099565 +vn -0.953024 0.138716 -0.269264 +v -0.934766 4.677 0.08653 +vn -0.947471 0.156948 -0.278686 +v -0.835705 4.56588 -0.162663 +vn -0.849427 0.0156053 -0.527475 +v -0.86457 4.58216 -0.112077 +vn -0.878901 0.0437909 -0.47499 +v -0.856424 4.61019 -0.123499 +vn -0.873306 0.0694142 -0.482201 +v -0.864147 4.85379 0.001332 +vn -0.895014 0.276821 -0.349742 +v -0.852213 4.87821 -0.008862 +vn -0.886135 0.294509 -0.357812 +v -0.801537 4.97425 -0.042097 +vn -0.849065 0.358264 -0.388247 +v -0.75374 4.79078 -0.237512 +vn -0.794317 0.210035 -0.57004 +v -0.781912 4.8029 -0.191183 +vn -0.820469 0.227695 -0.52439 +v -0.769449 4.82973 -0.198246 +vn -0.811545 0.248035 -0.52903 +v -0.703441 4.89895 -0.257654 +vn -0.75827 0.296866 -0.580429 +v -0.731015 4.90884 -0.214476 +vn -0.782929 0.308771 -0.540077 +v -0.718006 4.93466 -0.217845 +vn -0.773048 0.329639 -0.541974 +v -0.92814 4.87582 0.275956 +vn -0.951116 0.281982 -0.125955 +v -0.905632 4.99133 0.494269 +vn -0.939971 0.341201 0.00610499 +v -0.896235 4.98376 0.301182 +vn -0.931151 0.341691 -0.127302 +v -0.775113 3.17701 0.539606 +vn -0.824141 0.558755 -0.0926538 +v -0.624213 3.20653 0.093432 +vn -0.698856 0.640843 -0.31768 +v -0.554857 3.20581 -0.045341 +vn -0.631752 0.690804 -0.35168 +v -0.605253 3.15345 -0.061583 +vn -0.620121 0.718455 -0.315075 +v -0.735586 3.26522 0.801231 +vn -0.938429 0.327408 0.11025 +v -0.707218 3.25255 0.961493 +vn -0.89066 0.370245 0.2639 +v -0.778109 3.1731 0.812566 +vn -0.84069 0.531726 0.102504 +v -0.765925 3.20233 0.763132 +vn -0.893253 0.446422 0.0529733 +v -0.712204 3.43249 0.793139 +vn -0.98842 -0.0266359 0.149385 +v -0.801536 2.5931 -1.68246 +vn -0.862104 0.373451 -0.342508 +v -0.901223 2.49463 -1.53787 +vn -0.85888 0.407196 -0.31067 +v -0.811797 2.70848 -1.46863 +vn -0.853603 0.483626 -0.193566 +v -0.916469 2.39673 -1.60917 +vn -0.853357 0.361509 -0.375624 +v -0.934776 2.29141 -1.65922 +vn -0.8437 0.317064 -0.433175 +v -0.685695 2.69411 -1.85257 +vn -0.852444 0.330296 -0.405271 +v -0.684703 2.72587 -1.82714 +vn -0.85733 0.347418 -0.379849 +v -0.556094 2.89872 -1.96466 +vn -0.859835 0.308181 -0.407073 +v -0.581794 2.85642 -1.94301 +vn -0.859913 0.312822 -0.403351 +v -0.582658 2.88818 -1.91433 +vn -0.866988 0.331762 -0.371842 +v -0.688163 2.55153 -1.94087 +vn -0.81268 0.259482 -0.521747 +v -0.68851 2.59172 -1.91833 +vn -0.827893 0.282835 -0.484353 +v -0.538281 2.76659 -2.06903 +vn -0.797374 0.226001 -0.559569 +v -0.566688 2.71422 -2.0491 +vn -0.802924 0.224324 -0.552261 +v -0.569681 2.7595 -2.02464 +vn -0.822515 0.244482 -0.513514 +v -0.67985 2.8134 -1.74401 +vn -0.866941 0.397226 -0.30104 +v -0.677755 2.8391 -1.71376 +vn -0.867096 0.415923 -0.274141 +v -0.669911 2.9048 -1.61581 +vn -0.858706 0.483371 -0.170224 +v -0.662563 2.92699 -1.58253 +vn -0.845566 0.520076 -0.12058 +v -0.554202 3.02006 -1.84433 +vn -0.884027 0.384995 -0.265095 +v -0.579572 2.9769 -1.82409 +vn -0.879729 0.388839 -0.273645 +v -0.57679 3.0033 -1.79224 +vn -0.878957 0.412221 -0.239809 +v -0.531413 3.1196 -1.70919 +vn -0.859015 0.509276 -0.0522489 +v -0.560101 3.07465 -1.69084 +vn -0.857803 0.506454 -0.0876244 +v -0.546987 3.09888 -1.65561 +vn -0.833131 0.552859 -0.0154859 +v -0.531061 3.06493 -1.85821 +vn -0.889885 0.383024 -0.247785 +v -0.53092 3.04384 -1.8876 +vn -0.88681 0.36044 -0.289223 +v -0.436471 3.28608 -1.79252 +vn -0.876529 0.481084 0.0159425 +v -0.505544 3.16343 -1.7287 +vn -0.867331 0.496881 -0.0290832 +v -0.515607 3.13969 -1.76164 +vn -0.881484 0.46054 -0.104346 +v -0.440385 3.14832 -2.02593 +vn -0.873273 0.316985 -0.370021 +v -0.436919 3.12682 -2.05061 +vn -0.862226 0.29439 -0.412189 +v -0.415101 3.06255 -2.12481 +vn -0.79918 0.238603 -0.551707 +v -0.404301 3.04238 -2.14754 +vn -0.766521 0.215137 -0.605113 +v -0.531728 2.95076 -1.97737 +vn -0.865179 0.308313 -0.395485 +v -0.528724 2.92082 -2.00561 +vn -0.853927 0.289074 -0.432717 +v -0.51073 2.82172 -2.08608 +vn -0.786654 0.219066 -0.577222 +v -0.505382 2.77393 -2.11003 +vn -0.750674 0.202139 -0.62899 +v -0.30952 3.49378 -2.00518 +vn -0.871259 0.417082 -0.258746 +v -0.370459 3.25877 -2.09108 +vn -0.842195 0.307647 -0.442787 +v -0.29933 3.42551 -2.10268 +vn -0.821124 0.344533 -0.45503 +v -0.374501 3.40142 -1.89369 +vn -0.899739 0.427238 -0.0890896 +v -0.333501 3.46263 -1.80507 +vn -0.784949 0.546474 0.291926 +v -0.304129 3.53584 -1.92394 +vn -0.873686 0.484289 -0.0462342 +v -0.274063 3.58812 -1.93783 +vn -0.840003 0.534837 -0.0913423 +v -0.788064 5.20672 0.335995 +vn -0.821552 0.563328 -0.0878234 +v -0.786602 5.19418 0.592467 +vn -0.778168 0.608271 0.1564 +v -0.638813 5.35858 0.51637 +vn -0.614709 0.77731 0.133874 +v -0.724636 5.28368 0.308325 +vn -0.744753 0.659769 -0.10024 +v -0.611836 5.39184 0.38261 +vn -0.615683 0.787832 0.0159329 +v -0.639105 5.36605 0.298741 +vn -0.649152 0.755441 -0.0889407 +v -0.486369 5.25907 -0.212444 +vn -0.535705 0.667293 -0.517437 +v -0.445387 5.26834 -0.240951 +vn -0.491143 0.681879 -0.542052 +v -0.909039 2.0837 -1.79515 +vn -0.783545 0.115901 -0.610429 +v -0.953579 2.18707 -1.69155 +vn -0.831234 0.262888 -0.489836 +v -0.92143 1.97736 -1.79061 +vn -0.749163 0.00605789 -0.662358 +v -0.927813 1.87402 -1.77597 +vn -0.713332 -0.106003 -0.692764 +v -0.583866 2.16267 -2.09862 +vn -0.517514 -0.0852805 -0.851415 +v -0.595911 2.01234 -2.06899 +vn -0.480824 -0.16961 -0.860256 +v -0.565381 2.33014 -2.11865 +vn -0.570317 0.00549646 -0.821406 +v -0.60092 2.52958 -2.06666 +vn -0.74287 0.150255 -0.652355 +v -0.568598 2.55899 -2.09476 +vn -0.705036 0.144831 -0.694225 +v -0.574709 2.50933 -2.09772 +vn -0.684898 0.0990421 -0.721876 +v -0.427381 2.37511 -2.19692 +vn -0.399723 -0.0637362 -0.914417 +v -0.399306 2.33278 -2.20492 +vn -0.348175 -0.0895049 -0.933147 +v -0.496438 2.35492 -2.16193 +vn -0.48831 -0.0373256 -0.871872 +v -0.376039 2.52866 -2.2251 +vn -0.388211 -0.018512 -0.921384 +v -0.341828 2.53318 -2.23873 +vn -0.340218 -0.0344551 -0.939715 +v -0.513268 2.49324 -2.14987 +vn -0.57986 0.0474214 -0.813335 +v -0.48405 2.50959 -2.16858 +vn -0.545329 0.0483606 -0.836826 +v -0.380198 2.12903 -2.18173 +vn -0.286958 -0.178126 -0.941237 +v -0.151606 2.22945 -2.24401 +vn -0.0972683 -0.173351 -0.980045 +v -0.187519 2.26986 -2.24675 +vn -0.126785 -0.15681 -0.979457 +v -0.073853 2.31942 -2.26423 +vn -0.0418036 -0.1469 -0.988268 +v -0.156212 2.06456 -2.20956 +vn -0.0936612 -0.226834 -0.969419 +v -0.193935 2.10275 -2.2141 +vn -0.120585 -0.21341 -0.969492 +v -0.17741 2.45118 -2.27148 +vn -0.13526 -0.0981148 -0.98594 +v -0.195516 2.65117 -2.28256 +vn -0.178325 -0.0392738 -0.983188 +v -0.162698 2.65321 -2.28785 +vn -0.141437 -0.0432101 -0.989004 +v -0.05877 2.65919 -2.29756 +vn -0.0437215 -0.0503092 -0.997776 +v -0.031681 2.67344 -2.29916 +vn -0.0228144 -0.0449147 -0.99873 +v -1.01491 4.33898 0.44432 +vn -0.987418 -0.128013 -0.0928317 +v -1.01802 4.37506 0.435446 +vn -0.992125 -0.0824848 -0.0942608 +v -0.987286 4.2046 0.467876 +vn -0.946569 -0.308658 -0.0934738 +v -0.996514 4.23698 0.463389 +vn -0.960942 -0.259821 -0.0953122 +v -1.02141 4.37643 0.689165 +vn -0.996576 -0.0456381 0.068944 +v -1.02477 4.39803 0.636722 +vn -0.999133 -0.0223223 0.0351292 +v -1.00596 4.25036 0.662078 +vn -0.974081 -0.222909 0.038449 +v -1.014 4.28891 0.658907 +vn -0.984623 -0.1705 0.03804 +v -0.974927 4.31165 0.23325 +vn -0.95032 -0.197691 -0.240438 +v -0.96858 4.27475 0.24292 +vn -0.940656 -0.245166 -0.234648 +v -0.884835 4.24366 0.031377 +vn -0.854597 -0.329886 -0.401047 +v -0.876256 4.20865 0.044089 +vn -0.843634 -0.366893 -0.39201 +v -0.943327 4.17873 0.269 +vn -0.903063 -0.362274 -0.230728 +v -0.931373 4.14594 0.277101 +vn -0.8881 -0.397802 -0.230286 +v -0.847028 4.1186 0.079054 +vn -0.803559 -0.463085 -0.373957 +v -0.834136 4.08826 0.090716 +vn -0.788849 -0.491826 -0.368544 +v -0.97929 4.42334 0.198393 +vn -0.967526 -0.0516358 -0.247443 +v -0.977128 4.45712 0.184801 +vn -0.969819 -0.0249981 -0.242541 +v -0.967142 4.54233 0.150083 +vn -0.967692 0.0551946 -0.246018 +v -0.962056 4.56999 0.137926 +vn -0.965144 0.0776787 -0.249928 +v -0.895649 4.35117 -0.011563 +vn -0.884232 -0.189362 -0.426938 +v -0.894745 4.38437 -0.026932 +vn -0.889279 -0.161705 -0.427825 +v -0.887793 4.46948 -0.064313 +vn -0.891876 -0.0712587 -0.446631 +v -0.883367 4.49774 -0.076432 +vn -0.890141 -0.0416041 -0.453783 +v -1.01751 4.53353 0.508955 +vn -0.991246 0.129075 -0.0277541 +v -1.01266 4.565 0.502866 +vn -0.987098 0.157898 -0.0265693 +v -1.00696 4.57961 0.657746 +vn -0.980181 0.183671 0.0742272 +v -0.994059 4.62533 0.696442 +vn -0.969444 0.225685 0.0961505 +v -0.993481 4.66072 0.481421 +vn -0.977021 0.212159 -0.0204433 +v -0.987152 4.68916 0.4878 +vn -0.973814 0.227079 -0.0110068 +v -0.9766 4.70989 0.644508 +vn -0.962974 0.259344 0.0736322 +v -0.967875 4.72283 0.700494 +vn -0.955546 0.273668 0.109716 +v -0.926745 1.77317 -1.75382 +vn -0.681183 -0.212239 -0.700674 +v -0.815837 1.47978 -1.69845 +vn -0.574403 -0.50738 -0.642361 +v -0.851361 1.48719 -1.67158 +vn -0.596246 -0.501517 -0.626874 +v -0.890667 1.49351 -1.63819 +vn -0.608691 -0.503518 -0.61316 +v -0.592315 1.60792 -1.93632 +vn -0.425879 -0.404441 -0.809354 +v -0.581384 1.48896 -1.87389 +vn -0.412592 -0.501684 -0.760316 +v -0.599484 1.73573 -1.98831 +vn -0.439404 -0.318633 -0.839879 +v -0.601036 1.87106 -2.03208 +vn -0.45651 -0.242617 -0.856 +v -0.424335 1.70695 -2.0498 +vn -0.283159 -0.350028 -0.892917 +v -0.426201 1.85179 -2.0994 +vn -0.289364 -0.279046 -0.915643 +v -0.380305 1.53709 -1.98495 +vn -0.248893 -0.460696 -0.851945 +v -0.418365 1.57074 -1.99091 +vn -0.278918 -0.435618 -0.855828 +v -0.409202 1.44585 -1.9209 +vn -0.274276 -0.538911 -0.79646 +v -0.156659 1.60248 -2.06023 +vn -0.0944676 -0.411188 -0.906642 +v -0.19606 1.63814 -2.07127 +vn -0.119006 -0.389657 -0.913239 +v -0.079149 1.67594 -2.09709 +vn -0.0399069 -0.36811 -0.928925 +v -0.153573 1.46657 -1.9899 +vn -0.0949781 -0.512525 -0.853404 +v -0.192551 1.49973 -2.00423 +vn -0.119541 -0.485169 -0.866211 +v -0.23685 1.82425 -2.13398 +vn -0.144086 -0.300514 -0.942831 +v -0.197763 1.78715 -2.12729 +vn -0.118243 -0.315496 -0.941531 +v -0.197205 1.94301 -2.1743 +vn -0.118316 -0.260444 -0.958212 +v -0.079502 1.82884 -2.15082 +vn -0.0397531 -0.299812 -0.95317 +v -0.749602 1.30026 -1.57448 +vn -0.506097 -0.688028 -0.520081 +v -0.822538 1.26903 -1.45043 +vn -0.523771 -0.719418 -0.456182 +v -0.888345 1.29957 -1.4203 +vn -0.541916 -0.69993 -0.465215 +v -0.889457 1.26899 -1.37113 +vn -0.527886 -0.723079 -0.445525 +v -0.533108 1.20319 -1.61758 +vn -0.343849 -0.788465 -0.509991 +v -0.528994 1.13614 -1.50238 +vn -0.314281 -0.852344 -0.418016 +v -0.069616 1.197 -1.75925 +vn -0.0381607 -0.798262 -0.6011 +v -0.21791 1.29652 -1.85151 +vn -0.140022 -0.68956 -0.710563 +v -0.182124 1.26838 -1.82979 +vn -0.114032 -0.717215 -0.687459 +v -0.187696 1.37564 -1.92416 +vn -0.117527 -0.600721 -0.790773 +v -0.074027 1.29067 -1.86384 +vn -0.0373489 -0.690303 -0.722556 +v -0.324915 3.70446 -0.086017 +vn -0.48481 -0.556956 -0.674359 +v -0.165326 3.69251 -0.164995 +vn -0.300426 -0.550138 -0.779161 +v -0.26054 3.55456 -0.061819 +vn -0.550646 0.0121192 -0.834651 +v -0.337272 3.81822 -0.188839 +vn -0.422096 -0.658467 -0.623102 +v -0.32611 3.79433 -0.171291 +vn -0.422417 -0.652727 -0.628897 +v -0.379279 3.91587 -0.263141 +vn -0.431697 -0.641894 -0.633727 +v -0.369436 3.89108 -0.244353 +vn -0.427733 -0.6526 -0.625426 +v -0.099308 3.81834 -0.293681 +vn -0.150139 -0.67494 -0.722436 +v -0.14541 3.80184 -0.266173 +vn -0.211833 -0.68155 -0.70044 +v -0.164087 3.89182 -0.345348 +vn -0.217847 -0.656416 -0.722261 +v -0.15955 3.86837 -0.325111 +vn -0.216385 -0.665908 -0.713964 +v -0.497419 3.82085 -0.054496 +vn -0.558297 -0.636526 -0.532109 +v -0.513685 3.84724 -0.069244 +vn -0.560064 -0.64058 -0.525343 +v -0.645153 3.85391 0.088533 +vn -0.661643 -0.606711 -0.440603 +v -0.664863 3.88336 0.077407 +vn -0.666082 -0.608585 -0.431229 +v -0.560272 3.9271 -0.116758 +vn -0.573917 -0.629958 -0.523232 +v -0.574388 3.95397 -0.133124 +vn -0.581516 -0.617336 -0.529845 +v -0.720892 3.97188 0.040445 +vn -0.689879 -0.590337 -0.41901 +v -0.737667 4.00135 0.027347 +vn -0.701664 -0.574382 -0.421607 +v -0.631839 4.48241 1.73815 +vn -0.775996 -0.474397 0.415664 +v -0.341036 5.06025 -0.4963 +vn -0.452127 0.445117 -0.77295 +v -0.485525 4.97084 -0.443931 +vn -0.576528 0.357382 -0.734774 +v -0.495657 4.94025 -0.449641 +vn -0.589097 0.317042 -0.743269 +v -0.59339 4.98882 -0.336601 +vn -0.667863 0.371643 -0.644857 +v -0.615933 4.93456 -0.342177 +vn -0.686111 0.321436 -0.652634 +v -0.636742 4.96671 -0.30222 +vn -0.700957 0.359619 -0.6159 +v -0.176166 5.04884 -0.576227 +vn -0.26436 0.440574 -0.857909 +v -0.222575 5.02482 -0.572057 +vn -0.322905 0.407941 -0.854 +v 0 5.02827 -0.613733 +vn 2.0272e-06 0.430755 -0.902469 +v -0.045879 5.01049 -0.619836 +vn -0.0746742 0.388578 -0.918385 +v -0.190463 4.93617 -0.617993 +vn -0.282683 0.286779 -0.91534 +v -0.25975 4.88207 -0.608693 +vn -0.366991 0.233934 -0.900329 +v -0.063101 4.87105 -0.661829 +vn -0.0975436 0.20938 -0.972957 +v -0.226021 5.27539 -0.377577 +vn -0.281416 0.721674 -0.632449 +v -0.077543 5.27361 -0.425724 +vn -0.110466 0.735086 -0.668914 +v -0.307436 5.19748 -0.415129 +vn -0.387055 0.613491 -0.688344 +v -0.294283 5.27441 -0.343789 +vn -0.347716 0.711381 -0.610762 +v -0.347808 5.27681 -0.307378 +vn -0.399226 0.706147 -0.584785 +v -0.606219 4.61442 -0.427079 +vn -0.65114 0.00959033 -0.758897 +v -0.614678 4.58373 -0.419526 +vn -0.654755 -0.0180477 -0.755626 +v -0.636576 4.49211 -0.392942 +vn -0.663757 -0.104131 -0.740664 +v -0.642345 4.46192 -0.382774 +vn -0.665835 -0.133868 -0.733991 +v -0.767272 4.66526 -0.252409 +vn -0.794308 0.0959981 -0.599883 +v -0.777199 4.63651 -0.243067 +vn -0.800503 0.0704541 -0.595173 +v -0.80303 4.55 -0.212118 +vn -0.816368 -0.0109342 -0.577428 +v -0.809913 4.52119 -0.200912 +vn -0.820095 -0.0400685 -0.570823 +v -0.292744 4.56064 -0.614385 +vn -0.358083 -0.0947113 -0.928874 +v -0.288059 4.59359 -0.618969 +vn -0.357371 -0.0668938 -0.931564 +v -0.058592 4.55477 -0.669191 +vn -0.0822535 -0.12386 -0.988885 +v -0.057593 4.58844 -0.672926 +vn -0.0824766 -0.0954488 -0.992012 +v -0.308617 4.43039 -0.587081 +vn -0.360844 -0.203475 -0.910159 +v -0.305125 4.4626 -0.595074 +vn -0.360283 -0.176439 -0.916005 +v -0.062102 4.4218 -0.644873 +vn -0.0821475 -0.229823 -0.969759 +v -0.061318 4.45469 -0.652183 +vn -0.082338 -0.20337 -0.975634 +v -0.273006 4.69218 -0.627334 +vn -0.354579 0.0200894 -0.93481 +v -0.267764 4.7247 -0.62801 +vn -0.353442 0.0506922 -0.934082 +v -0.250002 4.8255 -0.624062 +vn -0.354635 0.147709 -0.923264 +v -0.233802 4.85037 -0.625871 +vn -0.333632 0.177325 -0.925876 +v -0.054411 4.68905 -0.67858 +vn -0.0824069 -0.00739909 -0.996571 +v -0.053331 4.72224 -0.678295 +vn -0.0826181 0.025236 -0.996262 +v -0.099766 4.81527 -0.665839 +vn -0.153929 0.120602 -0.980694 +v -0.050769 4.82227 -0.671026 +vn -0.0804728 0.135784 -0.987465 +v -0.568033 4.73661 -0.448958 +vn -0.633739 0.118795 -0.764371 +v -0.578041 4.70625 -0.444721 +vn -0.638486 0.0915491 -0.764169 +v -0.722369 4.77904 -0.282943 +vn -0.765403 0.192346 -0.614135 +v -0.73416 4.75083 -0.276362 +vn -0.773128 0.168675 -0.61141 +v -0.526587 4.85539 -0.455781 +vn -0.611287 0.229825 -0.757304 +v -0.537001 4.82618 -0.45556 +vn -0.617491 0.201469 -0.760339 +v -0.67304 4.88945 -0.300131 +vn -0.731514 0.28466 -0.619562 +v -0.685515 4.86226 -0.297209 +vn -0.740533 0.261385 -0.619103 +v -0.235031 5.49317 0.008486 +vn -0.258177 0.900399 -0.350181 +v -0.083765 5.50411 -0.03882 +vn -0.101044 0.918593 -0.38207 +v -0.375265 5.4732 0.092475 +vn -0.38066 0.876468 -0.294791 +v -0.508402 5.43917 0.203993 +vn -0.488896 0.844606 -0.218222 +v -0.339981 5.52414 0.791021 +vn -0.750098 0.582119 0.313833 +v -0.297287 5.51108 0.883554 +vn -0.70921 0.474539 0.521377 +v -0.363114 5.53805 0.685148 +vn -0.684184 0.711811 0.158801 +v -0.363509 5.55213 0.573779 +vn -0.572124 0.819312 0.0374389 +v -0.79953 4.93508 0.976948 +vn -0.788733 0.36843 0.492098 +v -0.883404 4.85216 0.876408 +vn -0.869812 0.336369 0.360947 +v -0.854828 5.06371 0.249206 +vn -0.896168 0.4095 -0.170857 +v -0.744513 5.03702 -0.097462 +vn -0.799273 0.412491 -0.437052 +v -0.651652 5.00258 -0.262197 +vn -0.717701 0.386317 -0.579366 +v -0.663815 5.03735 -0.222337 +vn -0.733664 0.399989 -0.549314 +v -0.637964 5.27344 0.015085 +vn -0.663979 0.6616 -0.348451 +v -0.545379 5.33266 -0.023819 +vn -0.548355 0.749616 -0.370653 +v -0.59772 5.23707 -0.107678 +vn -0.638383 0.624412 -0.450086 +v -0.139647 3.70221 -1.85605 +vn -0.407522 0.786136 0.464668 +v -0.190371 3.51745 -2.17655 +vn -0.548643 0.408693 -0.729356 +v -0.07326 3.71783 -1.84727 +vn -0.155991 0.828573 0.537712 +v -0.261587 2.99045 -2.26047 +vn -0.370946 0.0742748 -0.925679 +v -0.288135 2.98027 -2.25008 +vn -0.416814 0.0875735 -0.904764 +v -0.306137 2.75487 -2.25393 +vn -0.359275 0.0153387 -0.933106 +v -0.332036 2.75881 -2.2429 +vn -0.415082 0.0286621 -0.909332 +v -0.347532 3.0028 -2.21247 +vn -0.588158 0.140702 -0.796413 +v -0.331996 2.98436 -2.22607 +vn -0.530367 0.114123 -0.840051 +v -0.424929 2.74866 -2.18968 +vn -0.5859 0.0956617 -0.804717 +v -0.459976 2.73556 -2.16458 +vn -0.633726 0.130286 -0.762507 +v -0.10499 2.99958 -2.29681 +vn -0.102795 0.0364065 -0.994036 +v -0.109748 2.94128 -2.29786 +vn -0.106107 0.0210693 -0.994131 +v -0.13163 2.99918 -2.29355 +vn -0.138595 0.0395114 -0.989561 +v -0.025511 3.01935 -2.30076 +vn -0.0215911 0.0403643 -0.998952 +v -0.142912 2.88067 -2.29469 +vn -0.141082 0.00828289 -0.989963 +v -0.171634 2.8794 -2.29014 +vn -0.180411 0.0117603 -0.983521 +v -0.02764 2.90146 -2.30349 +vn -0.0222998 0.00846122 -0.999716 +v -0.051483 2.88577 -2.30278 +vn -0.0428337 0.00256194 -0.999079 +v -0.09097 3.17737 -2.28599 +vn -0.108867 0.0954275 -0.989465 +v -0.115101 3.23458 -2.27727 +vn -0.155341 0.105414 -0.98222 +v -0.091369 3.24742 -2.27896 +vn -0.1062 0.119723 -0.987111 +v -0.07748 3.45162 -2.24111 +vn -0.135864 0.256967 -0.956822 +v -0.041206 3.28485 -2.27736 +vn -0.0383419 0.136404 -0.989911 +v -0.242435 3.28028 -2.22845 +vn -0.501581 0.207343 -0.839896 +v -0.20944 3.2737 -2.2462 +vn -0.391783 0.181149 -0.902048 +v -0.192915 3.54932 -1.74316 +vn -0.353308 0.532188 0.769382 +v -0.273041 3.50892 -1.76536 +vn -0.595367 0.561439 0.574739 +v -0.106036 3.55843 -1.72533 +vn -0.144564 0.521901 0.840667 +v -1.40015 2.62343 0.636684 +vn -0.819799 0.569238 0.0624406 +v -1.4576 2.53039 0.66399 +vn -0.855955 0.509762 0.0865148 +v -1.28582 2.73604 0.88883 +vn -0.773717 0.619218 0.133907 +v -1.33492 2.66579 0.908962 +vn -0.804621 0.57514 0.147643 +v -1.55658 2.2143 0.887127 +vn -0.956634 0.226007 0.183775 +v -1.58574 2.20755 0.718992 +vn -0.967181 0.216436 0.133102 +v -1.5727 2.23828 0.757849 +vn -0.957246 0.250924 0.143932 +v -1.56215 2.03764 0.978347 +vn -0.97755 0.0356791 0.20766 +v -1.6024 2.08462 0.731004 +vn -0.987797 0.0728983 0.137632 +v -1.5935 2.11843 0.769965 +vn -0.982317 0.114397 0.148214 +v -1.55316 2.32329 0.706732 +vn -0.93081 0.343394 0.125195 +v -1.50986 2.4296 0.68723 +vn -0.893001 0.437219 0.10672 +v -1.52829 2.05185 1.11936 +vn -0.965844 0.0571014 0.252754 +v -1.49197 2.06064 1.24167 +vn -0.946664 0.0742522 0.31355 +v -1.47071 1.44481 0.871659 +vn -0.934531 -0.330508 0.131969 +v -1.49081 1.5525 0.961587 +vn -0.949042 -0.272778 0.157835 +v -1.49508 1.5318 0.893539 +vn -0.950645 -0.279541 0.13465 +v -1.47532 1.40721 0.725039 +vn -0.936939 -0.336325 0.0950347 +v -1.50307 1.52384 0.81384 +vn -0.952311 -0.282828 0.11451 +v -1.50796 1.51193 0.737627 +vn -0.951914 -0.290159 0.0983203 +v -1.48175 1.56381 1.03148 +vn -0.945008 -0.273386 0.1795 +v -1.47575 1.585 1.09003 +vn -0.939822 -0.266107 0.214294 +v -1.46626 1.6 1.14691 +vn -0.931646 -0.26996 0.243223 +v -1.45867 1.62131 1.19557 +vn -0.920817 -0.260821 0.289945 +v -1.37484 1.28344 0.931078 +vn -0.744432 -0.619199 0.249827 +v -1.37564 1.3053 0.980747 +vn -0.759168 -0.59286 0.268667 +v -1.38496 1.27154 0.866993 +vn -0.769336 -0.60622 0.201542 +v -1.3833 1.25071 0.807372 +vn -0.762787 -0.619269 0.186179 +v -1.38659 1.23444 0.736455 +vn -0.770036 -0.617385 0.160876 +v -1.37336 1.93306 -1.17605 +vn -0.910571 0.0842883 -0.404669 +v -1.34137 1.93281 -1.24438 +vn -0.897933 0.0880569 -0.431234 +v -1.33169 2.14203 -1.12323 +vn -0.843297 0.412947 -0.343984 +v -1.30064 2.14242 -1.19607 +vn -0.842559 0.394862 -0.366303 +v -1.27034 2.14381 -1.26234 +vn -0.835204 0.382114 -0.395505 +v -1.36279 2.14119 -1.04497 +vn -0.843079 0.425421 -0.32899 +v -1.39167 2.14693 -0.96125 +vn -0.840409 0.445524 -0.308578 +v -1.41885 2.15359 -0.87457 +vn -0.838202 0.458028 -0.296022 +v -1.44432 2.16387 -0.785963 +vn -0.833578 0.473425 -0.284634 +v -1.43582 1.84564 -1.02563 +vn -0.930859 -0.0858995 -0.355138 +v -1.44515 1.88222 -1.00576 +vn -0.938082 -0.0202534 -0.345821 +v -1.50508 1.84095 -0.820661 +vn -0.950685 -0.119017 -0.286415 +v -1.52992 1.85227 -0.736457 +vn -0.962548 -0.0963721 -0.253405 +v -1.5175 1.87059 -0.788084 +vn -0.960468 -0.0704599 -0.269327 +v -1.6054 2.01064 -0.364495 +vn -0.982765 0.103018 -0.153495 +v -1.57523 1.95993 -0.553903 +vn -0.977517 0.0582397 -0.202653 +v -1.60459 1.89326 -0.36683 +vn -0.987272 -0.10298 -0.121198 +v -1.60017 1.91161 -0.412917 +vn -0.987842 -0.0639132 -0.141718 +v -1.57339 1.87149 -0.551822 +vn -0.978884 -0.0916949 -0.182698 +v -1.56469 1.8875 -0.603985 +vn -0.9776 -0.0697836 -0.198566 +v -1.50904 2.24825 -0.42917 +vn -0.829044 0.502093 -0.246146 +v -1.49749 2.22187 -0.518082 +vn -0.829162 0.495795 -0.258221 +v -1.48375 2.1981 -0.606972 +vn -0.828475 0.491914 -0.267677 +v -1.46701 2.17579 -0.696874 +vn -0.833474 0.478458 -0.276405 +v -1.52277 2.30578 -0.253961 +vn -0.835416 0.507415 -0.211209 +v -1.52715 2.36208 -0.080914 +vn -0.845337 0.509647 -0.160203 +v -1.6255 2.0418 -0.18133 +vn -0.990549 0.0943297 -0.0995711 +v -1.61648 1.91022 -0.273224 +vn -0.991107 -0.0925749 -0.0955915 +v -1.61311 1.92982 -0.320199 +vn -0.992045 -0.0543083 -0.11357 +v -1.63153 2.06172 -0.087705 +vn -0.991947 0.101561 -0.0756748 +v -1.63295 1.94362 -0.084977 +vn -0.996132 -0.071689 -0.0508077 +v -1.63143 1.96554 -0.132392 +vn -0.997186 -0.03609 -0.0657132 +v -1.62764 2.16545 0.189929 +vn -0.980379 0.196853 -0.0102833 +v -1.63199 2.1421 0.236618 +vn -0.987037 0.1604 0.00536183 +v -1.63282 2.11566 0.053013 +vn -0.987806 0.149999 -0.0417203 +v -1.64168 2.0456 0.194039 +vn -0.999372 0.0353136 0.00306546 +v -1.64168 2.01914 0.241326 +vn -0.99988 -0.00118849 0.0154493 +v -1.6406 1.99655 0.055286 +vn -0.999551 -0.0175832 -0.0242817 +v -1.5713 2.3431 0.271917 +vn -0.914456 0.404427 -0.0144751 +v -1.57995 2.32318 0.318639 +vn -0.926442 0.376397 0.00545373 +v -1.51787 2.44587 0.261706 +vn -0.862976 0.503299 -0.0442977 +v -1.52568 2.40881 0.091439 +vn -0.855901 0.507312 -0.100345 +v -1.55769 2.36648 0.468759 +vn -0.915415 0.399753 0.0470349 +v -1.56874 2.29313 0.666913 +vn -0.94331 0.312079 0.113021 +v -1.62517 2.13388 0.461489 +vn -0.988358 0.136403 0.0674016 +v -1.62369 2.1604 0.417269 +vn -0.983815 0.171436 0.0521333 +v -1.6363 2.06456 0.378049 +vn -0.997707 0.0471125 0.0485842 +v -1.59739 2.17624 0.679344 +vn -0.975862 0.181063 0.122104 +v -1.60953 2.04984 0.691401 +vn -0.991452 0.0316605 0.126574 +v -1.46176 2.36237 -0.33139 +vn -0.773805 0.582243 -0.249437 +v -1.44707 2.30417 -0.502692 +vn -0.775371 0.5725 -0.266541 +v -1.52239 2.26833 -0.339613 +vn -0.841509 0.489524 -0.228535 +v -1.27641 2.53438 -0.388096 +vn -0.604443 0.739962 -0.295134 +v -1.27345 2.50415 -0.470629 +vn -0.607214 0.741427 -0.285618 +v -1.27299 2.47703 -0.544527 +vn -0.622762 0.734451 -0.269721 +v -1.28167 2.56327 -0.305742 +vn -0.608498 0.734918 -0.299375 +v -1.27482 2.59711 -0.237179 +vn -0.599019 0.740658 -0.304307 +v -1.27288 2.63006 -0.158635 +vn -0.603964 0.741699 -0.291736 +v -1.27366 2.65863 -0.083351 +vn -0.617423 0.738057 -0.27214 +v -1.27293 2.6854 -0.008362 +vn -0.629852 0.736389 -0.247019 +v -1.37753 2.66201 0.461054 +vn -0.7863 0.617687 -0.0139999 +v -1.24663 2.42106 -0.778417 +vn -0.659123 0.714859 -0.233526 +v -1.14424 2.64484 -0.317858 +vn -0.386845 0.852905 -0.350578 +v -1.1173 2.64533 -0.344673 +vn -0.383694 0.856196 -0.345988 +v -1.14354 2.6676 -0.264214 +vn -0.377791 0.854156 -0.357338 +v -1.14314 2.71674 -0.147073 +vn -0.387321 0.851989 -0.352274 +v -1.113 2.74937 -0.098661 +vn -0.369761 0.862644 -0.34514 +v -1.0495 1.20655 -1.07383 +vn -0.515031 -0.755528 -0.404872 +v -1.03377 1.23222 -1.13991 +vn -0.519287 -0.743695 -0.42102 +v -1.02342 1.26513 -1.20876 +vn -0.530858 -0.726925 -0.435626 +v -1.01261 1.28483 -1.25419 +vn -0.531836 -0.720899 -0.444359 +v -1.06698 1.17882 -0.997907 +vn -0.50543 -0.772015 -0.385399 +v -1.08576 1.15256 -0.917869 +vn -0.499851 -0.787916 -0.359636 +v -1.10585 1.12899 -0.834996 +vn -0.492765 -0.804399 -0.331851 +v -1.12563 1.10799 -0.750117 +vn -0.49025 -0.819751 -0.296079 +v -1.14482 1.09058 -0.664504 +vn -0.486987 -0.834895 -0.256502 +v -1.22298 1.04707 0.334042 +vn -0.432123 -0.900363 0.051149 +v -1.19878 1.0377 0.342832 +vn -0.320824 -0.945518 0.0553823 +v -1.16537 1.02879 0.347428 +vn -0.240585 -0.969048 0.055363 +v -1.18027 1.14557 0.967245 +vn -0.463643 -0.833611 0.300212 +v -1.20755 1.15661 0.952762 +vn -0.502883 -0.812498 0.294883 +v -1.15256 1.13476 0.977107 +vn -0.409945 -0.862062 0.297984 +v -1.11725 1.12368 0.990251 +vn -0.380819 -0.878171 0.289469 +v -1.00701 2.54135 -1.01793 +vn -0.726265 0.671725 -0.146028 +v -1.03206 2.51933 -1.00659 +vn -0.63227 0.759735 -0.151781 +v -0.973945 2.57737 -1.03497 +vn -0.772189 0.621902 -0.130242 +v -0.931533 2.62626 -1.06424 +vn -0.78551 0.609464 -0.107366 +v -0.913924 2.61699 -1.22664 +vn -0.823495 0.550256 -0.138108 +v -1.02985 2.70143 -0.351844 +vn -0.615233 0.735816 -0.282954 +v -0.980738 2.7395 -0.362825 +vn -0.627906 0.730495 -0.268534 +v -0.975945 2.68636 -0.530497 +vn -0.65993 0.718225 -0.220559 +v -1.11503 2.67505 -0.275105 +vn -0.380123 0.854198 -0.354756 +v -1.04968 2.90716 0.28653 +vn -0.53081 0.828073 -0.180378 +v -1.05156 2.92536 0.388912 +vn -0.530664 0.837052 -0.133192 +v -1.05434 2.93422 0.466394 +vn -0.527299 0.844835 -0.0906107 +v -1.23533 1.39059 1.33129 +vn -0.577103 -0.616551 0.535554 +v -1.22193 1.35034 1.29716 +vn -0.565887 -0.652166 0.504431 +v -1.21158 1.30894 1.25203 +vn -0.55044 -0.6901 0.46987 +v -1.24725 1.4334 1.36478 +vn -0.597571 -0.572153 0.561739 +v -1.26772 1.47641 1.38462 +vn -0.610405 -0.533935 0.58508 +v -1.28042 1.53081 1.41737 +vn -0.639509 -0.476791 0.603075 +v -1.29579 1.57832 1.43634 +vn -0.657386 -0.432542 0.617049 +v -1.14541 1.48407 1.52009 +vn -0.620185 -0.511525 0.594737 +v -1.17596 1.59009 1.56777 +vn -0.646268 -0.407104 0.645449 +v -1.10611 1.37981 1.45822 +vn -0.578011 -0.611008 0.540899 +v -1.30929 1.63108 1.45607 +vn -0.683456 -0.377449 0.624836 +v -1.22267 1.93406 1.63651 +vn -0.669768 -0.0441137 0.741259 +v -1.21538 1.81646 1.62591 +vn -0.669081 -0.170239 0.723429 +v -1.19974 1.70132 1.60287 +vn -0.661895 -0.291941 0.69041 +v -1.27314 2.27041 1.52787 +vn -0.656716 0.303831 0.690225 +v -1.23891 2.27508 1.55766 +vn -0.645542 0.305298 0.700049 +v -1.1916 2.27708 1.60009 +vn -0.642076 0.301686 0.704786 +v -1.16561 2.39237 1.56518 +vn -0.627304 0.397545 0.669662 +v -1.15595 2.66884 1.3396 +vn -0.569066 0.631914 0.526164 +v -1.13351 2.68036 1.3497 +vn -0.563437 0.639502 0.523046 +v -1.10156 2.69835 1.36197 +vn -0.56167 0.647946 0.514483 +v -0.995041 2.41789 -1.39807 +vn -0.730872 0.56293 -0.385922 +v -1.02047 2.39829 -1.38606 +vn -0.637733 0.625872 -0.448977 +v -0.932176 2.33959 -1.62648 +vn -0.848392 0.342617 -0.403541 +v -0.951323 2.23481 -1.66704 +vn -0.837974 0.296367 -0.45822 +v -0.915289 2.44055 -1.56648 +vn -0.855979 0.386423 -0.343477 +v -0.979788 2.0489 -1.70651 +vn -0.808035 0.147638 -0.570336 +v -0.969287 2.13188 -1.6927 +vn -0.824365 0.225264 -0.519305 +v -1.01417 1.31724 -1.30371 +vn -0.536343 -0.708322 -0.458928 +v -1.38099 1.68401 -1.0783 +vn -0.899758 -0.267863 -0.344508 +v -1.40023 1.77078 -1.08624 +vn -0.912505 -0.185504 -0.364585 +v -1.49402 1.79255 -0.83011 +vn -0.940437 -0.188833 -0.282702 +v -1.51263 1.81928 -0.783513 +vn -0.951 -0.159243 -0.265031 +v -1.35498 1.59844 -1.0699 +vn -0.883116 -0.334393 -0.32907 +v -1.33082 1.52098 -1.04964 +vn -0.864128 -0.383606 -0.325774 +v -1.44408 1.57669 -0.766262 +vn -0.903733 -0.353647 -0.241249 +v -1.40797 1.51261 -0.802721 +vn -0.892572 -0.372025 -0.254781 +v -1.40618 1.84829 -1.09982 +vn -0.921773 -0.0697589 -0.381403 +v -1.43811 1.3454 -0.341168 +vn -0.919322 -0.369401 -0.135608 +v -1.46613 1.4188 -0.342934 +vn -0.92608 -0.352904 -0.133544 +v -1.42683 1.42178 -0.572693 +vn -0.911467 -0.364255 -0.191172 +v -1.46873 1.39495 -0.255654 +vn -0.930535 -0.348038 -0.113902 +v -1.49407 1.4375 -0.16437 +vn -0.93615 -0.340869 -0.0862092 +v -1.4914 1.41747 -0.111547 +vn -0.939045 -0.335418 -0.0754263 +v -1.24505 1.17742 0.943415 +vn -0.536971 -0.79129 0.292441 +v -1.2935 1.344 1.20265 +vn -0.606857 -0.657674 0.446305 +v -1.22191 1.29058 -0.976028 +vn -0.678583 -0.631067 -0.375871 +v -1.1888 1.24684 -0.955214 +vn -0.61124 -0.692138 -0.383837 +v -1.20749 1.22332 -0.879498 +vn -0.625891 -0.697577 -0.348779 +v -1.22657 1.20143 -0.799944 +vn -0.634103 -0.69823 -0.332248 +v -1.24534 1.18204 -0.717687 +vn -0.647939 -0.705915 -0.28611 +v -1.57401 1.8687 0.867219 +vn -0.978831 -0.127195 0.160346 +v -1.30617 1.45224 -1.02951 +vn -0.840978 -0.428496 -0.330374 +v -1.28063 1.39116 -1.01 +vn -0.803448 -0.48618 -0.343657 +v -1.25343 1.33841 -0.992361 +vn -0.749245 -0.556788 -0.358636 +v -0.272089 4.8963 2.1155 +vn -0.533113 0.580893 0.615104 +v -0.870648 4.51846 1.08639 +vn -0.770302 0.15828 0.617724 +v -0.724178 4.22278 1.31411 +vn -0.770809 -0.132756 0.62308 +v -0.682526 4.18678 1.3542 +vn -0.73972 -0.251811 0.624023 +v -0.634808 4.15445 1.39252 +vn -0.680591 -0.375 0.62942 +v -0.581498 4.12565 1.42701 +vn -0.596502 -0.492819 0.633494 +v -0.760564 4.26119 1.27297 +vn -0.786756 -0.0343252 0.616309 +v -0.791083 4.30212 1.23299 +vn -0.783388 0.0482237 0.61966 +v -0.81673 4.34441 1.19465 +vn -0.781692 0.103088 0.615086 +v -0.836852 4.38831 1.1602 +vn -0.768012 0.139215 0.625122 +v -0.747379 4.33519 1.28804 +vn -0.855326 -0.025109 0.517482 +v -0.768442 4.37651 1.25236 +vn -0.861812 0.0231516 0.506699 +v -0.785025 4.41846 1.22018 +vn -0.866831 0.0510123 0.495985 +v -0.721644 4.2949 1.32581 +vn -0.842042 -0.091507 0.531593 +v -0.690614 4.25647 1.36442 +vn -0.818337 -0.18093 0.545518 +v -0.6541 4.22049 1.40253 +vn -0.776539 -0.287471 0.560667 +v -0.611492 4.1878 1.43878 +vn -0.710099 -0.410104 0.572341 +v -0.248633 4.04709 1.53456 +vn -0.181789 -0.74732 0.639113 +v -0.165198 4.03863 1.54253 +vn -0.104652 -0.754158 0.648301 +v -0.080968 4.03458 1.54763 +vn -0.0498083 -0.761146 0.646666 +v -0.315623 4.05262 1.52004 +vn -0.232892 -0.727183 0.64573 +v -0.388547 4.06521 1.50338 +vn -0.313341 -0.697832 0.644088 +v -0.457722 4.08132 1.48246 +vn -0.402238 -0.652816 0.641899 +v -0.522067 4.10149 1.45719 +vn -0.497842 -0.588605 0.636944 +v -0.379181 4.09866 1.54594 +vn -0.311366 -0.758944 0.571887 +v -0.445721 4.11464 1.52553 +vn -0.405261 -0.707994 0.578367 +v -0.50709 4.13468 1.50086 +vn -0.508802 -0.635889 0.580315 +v -0.562605 4.15898 1.47194 +vn -0.617248 -0.531 0.580555 +v -0.235052 4.07362 1.56961 +vn -0.163211 -0.782407 0.601001 +v -0.597427 4.30074 1.54156 +vn -0.803699 -0.325867 0.497874 +v -0.516995 4.25183 1.61831 +vn -0.675599 -0.527925 0.514647 +v -0.662752 4.35849 1.45957 +vn -0.858726 -0.16228 0.486061 +v -0.71888 4.42298 1.37663 +vn -0.828696 -0.0873364 0.552842 +v -0.711673 4.43086 1.38685 +vn -0.793912 0.0509937 0.60589 +v -0.398492 4.25511 1.75992 +vn -0.471331 -0.739981 0.47987 +v -0.189981 4.17922 1.75272 +vn -0.138475 -0.856842 0.496635 +v -0.12672 4.1762 1.76125 +vn -0.0824973 -0.86443 0.495938 +v -0.069706 4.17821 1.77156 +vn -0.0416542 -0.868743 0.493508 +v -0.312225 4.19061 1.72212 +vn -0.27403 -0.808096 0.52143 +v -0.420703 4.21546 1.68069 +vn -0.474961 -0.721478 0.503866 +v -0.672892 4.27288 1.40298 +vn -0.832897 -0.277252 0.478971 +v -0.635818 4.23848 1.44225 +vn -0.782745 -0.360086 0.50759 +v -0.593239 4.20717 1.47937 +vn -0.711459 -0.463049 0.528594 +v -0.544724 4.1798 1.51355 +vn -0.615591 -0.573459 0.540549 +v -0.704742 4.30974 1.36348 +vn -0.868033 -0.216418 0.446857 +v -0.731899 4.3484 1.32457 +vn -0.896509 -0.18215 0.403847 +v -0.773123 4.4271 1.25485 +vn -0.937958 -0.166065 0.304398 +v -0.501111 4.21969 1.60501 +vn -0.611725 -0.576464 0.541739 +v -0.22525 4.1037 1.61874 +vn -0.155831 -0.835969 0.526187 +v -0.151472 4.09853 1.62796 +vn -0.0979549 -0.845701 0.524591 +v -0.084597 4.0976 1.63562 +vn -0.0578346 -0.851437 0.521258 +v -0.29695 4.11191 1.60616 +vn -0.225319 -0.818382 0.528661 +v -0.365539 4.12316 1.58926 +vn -0.306212 -0.788271 0.533725 +v -0.430208 4.13806 1.56851 +vn -0.400439 -0.741142 0.538847 +v -0.490206 4.15676 1.54311 +vn -0.505801 -0.670176 0.543166 +v -0.415616 5.4935 0.231544 +vn -0.416083 0.88971 -0.18786 +v -0.440597 5.46009 0.14732 +vn -0.434802 0.862923 -0.257511 +v -0.544472 5.42692 0.242871 +vn -0.522013 0.833868 -0.179353 +v -0.576673 5.41381 0.290181 +vn -0.571252 0.814786 -0.0989698 +v -0.534791 5.43945 0.27899 +vn -0.513563 0.850039 -0.116987 +v -0.301151 5.48833 0.052467 +vn -0.316943 0.892412 -0.321165 +v -0.157884 5.50408 -0.010657 +vn -0.175412 0.915256 -0.36268 +v -0.164856 5.60513 0.319115 +vn -0.247943 0.936124 -0.24939 +v -0.112378 5.61084 0.296734 +vn -0.173934 0.946484 -0.271874 +v -0.057438 5.61411 0.281425 +vn -0.0913685 0.953493 -0.287232 +v -0.213559 5.59776 0.347959 +vn -0.3105 0.925024 -0.218907 +v -0.257964 5.5891 0.383728 +vn -0.368574 0.911576 -0.182158 +v -0.299972 5.5781 0.424271 +vn -0.419898 0.897083 -0.137576 +v -0.327551 5.57023 0.471055 +vn -0.470412 0.877811 -0.0903337 +v -0.396176 5.45128 0.800039 +vn -0.647199 0.661518 0.378849 +v -0.379199 5.41285 0.892764 +vn -0.530258 0.734294 0.423839 +v -0.497762 5.43017 0.644289 +vn -0.583754 0.777295 0.234613 +v -0.522666 5.43095 0.572513 +vn -0.578554 0.795855 0.178576 +v -0.564699 5.42519 0.403099 +vn -0.565501 0.823874 0.0379394 +v -0.353967 5.55848 0.516315 +vn -0.520383 0.853446 -0.0288341 +v -0.294537 5.43523 0.952587 +vn -0.506744 0.638074 0.579717 +v -0.516489 5.39827 0.702643 +vn -0.549177 0.79313 0.263343 +v -0.887776 4.98043 0.708043 +vn -0.904349 0.383719 0.186851 +v -0.931456 4.85481 0.693666 +vn -0.952643 0.27139 0.137182 +v -0.643036 5.12797 0.995469 +vn -0.568733 0.598409 0.564314 +v -0.970898 4.46957 0.930491 +vn -0.928222 0.0933961 0.360112 +v -0.996235 4.31024 0.836517 +vn -0.969051 -0.127673 0.211282 +v -0.923301 4.68677 0.933666 +vn -0.884092 0.283792 0.371273 +v -0.906253 4.79986 0.871452 +vn -0.885393 0.340731 0.316197 +v -0.90442 4.51023 1.0446 +vn -0.816678 0.149682 0.557344 +v -0.743351 4.02836 1.18114 +vn -0.711862 -0.446226 0.542341 +v -0.619974 3.97025 1.26558 +vn -0.565079 -0.528746 0.633335 +v -0.981753 4.28851 0.881209 +vn -0.950134 -0.157275 0.269278 +v -0.112153 3.9372 1.44472 +vn -0.0670841 -0.660658 0.747683 +v -0.344005 3.95767 1.41412 +vn -0.25655 -0.645119 0.719725 +v -0.421049 3.97908 1.40222 +vn -0.331001 -0.634243 0.698695 +v -0.487745 3.98763 1.37518 +vn -0.399891 -0.608392 0.685526 +v -0.503649 3.14464 1.40109 +vn -0.492771 0.606511 0.623956 +v -0.874928 3.92977 0.777505 +vn -0.901568 -0.408159 0.143466 +v -0.272862 3.16599 -2.23206 +vn -0.510185 0.159168 -0.845208 +v -0.277785 3.2273 -2.21663 +vn -0.604485 0.173182 -0.777564 +v -0.256786 3.23628 -2.22962 +vn -0.517527 0.174343 -0.837717 +v -0.545646 5.21709 0.99227 +vn -0.521518 0.61261 0.593909 +v -0.480633 5.25495 1.00774 +vn -0.483082 0.618812 0.619437 +v -0.423044 5.28924 1.01658 +vn -0.453428 0.633731 0.626728 +v -0.359716 5.30629 1.04213 +vn -0.410503 0.639656 0.649868 +v -0.39571 5.32078 1.00354 +vn -0.437294 0.65406 0.617236 +v -0.289066 5.32523 1.0655 +vn -0.370012 0.635077 0.678062 +v -0.32828 5.33993 1.02841 +vn -0.406919 0.645756 0.646077 +v -0.283651 5.2754 1.11363 +vn -0.354419 0.616866 0.702754 +v -0.275914 5.22367 1.16111 +vn -0.343155 0.593853 0.727724 +v -0.256178 5.17108 1.21129 +vn -0.317856 0.574642 0.754158 +v -0.252386 5.11217 1.257 +vn -0.28309 0.578236 0.765182 +v -0.238432 5.06416 1.2988 +vn -0.251177 0.598549 0.76069 +v -0.234047 5.02323 1.33355 +vn -0.24265 0.629218 0.73838 +v -0.351772 5.25735 1.09289 +vn -0.395614 0.613798 0.683185 +v -0.321363 5.29083 1.0797 +vn -0.382592 0.626937 0.678655 +v -0.347128 5.20288 1.14243 +vn -0.381425 0.592635 0.709436 +v -0.315248 5.23954 1.12844 +vn -0.368298 0.603093 0.707556 +v -0.335688 5.14412 1.19616 +vn -0.359758 0.58471 0.727109 +v -0.305119 5.18505 1.17831 +vn -0.349833 0.585125 0.731605 +v -0.293845 5.12836 1.228 +vn -0.323055 0.581294 0.746815 +v -0.283355 5.0728 1.27592 +vn -0.291927 0.596277 0.747818 +v -0.311972 5.02955 1.29961 +vn -0.303786 0.61261 0.729673 +v -0.300612 4.98634 1.34169 +vn -0.287127 0.63285 0.719068 +v -0.420047 5.23347 1.07223 +vn -0.44099 0.609029 0.659251 +v -0.389312 5.27153 1.05695 +vn -0.424357 0.623081 0.657033 +v -0.383779 5.21751 1.10928 +vn -0.410146 0.599464 0.687331 +v -0.376911 5.15877 1.1627 +vn -0.391438 0.585193 0.710158 +v -0.32619 5.08424 1.24859 +vn -0.334526 0.592109 0.733144 +v -0.367386 5.09789 1.21754 +vn -0.370831 0.587 0.719663 +v -0.356959 5.03869 1.27162 +vn -0.347571 0.60279 0.718219 +v -0.388565 4.99191 1.29588 +vn -0.371779 0.61385 0.696397 +v -0.373482 4.94702 1.34408 +vn -0.3489 0.622426 0.70061 +v -0.345466 4.9857 1.32307 +vn -0.32779 0.625421 0.708098 +v -0.414283 5.1739 1.12836 +vn -0.422142 0.588443 0.689587 +v -0.449025 5.18936 1.09274 +vn -0.449133 0.59306 0.668251 +v -0.407293 5.11255 1.1837 +vn -0.406501 0.583292 0.703226 +v -0.445095 5.12842 1.14757 +vn -0.436238 0.578967 0.688834 +v -0.39862 5.0507 1.23993 +vn -0.38925 0.593228 0.704673 +v -0.439021 5.06495 1.20448 +vn -0.423323 0.582244 0.69411 +v -0.430721 5.00236 1.26286 +vn -0.409681 0.598736 0.688242 +v -0.464105 4.95266 1.28624 +vn -0.437132 0.602666 0.667614 +v -0.450848 4.90401 1.33959 +vn -0.41844 0.605599 0.676874 +v -0.421088 4.94481 1.3203 +vn -0.394417 0.61677 0.681197 +v -0.48552 5.20062 1.05668 +vn -0.474843 0.604489 0.639623 +v -0.480689 5.14488 1.11003 +vn -0.461079 0.581477 0.670292 +v -0.512802 5.16066 1.07334 +vn -0.480714 0.586487 0.65188 +v -0.478732 5.0806 1.16595 +vn -0.452042 0.576311 0.680826 +v -0.517115 5.09738 1.12531 +vn -0.474688 0.572358 0.668638 +v -0.472463 5.01533 1.2255 +vn -0.443211 0.58551 0.678779 +v -0.51862 5.02786 1.18343 +vn -0.469127 0.572968 0.672033 +v -0.507076 4.96329 1.24739 +vn -0.467148 0.582555 0.665134 +v -0.543499 4.9086 1.26908 +vn -0.504195 0.571315 0.647601 +v -0.528457 4.86127 1.32374 +vn -0.501196 0.573416 0.648071 +v -0.498007 4.90328 1.30849 +vn -0.466666 0.594396 0.654917 +v -0.595768 5.15524 1.01176 +vn -0.530882 0.60169 0.596768 +v -0.537432 5.17316 1.04283 +vn -0.500647 0.598587 0.625337 +v -0.552925 5.1167 1.08232 +vn -0.496853 0.578481 0.646913 +v -0.557778 5.04759 1.13858 +vn -0.487122 0.567895 0.663481 +v -0.602556 5.06089 1.0934 +vn -0.517975 0.563422 0.643628 +v -0.65208 4.94197 1.15026 +vn -0.600928 0.506485 0.618351 +v -0.601094 4.95508 1.18421 +vn -0.530015 0.549624 0.645753 +v -0.601978 4.99544 1.14946 +vn -0.526291 0.546237 0.651646 +v -0.621076 4.88044 1.22869 +vn -0.57338 0.509007 0.641988 +v -0.587742 4.92792 1.2179 +vn -0.52274 0.545593 0.655035 +v -0.575851 4.85476 1.28948 +vn -0.550895 0.540838 0.635617 +v -0.586928 4.87052 1.26616 +vn -0.5512 0.541043 0.635178 +v -0.635835 5.08816 1.04158 +vn -0.546609 0.567855 0.615434 +v -0.655179 4.89113 1.18842 +vn -0.616439 0.484936 0.620355 +v -0.660907 5.01121 1.08617 +vn -0.586518 0.514521 0.625512 +v -0.549395 4.97521 1.20657 +vn -0.487002 0.570359 0.661452 +v -0.609157 5.02861 1.11598 +vn -0.526655 0.550429 0.647813 +v -0.624864 4.91823 1.19532 +vn -0.564389 0.523878 0.637979 +v 1.05927 2.34547 -1.40366 +vn 0.616628 0.580378 -0.531914 +v 0.797062 1.12203 -1.19156 +vn 0.412208 -0.845435 -0.339594 +v 0.825265 1.07662 -1.03323 +vn 0.355198 -0.886632 -0.296173 +v 0.84029 1.00032 -0.738665 +vn 0.247475 -0.952362 -0.178219 +v 0.698216 1.0124 -0.944315 +vn 0.21223 -0.952697 -0.217548 +v 0.672393 1.04774 -1.11392 +vn 0.278459 -0.926834 -0.251872 +v 0.573517 0.994869 -0.970013 +vn 0.145277 -0.975395 -0.165829 +v 0.725771 0.981626 -0.764163 +vn 0.142169 -0.979189 -0.144834 +v 0.596225 0.97191 -0.792808 +vn 0.0811289 -0.991099 -0.105553 +v 0.652458 1.08831 -1.26929 +vn 0.336799 -0.889612 -0.308475 +v 0.552365 1.02346 -1.14068 +vn 0.203608 -0.956555 -0.208678 +v 0.536354 1.05949 -1.29765 +vn 0.252924 -0.926585 -0.278333 +v 0.642493 1.13862 -1.40674 +vn 0.38407 -0.841305 -0.380389 +v 0.286802 0.994719 -1.1823 +vn 0.0795308 -0.984141 -0.15856 +v 0.277459 1.02515 -1.34024 +vn 0.0999505 -0.966106 -0.238011 +v 0.410497 1.0385 -1.32176 +vn 0.167088 -0.952661 -0.254005 +v 0.422475 1.00578 -1.16329 +vn 0.132267 -0.975339 -0.176692 +v 0.274131 1.06909 -1.48614 +vn 0.123082 -0.929047 -0.348887 +v 0.40512 1.084 -1.46553 +vn 0.201885 -0.911555 -0.358204 +v 0.528774 1.10714 -1.43854 +vn 0.295774 -0.881265 -0.368632 +v 0.329337 0.979907 -1.04884 +vn 0.0666564 -0.991382 -0.112774 +v 0.296463 0.973807 -1.00804 +vn 0.0498127 -0.994398 -0.0932236 +v 0.440021 0.982253 -0.99334 +vn 0.0952658 -0.987433 -0.1261 +v 0.407959 0.974936 -0.951457 +vn 0.0680448 -0.992535 -0.101209 +v 0.342978 0.965124 -0.867022 +vn 0.0326835 -0.997864 -0.0565547 +v 0.487877 0.97035 -0.850478 +vn 0.0594747 -0.994182 -0.0898012 +v 0.252598 0.986544 -1.14216 +vn 0.0581525 -0.989284 -0.133925 +v 0.184373 0.974235 -1.06087 +vn 0.0311217 -0.994856 -0.0963966 +v 0.143587 0.98851 -1.19196 +vn 0.0323689 -0.98932 -0.142118 +v 0.108558 0.982213 -1.15196 +vn 0.0211911 -0.992058 -0.123985 +v 0.149031 0.969584 -1.01841 +vn 0.0215467 -0.996612 -0.0793723 +v 0 0.970396 -1.04812 +vn -2.38913e-07 -0.996207 -0.0870124 +v 0.262665 0.968828 -0.965968 +vn 0.0355599 -0.996551 -0.0749754 +v 0.30887 0.962244 -0.822931 +vn 0.0204244 -0.99919 -0.0346794 +v 0.232728 0.96112 -0.828283 +vn 0.0139519 -0.999537 -0.0270303 +v 0.192196 0.962155 -0.878046 +vn 0.0151322 -0.999136 -0.038704 +v 0.112845 0.965877 -0.975158 +vn 0.013854 -0.997879 -0.0635983 +v 0.155483 0.960373 -0.832328 +vn 0.0088759 -0.999721 -0.0219068 +v 0.077566 0.959964 -0.839122 +vn 0.00502357 -0.999782 -0.0202517 +v 0.038274 0.961385 -0.897069 +vn 0.00376024 -0.999326 -0.0365159 +v 0.177952 0.995828 -1.23107 +vn 0.0458644 -0.985647 -0.162471 +v 0.141082 1.01825 -1.35393 +vn 0.0494838 -0.97163 -0.231272 +v 0 0.991306 -1.22613 +vn -1.58788e-18 -0.988313 -0.152437 +v 0.105379 1.00852 -1.31592 +vn 0.0302487 -0.979122 -0.201009 +v 0 1.02242 -1.38464 +vn -1.79546e-18 -0.970129 -0.242591 +v 0.103858 1.04757 -1.46669 +vn 0.0404539 -0.949495 -0.311163 +v 0.893126 0.976156 -0.371679 +vn 0.16556 -0.984878 -0.0510348 +v 0.868229 0.983399 -0.555251 +vn 0.201467 -0.975738 -0.085712 +v 0.911235 0.972448 -0.182918 +vn 0.143559 -0.989343 -0.0243098 +v 0.947983 0.975869 -0.03897 +vn 0.164415 -0.986356 -0.00832395 +v 1.03063 1.00042 -0.3038 +vn 0.216868 -0.974528 -0.0571293 +v 1.0442 0.996225 -0.123994 +vn 0.208609 -0.977766 -0.0213635 +v 0.868792 0.970577 -0.325891 +vn 0.130819 -0.990842 -0.033453 +v 0.817383 0.963621 -0.23665 +vn 0.0684741 -0.99756 -0.0135925 +v 0.772383 0.9631 -0.385352 +vn 0.0593792 -0.998077 -0.017776 +v 0.744321 0.961339 -0.340421 +vn 0.0308242 -0.999477 -0.00976897 +v 0.789292 0.961618 -0.190561 +vn 0.0428058 -0.999054 -0.00769662 +v 0.68084 0.960134 -0.247626 +vn 0.00220547 -0.999996 -0.00200041 +v 0.885571 0.968299 -0.135955 +vn 0.113628 -0.993424 -0.0140536 +v 0.923385 0.971819 0.007151 +vn 0.139296 -0.990245 -0.00326538 +v 0.864801 0.965176 0.006252 +vn 0.087405 -0.99617 -0.00235941 +v 0.831032 0.962839 -0.042699 +vn 0.0618962 -0.998075 -0.00382442 +v 0.795979 0.961304 -0.092631 +vn 0.0399464 -0.999193 -0.00431183 +v 0.759665 0.960496 -0.143457 +vn 0.0207148 -0.999778 -0.00376932 +v 0.801477 0.961255 0.005338 +vn 0.039976 -0.9992 -0.00119452 +v 0.696103 0.959924 -0.046312 +vn -0.00115676 -0.999999 -0.000330758 +v 0.798897 0.966052 -0.42925 +vn 0.0943633 -0.995076 -0.0303227 +v 0.752568 0.967575 -0.579707 +vn 0.0977875 -0.993525 -0.0578504 +v 0.636436 0.960385 -0.402505 +vn 0.00471776 -0.999985 -0.00289544 +v 0.66742 0.96073 -0.446316 +vn 0.0113608 -0.999912 -0.00690048 +v 0.724788 0.963635 -0.534646 +vn 0.0555105 -0.997977 -0.0310015 +v 0.618337 0.962035 -0.597594 +vn 0.0202102 -0.999515 -0.0236875 +v 0.647493 0.964067 -0.640888 +vn 0.0392441 -0.998291 -0.0433098 +v 0.330771 0.960178 -0.422018 +vn 9.16528e-06 -1 -2.31285e-05 +v 0.328455 0.96018 -0.473871 +vn 4.71841e-05 -1 -0.000187208 +v 0.368222 0.960182 -0.471698 +vn 0.000128193 -1 -0.00035553 +v 0.32594 0.960197 -0.525275 +vn 0.000487345 -1 -0.000468976 +v 0.323403 0.960224 -0.576299 +vn 0.0011875 -0.999999 -0.000535968 +v 0.404547 0.960229 -0.520346 +vn 0.000741211 -0.999999 -0.00151684 +v 0.439776 0.960397 -0.56794 +vn 0.00244119 -0.999988 -0.00421236 +v 0.488268 0.960179 -0.412905 +vn 0.000187275 -1 -0.000106414 +v 0.484946 0.960187 -0.463868 +vn 0.000204322 -1 -0.000925305 +v 0.522747 0.960196 -0.460785 +vn 0.000888537 -0.999999 -0.00139216 +v 0.477686 0.960467 -0.564652 +vn 0.00265652 -0.999981 -0.00564092 +v 0.587787 0.960916 -0.553127 +vn 0.00962109 -0.999883 -0.0119096 +v 0.32055 0.960246 -0.628752 +vn 0.00308219 -0.999995 -0.00098046 +v 0.356437 0.960471 -0.673849 +vn 0.00679942 -0.999964 -0.0051381 +v 0.383673 0.963755 -0.816197 +vn 0.0283456 -0.998567 -0.0453965 +v 0.424563 0.96281 -0.764597 +vn 0.0235316 -0.999144 -0.0340235 +v 0.473588 0.960827 -0.616335 +vn 0.00631805 -0.999931 -0.0098927 +v 0.506488 0.961656 -0.6596 +vn 0.0136127 -0.999727 -0.0189765 +v 0.456837 0.965727 -0.808153 +vn 0.0380636 -0.997505 -0.0594507 +v 0.528031 0.968171 -0.798843 +vn 0.0519141 -0.995657 -0.0772732 +v 0.56811 0.966401 -0.746601 +vn 0.0469347 -0.996801 -0.0646946 +v 0.335166 0.960178 -0.317355 +vn 0 -1 0 +v 0.333071 0.960178 -0.369861 +vn 0 -1 0 +v 0.415839 0.960178 -0.314076 +vn 3.72103e-06 -1 3.85451e-09 +v 0.452651 0.960178 -0.36399 +vn 5.34281e-06 -1 -8.02923e-07 +v 0.339083 0.960178 -0.211659 +vn 0 -1 0 +v 0.337236 0.960178 -0.264631 +vn 0 -1 0 +v 0.377995 0.960178 -0.26328 +vn 0 -1 0 +v 0.342465 0.960178 -0.105286 +vn 0 -1 0 +v 0.340894 0.960178 -0.158545 +vn 0 -1 0 +v 0.424733 0.960178 -0.103883 +vn 0 -1 0 +v 0.463006 0.960178 -0.155564 +vn 0 -1 0 +v 0.345261 0.960178 0.001394 +vn 0 -1 0 +v 0.343991 0.960178 -0.051967 +vn 0 -1 0 +v 0.385494 0.960178 -0.051531 +vn 0 -1 0 +v 0.494554 0.960179 -0.310133 +vn 5.68764e-05 -1 -1.05551e-05 +v 0.491564 0.960178 -0.361675 +vn 5.26121e-05 -1 -3.33544e-06 +v 0.570905 0.960189 -0.305532 +vn 0.000300147 -1 -0.000291495 +v 0.604456 0.960237 -0.353578 +vn 0.00126919 -0.999999 -0.00107694 +v 0.50013 0.960178 -0.206455 +vn -1.86352e-05 -1 -5.67576e-06 +v 0.497507 0.960178 -0.258404 +vn 1.34591e-05 -1 -1.04096e-05 +v 0.536158 0.960179 -0.256478 +vn 3.34249e-05 -1 -8.54904e-05 +v 0.651394 0.960117 -0.199334 +vn -0.000423127 -1 -0.000725866 +v 0.654582 0.960078 -0.148676 +vn -0.00198555 -0.999998 -0.000525383 +v 0.617682 0.960141 -0.150242 +vn -0.00118149 -0.999999 -0.000307623 +v 0.657307 0.960052 -0.097922 +vn -0.00150892 -0.999999 -0.000354857 +v 0.659964 0.960034 -0.047146 +vn -0.00263877 -0.999997 -0.000101144 +v 0.582593 0.960163 -0.100204 +vn -0.00075042 -1 -7.28771e-05 +v 0.546344 0.960176 -0.049324 +vn -0.000216967 -1 -1.98329e-05 +v 0.292338 0.960178 -0.371417 +vn 0 -1 0 +v 0.252893 0.960178 -0.319953 +vn 0 -1 0 +v 0.21256 0.960178 -0.267761 +vn 0 -1 0 +v 0.166991 0.960178 -0.427836 +vn 4.20287e-06 -1 1.86535e-05 +v 0.16819 0.960178 -0.37497 +vn 0 -1 0 +v 0.126209 0.960178 -0.376361 +vn 0 -1 0 +v 0.169277 0.960178 -0.321998 +vn 0 -1 0 +v 0.170364 0.960178 -0.268523 +vn 0 -1 0 +v 0.084679 0.960178 -0.328021 +vn 0 -1 0 +v 0.042574 0.960178 -0.285151 +vn 0 -1 0 +v 0.299258 0.960178 -0.159336 +vn 0 -1 0 +v 0.258498 0.960178 -0.106401 +vn 0 -1 0 +v 0.216946 0.960178 -0.05299 +vn 0 -1 0 +v 0.171329 0.960178 -0.215051 +vn 0 -1 0 +v 0.172287 0.960178 -0.161155 +vn 0 -1 0 +v 0.12933 0.960178 -0.162192 +vn 0 -1 0 +v 0.173113 0.960178 -0.107372 +vn 0 -1 0 +v 0.173929 0.960178 -0.053248 +vn 0 -1 0 +v 0.08667 0.960178 -0.112799 +vn 0 -1 0 +v 0.043525 0.960178 -0.069192 +vn 0 -1 0 +v 0.245842 0.960172 -0.529183 +vn 0.000341848 -1 0.000343215 +v 0.206908 0.960177 -0.478897 +vn 5.62507e-05 -1 0.000141107 +v 0.283799 0.96018 -0.578517 +vn 0.00120029 -0.999999 0.000288277 +v 0.200094 0.959772 -0.683371 +vn 0.00286305 -0.999993 0.00257367 +v 0.27367 0.960619 -0.777581 +vn 0.0122619 -0.999792 -0.0163272 +v 0.164483 0.960154 -0.532175 +vn 0.000189629 -1 0.00088886 +v 0.165793 0.960176 -0.480113 +vn 1.65796e-05 -1 0.000229547 +v 0.082216 0.96014 -0.538649 +vn 4.40424e-05 -0.999999 0.0013168 +v 0.041381 0.960173 -0.497123 +vn -4.10106e-05 -1 0.000471742 +v 0.161724 0.959927 -0.634643 +vn 0.00121889 -0.999991 0.00401207 +v 0.163164 0.960083 -0.583572 +vn 0.00046971 -0.999997 0.00220366 +v 0.122389 0.960061 -0.585261 +vn 0.000410697 -0.999997 0.0026118 +v 0.160262 0.959667 -0.684963 +vn 0.00221399 -0.99999 0.00385935 +v 0.03992 0.959389 -0.702006 +vn 0.000897927 -0.999984 0.00566297 +v 0.117778 0.959516 -0.785878 +vn 0.00490489 -0.999956 -0.00801687 +v 0.933004 0.979265 0.379347 +vn 0.177142 -0.983462 0.0377336 +v 0.945954 0.976437 0.194408 +vn 0.164983 -0.986123 0.0185143 +v 1.0623 1.00413 0.316416 +vn 0.218995 -0.97485 0.0413467 +v 0.964666 0.978963 0.145918 +vn 0.178616 -0.983844 0.0121473 +v 1.00436 0.986076 0.055413 +vn 0.201069 -0.979576 0.00114919 +v 1.05579 0.997087 0.055145 +vn 0.212358 -0.977189 0.0025901 +v 0.929363 0.98732 0.562298 +vn 0.221767 -0.972994 0.0640524 +v 1.07481 1.02577 0.573524 +vn 0.245874 -0.963414 0.106673 +v 0.900837 0.978985 0.519474 +vn 0.184368 -0.981844 0.0446142 +v 0.841681 0.96775 0.435184 +vn 0.106468 -0.994095 0.0209831 +v 0.809881 0.964221 0.3913 +vn 0.0701512 -0.997445 0.0135349 +v 0.806328 0.967148 0.580564 +vn 0.103682 -0.994356 0.0225068 +v 0.774293 0.963864 0.53834 +vn 0.0620363 -0.997979 0.0137548 +v 0.705984 0.960936 0.450163 +vn 0.0149287 -0.99988 0.0041976 +v 0.918552 0.997907 0.737508 +vn 0.277557 -0.956613 0.0886195 +v 0.836857 0.972186 0.621558 +vn 0.153519 -0.987479 0.036287 +v 0.799729 0.971953 0.766593 +vn 0.161183 -0.985877 0.0454522 +v 0.767454 0.966434 0.725194 +vn 0.0995564 -0.994735 0.0243008 +v 0.7018 0.961772 0.643014 +vn 0.0290059 -0.999556 0.00674628 +v 0.90382 0.973163 0.334498 +vn 0.143745 -0.98927 0.0261203 +v 0.850931 0.965331 0.244892 +vn 0.0865124 -0.996151 0.0141212 +v 0.825363 0.962917 0.198649 +vn 0.0614041 -0.998079 0.00823431 +v 0.848815 0.964157 0.14994 +vn 0.0772316 -0.99699 0.00684531 +v 0.897401 0.968423 0.054145 +vn 0.116034 -0.993245 0.000619076 +v 0.776973 0.962033 0.346226 +vn 0.0393735 -0.999185 0.00891529 +v 0.669946 0.960499 0.404224 +vn 0.00711392 -0.999973 0.0019725 +v 0.688125 0.960147 0.204437 +vn 0.00163219 -0.999997 0.00193561 +v 0.712898 0.960299 0.252847 +vn 0.00527829 -0.99998 0.00351461 +v 0.679457 0.960235 0.254539 +vn 0.0013435 -0.999997 0.00203118 +v 0.710888 0.960024 0.154026 +vn 0.00173734 -0.999996 0.00231093 +v 0.770759 0.960384 0.05427 +vn 0.0206445 -0.999787 0.000429466 +v 0.350433 0.960178 0.371209 +vn 0 -1 0 +v 0.353219 0.960178 0.318764 +vn 0 -1 0 +v 0.361204 0.960178 0.266115 +vn 0 -1 0 +v 0.37165 0.960178 0.213326 +vn 0 -1 0 +v 0.403184 0.960178 0.265001 +vn 0 -1 0 +v 0.436913 0.960178 0.315952 +vn 3.42223e-06 -1 7.12587e-08 +v 0.47529 0.960178 0.366032 +vn 8.16187e-06 -1 5.52295e-06 +v 0.515793 0.960178 0.364023 +vn 7.50938e-05 -1 1.19597e-05 +v 0.518353 0.960179 0.312638 +vn 0.000122374 -1 1.63976e-05 +v 0.525824 0.960178 0.261076 +vn 2.54607e-05 -1 1.38547e-05 +v 0.535473 0.960178 0.209434 +vn -2.09676e-05 -1 1.59898e-05 +v 0.565389 0.96018 0.259566 +vn 0.000170684 -1 0.000189459 +v 0.597088 0.960206 0.30885 +vn 0.000972265 -0.999999 0.000384807 +v 0.629766 0.960282 0.357315 +vn 0.00264346 -0.999996 0.000975141 +v 0.359926 0.960178 0.1608 +vn 0 -1 0 +v 0.401791 0.960178 0.16023 +vn 0 -1 0 +v 0.350735 0.960178 0.107913 +vn 0 -1 0 +v 0.346797 0.960178 0.054728 +vn 0 -1 0 +v 0.433976 0.960178 0.107302 +vn 0 -1 0 +v 0.470651 0.960178 0.054594 +vn 0 -1 0 +v 0.52413 0.960178 0.158225 +vn -2.48824e-05 -1 4.88551e-06 +v 0.563612 0.960176 0.157453 +vn -0.000186347 -1 0.000111923 +v 0.515022 0.960178 0.106579 +vn -8.88115e-05 -1 1.02394e-05 +v 0.510861 0.960178 0.054546 +vn -3.74795e-05 -1 2.18996e-06 +v 0.593428 0.960157 0.105766 +vn -0.000853274 -1 0.000151352 +v 0.627225 0.960111 0.054415 +vn -0.00175921 -0.999998 0.000133218 +v 0.433177 0.960178 0.521915 +vn 1.06909e-05 -1 -1.01129e-07 +v 0.391988 0.960178 0.473141 +vn 0 -1 0 +v 0.515184 0.960178 0.46594 +vn 0.000114214 -1 9.92559e-06 +v 0.470152 0.960178 0.569844 +vn 4.09193e-05 -1 5.1545e-06 +v 0.348316 0.960178 0.630139 +vn 0 -1 0 +v 0.389433 0.960178 0.675366 +vn 0 -1 0 +v 0.513002 0.960182 0.616064 +vn 0.000506037 -1 1.25852e-05 +v 0.468993 0.960178 0.766268 +vn 8.10881e-05 -1 0.000113079 +v 0.554917 0.960187 0.463137 +vn 0.000755225 -1 0.000141458 +v 0.668915 0.960686 0.502767 +vn 0.0110285 -0.999936 0.00241856 +v 0.63073 0.960461 0.555591 +vn 0.00716494 -0.999973 0.00147821 +v 0.551439 0.9602 0.661338 +vn 0.00164841 -0.999999 0.000247709 +v 0.666912 0.960912 0.599964 +vn 0.0156816 -0.999872 0.00306767 +v 0.663856 0.961172 0.695551 +vn 0.0212437 -0.999766 0.00410563 +v 0.624906 0.960702 0.747988 +vn 0.0136128 -0.999904 0.00272703 +v 0.349884 0.960178 0.47516 +vn 0 -1 0 +v 0.349487 0.960178 0.526568 +vn 0 -1 0 +v 0.349049 0.960178 0.577618 +vn 0 -1 0 +v 0.30652 0.960178 0.579758 +vn 0 -1 0 +v 0.263973 0.960178 0.53029 +vn 0 -1 0 +v 0.220882 0.960178 0.479884 +vn 0 -1 0 +v 0.177174 0.960178 0.481039 +vn 0 -1 0 +v 0.176941 0.960178 0.53317 +vn 0 -1 0 +v 0.176701 0.960178 0.584664 +vn 0 -1 0 +v 0.176314 0.960178 0.635872 +vn 0 -1 0 +v 0.132742 0.960178 0.58633 +vn 0 -1 0 +v 0.088735 0.960178 0.539597 +vn 0 -1 0 +v 0.044456 0.960178 0.497987 +vn 0 -1 0 +v 0.344301 0.960186 0.824976 +vn 6.4805e-05 -1 0.000955713 +v 0.303416 0.960178 0.779423 +vn 1.20469e-05 -1 7.79785e-05 +v 0.219369 0.960178 0.684787 +vn 0 -1 0 +v 0.17592 0.960178 0.686368 +vn 0 -1 0 +v 0.175356 0.960178 0.738432 +vn 8.88621e-08 -1 1.71717e-05 +v 0.174144 0.960185 0.834571 +vn 3.69081e-05 -1 0.000766431 +v 0.131279 0.960178 0.787808 +vn 1.09006e-05 -1 6.5518e-05 +v 0.044083 0.960178 0.703462 +vn 0 -1 0 +v 0.267697 0.960178 0.321037 +vn 0 -1 0 +v 0.307812 0.960178 0.372605 +vn 0 -1 0 +v 0.180592 0.960178 0.32281 +vn 0 -1 0 +v 0.177668 0.960178 0.375841 +vn 0 -1 0 +v 0.200079 0.960178 0.215904 +vn 0 -1 0 +v 0.23266 0.960178 0.268762 +vn 0 -1 0 +v 0.189051 0.960178 0.269423 +vn 0 -1 0 +v 0.26571 0.960178 0.108397 +vn 0 -1 0 +v 0.231757 0.960178 0.162134 +vn 0 -1 0 +v 0.304547 0.960178 0.054762 +vn 0 -1 0 +v 0.090891 0.960178 0.327048 +vn 0 -1 0 +v 0.133523 0.960178 0.377073 +vn 0 -1 0 +v 0 0.960178 0.34953 +vn 0 -1 0 +v 0 0.960178 0.405744 +vn 0 -1 0 +v 0 0.960178 0.216953 +vn 0 -1 0 +v 0.045268 0.960178 0.276267 +vn 0 -1 0 +v 0 0.960178 0.287459 +vn 0 -1 0 +v 0.17914 0.960178 0.108664 +vn 0 -1 0 +v 0.188282 0.960178 0.162457 +vn 0 -1 0 +v 0.065066 0.960178 0.216849 +vn 0 -1 0 +v 0.044977 0.960178 0.157301 +vn 0 -1 0 +v 0.174604 0.960178 0.000653 +vn 0 -1 0 +v 0.175597 0.960178 0.05481 +vn 0 -1 0 +v 0.131876 0.960178 0.054271 +vn 0 -1 0 +v 0.892744 1.04005 1.07127 +vn 0.405102 -0.878288 0.253975 +v 0.905587 1.013 0.909096 +vn 0.353789 -0.925725 0.133666 +v 0.884857 1.0938 1.22055 +vn 0.409864 -0.833542 0.370432 +v 0.77375 1.00505 1.10697 +vn 0.25774 -0.93133 0.257282 +v 0.76616 1.0612 1.26084 +vn 0.299775 -0.873221 0.384213 +v 0.638235 0.988457 1.14008 +vn 0.123648 -0.964198 0.234593 +v 0.886963 1.15867 1.35357 +vn 0.416457 -0.807874 0.417017 +v 0.767811 1.12715 1.39952 +vn 0.338094 -0.845249 0.413819 +v 0.631406 1.04055 1.29808 +vn 0.197902 -0.913036 0.35665 +v 0.785779 0.9794 0.940498 +vn 0.205597 -0.974049 0.0946488 +v 0.648859 0.965753 0.974283 +vn 0.0693541 -0.995216 0.0688159 +v 0.693315 0.963035 0.829198 +vn 0.0531483 -0.998432 0.0175839 +v 0.332085 0.97708 1.187 +vn 0.0343423 -0.985893 0.163815 +v 0.338331 0.96218 1.01162 +vn 0.00601927 -0.999397 0.0342032 +v 0.377398 0.964225 1.05266 +vn 0.012432 -0.998353 0.056009 +v 0.453201 0.973035 1.13059 +vn 0.038973 -0.989771 0.137236 +v 0.490008 0.980944 1.16738 +vn 0.0627266 -0.979046 0.193739 +v 0.498795 0.962812 0.994043 +vn 0.0120365 -0.998929 0.0446781 +v 0.535037 0.96554 1.03288 +vn 0.0262799 -0.996877 0.0744634 +v 0.384317 0.960229 0.86924 +vn 0.000551264 -0.999995 0.00315553 +v 0.461588 0.961261 0.953801 +vn 0.00547032 -0.999712 0.0233698 +v 0.50728 0.960194 0.80979 +vn 0.00100355 -0.999999 0.00128958 +v 0.544463 0.960281 0.85196 +vn 0.00364737 -0.999983 0.00457006 +v 0.615446 0.962323 0.932153 +vn 0.030884 -0.998938 0.0341974 +v 0.370809 0.986098 1.22469 +vn 0.0522871 -0.975212 0.215007 +v 0.446849 1.01092 1.29559 +vn 0.097964 -0.950997 0.293272 +v 0.328016 1.01712 1.35046 +vn 0.0719718 -0.954316 0.290003 +v 0.36741 1.03131 1.38458 +vn 0.0913166 -0.945504 0.312544 +v 0.484336 1.02609 1.32864 +vn 0.125651 -0.939932 0.317396 +v 0.446045 1.06339 1.44778 +vn 0.137486 -0.924214 0.356266 +v 0.526152 0.991915 1.20266 +vn 0.0941724 -0.9628 0.253274 +v 0.52159 1.04263 1.35997 +vn 0.155455 -0.927961 0.338707 +v 0.631257 1.10117 1.44421 +vn 0.256289 -0.88472 0.38934 +v 0.288439 1.00411 1.31477 +vn 0.0540326 -0.962521 0.265772 +v 0.208347 0.982767 1.239 +vn 0.0255854 -0.980749 0.193588 +v 0.167649 0.974984 1.19914 +vn 0.0159363 -0.988878 0.147872 +v 0.165501 1.01244 1.36387 +vn 0.0323993 -0.960624 0.275958 +v 0.124473 1.00091 1.32626 +vn 0.0220166 -0.967018 0.253755 +v 0.04174 0.983664 1.25776 +vn 0.00738521 -0.980082 0.198454 +v 0.328864 1.06948 1.50134 +vn 0.0966506 -0.924781 0.36802 +v 0.287921 1.0535 1.46935 +vn 0.0769288 -0.936111 0.343188 +v 0.206349 1.02505 1.40049 +vn 0.0448444 -0.953515 0.29799 +v 0.166109 1.06338 1.51648 +vn 0.0437642 -0.931291 0.361638 +v 0.124435 1.04898 1.48212 +vn 0.0305033 -0.940929 0.337228 +v 0.041441 1.02619 1.41904 +vn 0.00932879 -0.954329 0.298613 +v 0.292787 0.970611 1.14788 +vn 0.0209921 -0.993162 0.114842 +v 0.212275 0.963466 1.06559 +vn 0.00602599 -0.998909 0.0463016 +v 0.298455 0.961008 0.969248 +vn 0.00283599 -0.999837 0.0178146 +v 0.170993 0.961822 1.0226 +vn 0.00288834 -0.99959 0.0284872 +v 0.21633 0.960218 0.880632 +vn 0.000261051 -0.999997 0.00245617 +v 0.126415 0.969407 1.1584 +vn 0.00951313 -0.994439 0.104879 +v 0 0.977449 1.2254 +vn 1.93391e-18 -0.986312 0.164889 +v 0.042539 0.963606 1.08464 +vn 0.00208779 -0.998856 0.0477794 +v 0.129011 0.960872 0.978829 +vn 0.0014636 -0.999885 0.015107 +v 0 0.962253 1.04999 +vn 5.52225e-19 -0.999427 0.0338362 +v 0.043411 0.960225 0.899903 +vn 0.000133553 -0.999996 0.00268815 +v 0.912945 3.01305 0.912156 +vn 0.594769 0.792142 0.136969 +v 0.922899 3.02745 0.742126 +vn 0.600566 0.798143 0.047831 +v 0.874669 3.05713 0.835965 +vn 0.670911 0.731688 0.120458 +v 0.811384 3.12047 0.846683 +vn 0.774883 0.616005 0.141752 +v 0.882316 3.06462 0.658522 +vn 0.666514 0.745023 0.0264619 +v 0.820142 3.12758 0.664367 +vn 0.776298 0.629812 0.0264163 +v 0.858968 3.03579 1.00562 +vn 0.646549 0.733486 0.209697 +v 0.864935 2.94011 1.26066 +vn 0.565612 0.747346 0.348651 +v 0.787517 3.10063 1.01999 +vn 0.731434 0.640674 0.233542 +v 0.78377 3.11768 0.984373 +vn 0.745999 0.631944 0.210076 +v 0.698902 3.13021 1.17614 +vn 0.705495 0.606302 0.366982 +v 0.738715 3.0354 1.27212 +vn 0.604267 0.693936 0.391554 +v 0.291586 3.37092 1.3527 +vn 0.330583 0.4944 0.803918 +v 0.148575 3.3782 1.3915 +vn 0.167286 0.52336 0.83553 +v 0.264156 3.29017 1.41817 +vn 0.289036 0.562166 0.774872 +v 0.304047 3.25861 1.42537 +vn 0.329312 0.571195 0.751857 +v 0.142976 3.26623 1.47057 +vn 0.154369 0.592185 0.790877 +v 0.190707 3.23662 1.48201 +vn 0.206161 0.600965 0.77223 +v 0.268599 3.17739 1.50429 +vn 0.273816 0.60739 0.745723 +v 0 3.36239 1.4165 +vn -2.15411e-06 0.550458 0.834863 +v 0 3.27611 1.47816 +vn 2.20995e-18 0.597173 0.802113 +v 0 3.18812 1.54528 +vn -2.21029e-18 0.618945 0.785435 +v 0.406709 3.27582 1.35819 +vn 0.44687 0.536048 0.716212 +v 0.423474 3.36204 1.28797 +vn 0.499341 0.451863 0.739242 +v 0.447115 3.24171 1.35765 +vn 0.484911 0.549354 0.680494 +v 0.566623 3.2327 1.25562 +vn 0.657407 0.518023 0.547237 +v 0.344692 3.22592 1.43173 +vn 0.364122 0.580841 0.728038 +v 0.307967 3.14083 1.51917 +vn 0.299786 0.617421 0.727269 +v 0.393732 3.13435 1.4836 +vn 0.376779 0.619304 0.68884 +v 0.428371 3.15739 1.44244 +vn 0.42217 0.607526 0.672818 +v 0.489026 3.20642 1.35564 +vn 0.516171 0.563783 0.644761 +v 0.573504 3.13627 1.34683 +vn 0.569499 0.604377 0.557135 +v 0.283803 3.47996 1.29906 +vn 0.323902 0.357581 0.875913 +v 0.411677 3.47688 1.23895 +vn 0.496115 0.295858 0.816295 +v 0.535697 3.35639 1.1958 +vn 0.678558 0.382273 0.627237 +v 0.522509 3.47449 1.15547 +vn 0.674734 0.207342 0.708338 +v 0.1448 3.4825 1.33561 +vn 0.160595 0.397695 0.903354 +v 0 3.46562 1.35629 +vn -1.10502e-18 0.440255 0.897873 +v 0 3.57621 1.31693 +vn 6.64834e-18 0.175897 0.984409 +v 0.760129 2.82546 -1.14833 +vn 0.735535 0.677484 0.00207408 +v 0.853737 2.71972 -1.10021 +vn 0.76996 0.635379 -0.058774 +v 0.839908 2.71688 -1.26886 +vn 0.813825 0.572614 -0.099009 +v 0.74857 2.83524 -1.32716 +vn 0.796156 0.603918 -0.037663 +v 0.831345 2.69219 -1.42087 +vn 0.848915 0.500015 -0.171257 +v 0.650162 2.93905 -1.19857 +vn 0.67458 0.733771 0.0807629 +v 0.639734 2.96866 -1.38418 +vn 0.741484 0.668853 0.0532652 +v 0.52891 3.0462 -1.24676 +vn 0.577616 0.798857 0.16789 +v 0.741229 2.81972 -1.4956 +vn 0.845658 0.513843 -0.144319 +v 0.719659 2.85994 -1.46741 +vn 0.829071 0.55089 -0.095712 +v 0.669079 2.93498 -1.41288 +vn 0.781334 0.624098 -0.00428945 +v 0.623432 2.99001 -1.56317 +vn 0.823372 0.565751 -0.0445456 +v 0.550936 3.07343 -1.46799 +vn 0.710175 0.693603 0.12069 +v 0.65804 2.91323 -1.01185 +vn 0.624344 0.778968 0.0583473 +v 0.771717 2.8123 -0.965614 +vn 0.685819 0.727758 -0.00444736 +v 0.667778 2.89977 -0.828218 +vn 0.599769 0.799817 -0.0238668 +v 0.534089 3.00779 -1.05893 +vn 0.53521 0.835958 0.121346 +v 0.537837 2.98794 -0.873066 +vn 0.517485 0.855406 0.0221434 +v 0.869508 2.71649 -0.921632 +vn 0.723958 0.687177 -0.0606059 +v 0.781701 2.81033 -0.784268 +vn 0.652007 0.75503 -0.069403 +v 0.882972 2.72351 -0.742392 +vn 0.684809 0.719628 -0.114769 +v 0.793386 2.87118 -0.440652 +vn 0.608227 0.760159 -0.228512 +v 0.819693 2.84046 -0.472347 +vn 0.619041 0.754042 -0.219563 +v 0.897504 2.79667 -0.404059 +vn 0.62808 0.738359 -0.245645 +v 0.891142 2.75248 -0.569501 +vn 0.653335 0.732585 -0.190977 +v 0.789497 2.83006 -0.611244 +vn 0.627933 0.761486 -0.160742 +v 0.761187 2.86019 -0.578288 +vn 0.613097 0.770488 -0.174528 +v 0.703707 2.91955 -0.51599 +vn 0.586016 0.784479 -0.202925 +v 0.673873 2.94974 -0.485166 +vn 0.572595 0.790425 -0.217632 +v 0.669473 2.91505 -0.655183 +vn 0.582377 0.802328 -0.130793 +v 0.638928 2.94217 -0.624276 +vn 0.565602 0.810932 -0.149944 +v 0.576157 2.99667 -0.564122 +vn 0.530884 0.825552 -0.191379 +v 0.699269 2.88814 -0.686577 +vn 0.599977 0.791923 -0.113513 +v 0.634984 2.92482 -0.796319 +vn 0.578419 0.814782 -0.0395068 +v 0.572795 2.97105 -0.732417 +vn 0.536342 0.840047 -0.0815973 +v 0.766229 2.9024 -0.408952 +vn 0.598993 0.764539 -0.23809 +v 0.710169 2.96619 -0.344655 +vn 0.583645 0.770369 -0.256689 +v 0.80073 2.92056 -0.271924 +vn 0.598082 0.75799 -0.260284 +v 0.775694 2.95178 -0.238413 +vn 0.594606 0.759849 -0.262818 +v 0.681534 2.99903 -0.311378 +vn 0.577166 0.772092 -0.265994 +v 0.689898 3.02442 -0.221139 +vn 0.586874 0.762865 -0.271323 +v 0.727106 3.01448 -0.167226 +vn 0.595459 0.758079 -0.265981 +v 0.64348 2.98022 -0.454489 +vn 0.56079 0.794258 -0.233814 +v 0.545793 3.0235 -0.532535 +vn 0.513557 0.831309 -0.212569 +v 0.546272 3.04614 -0.451569 +vn 0.516138 0.81823 -0.253182 +v 0.581103 3.04206 -0.394168 +vn 0.535986 0.800371 -0.268561 +v 0.652585 3.03286 -0.276823 +vn 0.574336 0.770428 -0.276728 +v 0.548842 3.07322 -0.365839 +vn 0.523828 0.802125 -0.286704 +v 0.558883 3.1444 -0.169392 +vn 0.571643 0.752975 -0.325966 +v 0.590777 3.1053 -0.206402 +vn 0.567466 0.764126 -0.306746 +v 0.552303 3.1266 -0.222836 +vn 0.551385 0.76962 -0.321963 +v 0.825606 2.88953 -0.304725 +vn 0.603973 0.754081 -0.258029 +v 0.873679 2.82834 -0.369469 +vn 0.618917 0.744348 -0.250774 +v 0.901308 2.85221 -0.236938 +vn 0.607085 0.747629 -0.269255 +v 0.814577 2.96801 -0.102444 +vn 0.596123 0.761318 -0.255015 +v 0.83712 2.93915 -0.135538 +vn 0.596289 0.759304 -0.26057 +v 0.918053 2.89988 -0.066017 +vn 0.588447 0.765079 -0.261504 +v 0.914808 2.9857 0.220731 +vn 0.584698 0.789105 -0.188259 +v 0.840405 3.00383 0.075127 +vn 0.60175 0.76668 -0.223827 +v 0.801488 3.07197 0.2054 +vn 0.644521 0.737946 -0.200068 +v 0.748098 3.07527 0.061914 +vn 0.63559 0.733479 -0.2409 +v 0.735459 3.10183 0.108126 +vn 0.659533 0.712321 -0.24003 +v 0.711033 3.16995 0.231193 +vn 0.728372 0.641111 -0.241766 +v 0.796104 2.99563 -0.062865 +vn 0.598683 0.760667 -0.250926 +v 0.761655 3.04951 0.017843 +vn 0.617622 0.748002 -0.242972 +v 0.72605 3.06201 -0.033092 +vn 0.617094 0.743615 -0.257358 +v 0.705261 3.0455 -0.128186 +vn 0.60019 0.753629 -0.267984 +v 0.684078 3.07767 -0.086411 +vn 0.610631 0.74313 -0.273655 +v 0.671183 3.10638 -0.038455 +vn 0.624592 0.729802 -0.277982 +v 0.658511 3.13266 0.000742 +vn 0.637842 0.715129 -0.285917 +v 0.826074 3.09899 0.422922 +vn 0.699227 0.704201 -0.123221 +v 0.852036 3.08144 0.474125 +vn 0.668961 0.738849 -0.0811914 +v 0.832108 3.10432 0.507557 +vn 0.711957 0.697215 -0.0837229 +v 0.74842 3.17403 0.373241 +vn 0.774054 0.605892 -0.183673 +v 0.806541 3.12801 0.476681 +vn 0.746798 0.659312 -0.0871787 +v 0.901493 3.0136 0.305018 +vn 0.592149 0.79182 -0.1496 +v 0.916929 3.02815 0.482374 +vn 0.597156 0.79908 -0.0698229 +v 0.269343 3.18413 -1.28511 +vn 0.279216 0.912415 0.299226 +v 0.301465 3.18716 -1.32542 +vn 0.320942 0.894144 0.312253 +v 0.401304 3.12769 -1.27023 +vn 0.424226 0.871104 0.247407 +v 0.363622 3.19086 -1.40684 +vn 0.422547 0.847593 0.320997 +v 0.26582 3.25003 -1.44765 +vn 0.303629 0.858105 0.414083 +v 0.393482 3.19068 -1.44854 +vn 0.482833 0.817082 0.315037 +v 0.367911 3.28068 -1.59831 +vn 0.553967 0.70843 0.437318 +v 0.432332 3.12325 -1.31078 +vn 0.471775 0.847424 0.243517 +v 0.524204 3.07065 -1.33933 +vn 0.601959 0.777845 0.180561 +v 0.492528 3.10738 -1.3918 +vn 0.585569 0.78445 0.20432 +v 0.422397 3.18846 -1.49154 +vn 0.553273 0.780753 0.290367 +v 0.517266 3.11958 -1.53124 +vn 0.712096 0.688783 0.136007 +v 0.521749 3.10517 -1.48232 +vn 0.682176 0.71559 0.150226 +v 0.49665 3.16804 -1.63815 +vn 0.784259 0.607998 0.123597 +v 0.473236 3.18049 -1.5879 +vn 0.709486 0.668911 0.221782 +v 0.506735 3.1429 -1.58191 +vn 0.738274 0.653313 0.167732 +v 0.232007 3.24295 -1.40964 +vn 0.251813 0.882833 0.396481 +v 0.167976 3.22556 -1.33229 +vn 0.169052 0.921436 0.349825 +v 0.135033 3.21662 -1.29287 +vn 0.134048 0.936375 0.324396 +v 0.134443 3.28266 -1.44795 +vn 0.134721 0.877169 0.460895 +v 0.099297 3.2694 -1.41222 +vn 0.0965755 0.899781 0.42552 +v 0 3.2373 -1.32467 +vn 3.31413e-18 0.935508 0.353306 +v 0.247017 3.33792 -1.58057 +vn 0.31054 0.749712 0.584377 +v 0.123369 3.36723 -1.57461 +vn 0.122662 0.759872 0.638395 +v 0 3.30632 -1.47406 +vn 2.20986e-18 0.86704 0.498239 +v 0.236698 3.18068 -1.24494 +vn 0.241805 0.928936 0.280372 +v 0.170152 3.17321 -1.16461 +vn 0.17372 0.956337 0.235034 +v 0.27175 3.13676 -1.11084 +vn 0.277837 0.940373 0.196227 +v 0.238329 3.13839 -1.07181 +vn 0.246751 0.953614 0.172437 +v 0.136409 3.16946 -1.12447 +vn 0.140789 0.967724 0.209016 +v 0.170763 3.14188 -0.995114 +vn 0.182098 0.976245 0.117414 +v 0.101659 3.20772 -1.25323 +vn 0.0995201 0.949796 0.296621 +v 0 3.18701 -1.15944 +vn -4.41888e-18 0.97235 0.233527 +v 0.102464 3.16583 -1.08471 +vn 0.106536 0.97766 0.181191 +v 0 3.15756 -0.993174 +vn -3.03041e-06 0.993654 0.112477 +v 0.304831 3.1351 -1.15022 +vn 0.310072 0.925752 0.216423 +v 0.369675 3.13087 -1.22994 +vn 0.382833 0.891409 0.242549 +v 0.404777 3.08256 -1.08773 +vn 0.407096 0.897719 0.168446 +v 0.436781 3.07494 -1.12626 +vn 0.441162 0.879172 0.180092 +v 0.499013 3.05692 -1.20381 +vn 0.523884 0.831997 0.182557 +v 0.269271 3.1123 -0.939946 +vn 0.28542 0.955388 0.0759535 +v 0.306103 3.10403 -0.975249 +vn 0.315105 0.943042 0.106678 +v 0.372273 3.08981 -1.04962 +vn 0.374499 0.914734 0.151699 +v 0.406556 3.05882 -0.910644 +vn 0.410288 0.910249 0.0557804 +v 0.503184 3.02068 -1.01767 +vn 0.495772 0.860669 0.116012 +v 0.273726 3.1308 -0.63388 +vn 0.314462 0.927249 -0.203283 +v 0.409791 3.08497 -0.588138 +vn 0.426532 0.880773 -0.205693 +v 0.40815 3.06019 -0.745121 +vn 0.417497 0.905068 -0.0809224 +v 0.273287 3.10985 -0.780672 +vn 0.300564 0.951538 -0.0650892 +v 0.540914 2.99463 -0.697526 +vn 0.512334 0.852166 -0.106424 +v 0.137064 3.1598 -0.664706 +vn 0.170586 0.964039 -0.203787 +v 0.136997 3.14115 -0.804577 +vn 0.159518 0.985563 -0.0567364 +v 0 3.16504 -0.699375 +vn -2.21002e-18 0.984115 -0.17753 +v 0.133393 3.14435 -0.958228 +vn 0.14646 0.985457 0.0861593 +v 0 3.15065 -0.839081 +vn 2.20984e-18 0.999623 -0.0274681 +v 0.1364 3.19714 -0.536017 +vn 0.186329 0.92253 -0.337964 +v 0.273141 3.17123 -0.496107 +vn 0.337362 0.884766 -0.321521 +v 0.134292 3.25058 -0.416379 +vn 0.207087 0.869124 -0.449153 +v 0 3.19824 -0.57166 +vn 2.89383e-06 0.947108 -0.320914 +v 0 3.24771 -0.453486 +vn 1.10532e-18 0.896299 -0.44345 +v 0.410845 3.12999 -0.435633 +vn 0.44618 0.841617 -0.304311 +v 0.51173 3.05083 -0.50739 +vn 0.496688 0.835834 -0.233844 +v 0.269118 3.2287 -0.367365 +vn 0.369074 0.830342 -0.417512 +v 0.408485 3.19426 -0.286141 +vn 0.484319 0.788573 -0.378929 +v 0.515482 3.10424 -0.340288 +vn 0.514057 0.801182 -0.306353 +v 0.25045 3.38339 -0.155329 +vn 0.454162 0.631158 -0.62879 +v 0.369309 3.36994 -0.064474 +vn 0.588206 0.574027 -0.569654 +v 0.386322 3.27841 -0.162223 +vn 0.528735 0.709027 -0.466605 +v 0.259673 3.30074 -0.251161 +vn 0.406356 0.757081 -0.511569 +v 0.477191 3.35967 0.053461 +vn 0.698076 0.497784 -0.514686 +v 0.506561 3.25598 -0.036986 +vn 0.635682 0.656114 -0.406721 +v 0.427417 3.24701 -0.16317 +vn 0.542941 0.720028 -0.432175 +v 0.513836 3.1807 -0.164638 +vn 0.564082 0.74483 -0.356426 +v 0.544591 3.17377 -0.129032 +vn 0.586007 0.732259 -0.346976 +v 0.12631 3.39412 -0.214234 +vn 0.261861 0.680984 -0.683879 +v 0.130188 3.31738 -0.30634 +vn 0.231021 0.799737 -0.554121 +v 0 3.38429 -0.249222 +vn -4.42389e-18 0.7303 -0.683127 +v 0 3.31083 -0.343621 +vn -2.21114e-18 0.833524 -0.552484 +v 0 3.47584 -0.175788 +vn -4.44714e-18 0.448197 -0.893935 +v 0.285278 3.50189 -0.05284 +vn 0.61023 0.20859 -0.76427 +v 0.389698 3.56592 0.040727 +vn 0.674344 -0.117628 -0.728988 +v 0.475172 3.46248 0.119808 +vn 0.753301 0.224053 -0.618335 +v 1.5936 1.72364 0.393928 +vn 0.970209 -0.238211 0.0441651 +v 1.58352 1.69307 0.440823 +vn 0.966651 -0.250733 0.0521462 +v 1.58532 1.73769 0.575128 +vn 0.971166 -0.224223 0.0810035 +v 1.56196 1.63432 0.532244 +vn 0.960754 -0.269167 0.0670938 +v 1.55708 1.59157 0.396338 +vn 0.957152 -0.286862 0.0396196 +v 1.54662 1.56395 0.441811 +vn 0.954878 -0.293208 0.0472878 +v 1.55082 1.60661 0.576399 +vn 0.958386 -0.275676 0.074149 +v 1.51568 1.49016 0.570668 +vn 0.950953 -0.301885 0.0674824 +v 1.57434 1.70808 0.619812 +vn 0.967613 -0.236404 0.088531 +v 1.57145 1.75494 0.747358 +vn 0.971335 -0.205473 0.119541 +v 1.55164 1.65239 0.705839 +vn 0.961773 -0.253927 0.102538 +v 1.53969 1.58032 0.619274 +vn 0.956081 -0.281633 0.081194 +v 1.53964 1.62543 0.748927 +vn 0.959238 -0.260399 0.109794 +v 1.56732 1.62026 0.349963 +vn 0.959363 -0.280357 0.0319799 +v 1.58654 1.67983 0.255169 +vn 0.964908 -0.262091 0.016138 +v 1.5952 1.71016 0.207063 +vn 0.968164 -0.25019 0.00793499 +v 1.55753 1.57913 0.210153 +vn 0.95503 -0.296484 0.00380167 +v 1.56632 1.60772 0.162517 +vn 0.956846 -0.290563 -0.00426049 +v 1.58221 1.66579 0.06612 +vn 0.961452 -0.274217 -0.0203531 +v 1.52012 1.47469 0.397731 +vn 0.949433 -0.311949 0.0355556 +v 1.52953 1.49854 0.349025 +vn 0.950505 -0.309489 0.0274917 +v 1.54837 1.55124 0.257226 +vn 0.953137 -0.302306 0.0118757 +v 1.51843 1.45923 0.205911 +vn 0.947887 -0.3186 -0.00202755 +v 1.52764 1.48738 0.161873 +vn 0.948124 -0.317754 -0.00963537 +v 1.54332 1.53976 0.06924 +vn 0.94956 -0.312501 -0.0260397 +v 1.60299 1.75467 0.346476 +vn 0.973665 -0.225066 0.0363532 +v 1.61908 1.8168 0.250345 +vn 0.981051 -0.192787 0.0192999 +v 1.62327 1.87015 0.397267 +vn 0.987201 -0.151212 0.0506894 +v 1.62449 1.86197 0.345593 +vn 0.986298 -0.159921 0.0405066 +v 1.62956 1.89603 0.343308 +vn 0.990831 -0.128727 0.0410332 +v 1.62551 1.84729 0.201939 +vn 0.985026 -0.172098 0.0102572 +v 1.63885 1.95373 0.244292 +vn 0.996605 -0.0802416 0.0184474 +v 1.60304 1.74046 0.158677 +vn 0.971292 -0.23789 -0.000227184 +v 1.58907 1.69467 0.017612 +vn 0.964203 -0.263623 -0.0285508 +v 1.60609 1.76122 0.015304 +vn 0.972737 -0.230388 -0.0265235 +v 1.61579 1.79975 0.061537 +vn 0.978203 -0.206966 -0.0168314 +v 1.63069 1.87702 0.153523 +vn 0.98862 -0.150432 0.00110103 +v 1.62048 1.8281 0.012993 +vn 0.981918 -0.187551 -0.025738 +v 1.63134 1.89421 0.010869 +vn 0.990841 -0.132319 -0.0269244 +v 1.63691 1.93293 0.057034 +vn 0.995226 -0.095706 -0.0191077 +v 1.61509 1.83665 0.444449 +vn 0.982691 -0.175442 0.0594819 +v 1.59579 1.76823 0.529852 +vn 0.974791 -0.210646 0.0735569 +v 1.60898 1.87697 0.60147 +vn 0.986366 -0.134794 0.0944084 +v 1.58242 1.78368 0.704908 +vn 0.974867 -0.192831 0.111579 +v 1.62627 1.90644 0.433355 +vn 0.991056 -0.119348 0.0596993 +v 1.63816 2.00902 0.358015 +vn 0.998795 -0.0147778 0.0467991 +v 1.62508 2.01812 0.551439 +vn 0.995896 -0.00585839 0.0903128 +v 1.62747 1.97922 0.509651 +vn 0.99501 -0.0572347 0.0817208 +v 1.63 2.01324 0.493254 +vn 0.997074 -0.00741937 0.076075 +v 1.61511 2.01582 0.648656 +vn 0.993491 -0.00850976 0.113588 +v 1.60821 1.97999 0.698044 +vn 0.991241 -0.0440779 0.124494 +v 1.44725 1.27039 0.149434 +vn 0.904735 -0.425879 -0.00902125 +v 1.46836 1.31818 0.244392 +vn 0.929784 -0.368102 -0.00126697 +v 1.49792 1.39897 0.252004 +vn 0.94411 -0.329602 0.00441036 +v 1.50924 1.43219 0.253814 +vn 0.948147 -0.31776 0.00680104 +v 1.50351 1.4152 0.210714 +vn 0.945338 -0.326067 -0.00405564 +v 1.46289 1.31239 0.064187 +vn 0.928203 -0.369787 -0.0411907 +v 1.4936 1.39449 0.068046 +vn 0.94101 -0.336459 -0.0359956 +v 1.47031 1.33334 0.419916 +vn 0.931459 -0.362258 0.0339527 +v 1.55078 1.65791 -0.359785 +vn 0.94627 -0.302341 -0.114733 +v 1.5077 1.53591 -0.363796 +vn 0.929339 -0.346638 -0.12717 +v 1.51349 1.56627 -0.403261 +vn 0.931798 -0.338061 -0.132166 +v 1.51461 1.63947 -0.556829 +vn 0.929824 -0.324322 -0.173902 +v 1.52629 1.64569 -0.503214 +vn 0.935234 -0.317379 -0.156871 +v 1.51705 1.61834 -0.501284 +vn 0.929547 -0.333728 -0.156745 +v 1.4639 1.56967 -0.675738 +vn 0.910715 -0.354295 -0.212306 +v 1.46139 1.46467 -0.483345 +vn 0.917566 -0.362877 -0.162458 +v 1.43011 1.47764 -0.660555 +vn 0.90298 -0.373304 -0.212771 +v 1.42203 1.45529 -0.655672 +vn 0.903757 -0.371232 -0.213096 +v 1.55267 1.68338 -0.408124 +vn 0.947841 -0.292727 -0.12613 +v 1.55319 1.73277 -0.504299 +vn 0.951451 -0.266494 -0.154018 +v 1.584 1.7774 -0.364936 +vn 0.966766 -0.229718 -0.112217 +v 1.58343 1.80055 -0.412764 +vn 0.969404 -0.210559 -0.126179 +v 1.55154 1.75656 -0.551993 +vn 0.953914 -0.247033 -0.170358 +v 1.5781 1.84404 -0.505847 +vn 0.974648 -0.151271 -0.164857 +v 1.50471 1.64509 -0.617569 +vn 0.925828 -0.325553 -0.191985 +v 1.51739 1.66959 -0.596085 +vn 0.934552 -0.304903 -0.183428 +v 1.51249 1.72046 -0.692974 +vn 0.934123 -0.281393 -0.219617 +v 1.5484 1.77965 -0.599388 +vn 0.956116 -0.224629 -0.188106 +v 1.51942 1.74582 -0.694357 +vn 0.94132 -0.253403 -0.222942 +v 1.52024 1.79637 -0.739379 +vn 0.950028 -0.191425 -0.246581 +v 1.53756 1.82412 -0.691353 +vn 0.959155 -0.159576 -0.233575 +v 1.58324 1.75326 -0.316845 +vn 0.963862 -0.247199 -0.099313 +v 1.57827 1.7024 -0.220153 +vn 0.958941 -0.27274 -0.077745 +v 1.57428 1.67593 -0.171685 +vn 0.956979 -0.28193 -0.0686058 +v 1.60683 1.80326 -0.176348 +vn 0.976012 -0.207798 -0.0649666 +v 1.60402 1.77751 -0.127996 +vn 0.972693 -0.225588 -0.0545788 +v 1.59505 1.72305 -0.030954 +vn 0.966774 -0.252996 -0.0366257 +v 1.60735 1.87295 -0.31997 +vn 0.984967 -0.138023 -0.103869 +v 1.60839 1.82781 -0.224505 +vn 0.97906 -0.18882 -0.076086 +v 1.6259 1.92725 -0.179129 +vn 0.994018 -0.081929 -0.0722153 +v 1.62671 1.90489 -0.13153 +vn 0.991625 -0.115477 -0.0578418 +v 1.62392 1.85518 -0.035407 +vn 0.985272 -0.167383 -0.0349656 +v 1.54795 1.63202 -0.311432 +vn 0.944775 -0.31068 -0.104298 +v 1.54007 1.57967 -0.214782 +vn 0.94334 -0.320722 -0.0851302 +v 1.51699 1.54235 -0.310165 +vn 0.933958 -0.339067 -0.11294 +v 1.50726 1.51527 -0.308125 +vn 0.930409 -0.348241 -0.114312 +v 1.53525 1.55354 -0.1666 +vn 0.943067 -0.323689 -0.0764849 +v 1.5005 1.46746 -0.211157 +vn 0.934997 -0.341702 -0.0949813 +v 1.56942 1.64895 -0.123224 +vn 0.954931 -0.290762 -0.0596959 +v 1.57029 1.62952 0.019732 +vn 0.956789 -0.28909 -0.031325 +v 1.55752 1.59423 -0.026578 +vn 0.951842 -0.303588 -0.0427942 +v 1.52998 1.52765 -0.118655 +vn 0.942748 -0.326547 -0.067771 +v 1.55066 1.56686 0.021472 +vn 0.950789 -0.30791 -0.0345136 +v 1.53098 1.50759 0.02247 +vn 0.946394 -0.32078 -0.0379407 +v 1.51831 1.47724 -0.025248 +vn 0.943213 -0.328314 -0.0505946 +v 1.20618 2.4803 -0.689444 +vn 0.55868 0.798488 -0.224261 +v 0.926742 1.31696 1.56641 +vn 0.503727 -0.665769 0.550464 +v 0.881879 1.22497 1.47869 +vn 0.444832 -0.764651 0.466297 +v 0.99817 1.263 1.42043 +vn 0.505206 -0.723597 0.470291 +v 0.956098 1.41659 1.64451 +vn 0.542938 -0.561887 0.6241 +v 0.984037 1.52795 1.70617 +vn 0.571488 -0.443565 0.6904 +v 1.08987 1.55821 1.63164 +vn 0.620034 -0.425786 0.658987 +v 0.829886 1.38017 1.71271 +vn 0.47788 -0.592695 0.648339 +v 0.79336 1.27227 1.62252 +vn 0.421427 -0.71712 0.555103 +v 0.770264 1.29473 1.66728 +vn 0.415192 -0.693195 0.58915 +v 0.717651 1.33333 1.74259 +vn 0.387636 -0.644385 0.659171 +v 0.855574 1.49455 1.78235 +vn 0.506232 -0.464876 0.726374 +v 0.802781 1.40236 1.75105 +vn 0.458225 -0.566733 0.684722 +v 0.784824 1.48371 1.82093 +vn 0.449953 -0.47148 0.758452 +v 0.741903 1.44676 1.82155 +vn 0.416957 -0.51113 0.751593 +v 0.764653 1.18502 1.51462 +vn 0.367685 -0.807935 0.460488 +v 0.637 1.24802 1.6925 +vn 0.313952 -0.743583 0.590355 +v 0.684707 1.19405 1.58812 +vn 0.332005 -0.798597 0.502012 +v 0.643415 1.16895 1.57262 +vn 0.29726 -0.82857 0.474455 +v 0.314842 1.21614 1.76593 +vn 0.127671 -0.776723 0.616766 +v 0.335653 1.13439 1.63885 +vn 0.119396 -0.867826 0.482309 +v 0.378459 1.15595 1.66472 +vn 0.14374 -0.844 0.516723 +v 0.480745 1.22827 1.7357 +vn 0.212304 -0.764836 0.608237 +v 0.495151 1.14743 1.61028 +vn 0.198255 -0.85327 0.482312 +v 0.536906 1.17096 1.63224 +vn 0.229248 -0.827011 0.513321 +v 0.370047 1.08675 1.53155 +vn 0.117915 -0.91173 0.393503 +v 0.453241 1.12561 1.58614 +vn 0.168612 -0.876417 0.45107 +v 0.485486 1.08139 1.47664 +vn 0.164683 -0.910582 0.379105 +v 0.52513 1.10078 1.50349 +vn 0.193094 -0.895203 0.401654 +v 0.604996 1.14416 1.55065 +vn 0.259661 -0.8542 0.450465 +v 0.396801 1.29573 1.83534 +vn 0.17763 -0.681364 0.710064 +v 0.357526 1.32093 1.86741 +vn 0.160235 -0.647702 0.744854 +v 0.527633 1.33339 1.83047 +vn 0.257085 -0.637214 0.726543 +v 0.490387 1.35828 1.86361 +vn 0.236723 -0.604694 0.760465 +v 0.411515 1.41383 1.92507 +vn 0.195537 -0.533118 0.823134 +v 0.563107 1.31034 1.79598 +vn 0.275986 -0.667942 0.691148 +v 0.686566 1.35376 1.77904 +vn 0.368235 -0.618476 0.694183 +v 0.653694 1.37598 1.81439 +vn 0.345853 -0.590129 0.729475 +v 0.583118 1.42629 1.88111 +vn 0.299821 -0.525949 0.795918 +v 0.219169 1.28292 1.856 +vn 0.0899528 -0.695735 0.712644 +v 0.153386 1.20173 1.77227 +vn 0.0621237 -0.794745 0.603755 +v 0.172859 1.30846 1.88484 +vn 0.0749357 -0.660527 0.747054 +v 0.125895 1.28372 1.8662 +vn 0.0540441 -0.695803 0.716196 +v 0.044339 1.23977 1.82466 +vn 0.0174092 -0.745289 0.666514 +v 0.316701 1.34783 1.89778 +vn 0.141353 -0.612921 0.777398 +v 0.370176 1.44448 1.95302 +vn 0.175389 -0.494716 0.851172 +v 0.283145 1.44105 1.96662 +vn 0.130766 -0.498792 0.8568 +v 0.205432 1.426 1.96803 +vn 0.0926925 -0.514822 0.852271 +v 0.127957 1.33824 1.91366 +vn 0.0563708 -0.616538 0.785304 +v 0 1.43712 1.98501 +vn -2.4755e-06 -0.505103 0.863059 +v 0.051993 1.40503 1.96484 +vn 0.0184461 -0.544375 0.838639 +v 0.061601 1.43833 1.98502 +vn 0.0278802 -0.496316 0.867694 +v 0.212743 1.14768 1.68556 +vn 0.0742317 -0.853379 0.515978 +v 0.29281 1.11445 1.611 +vn 0.0966124 -0.888598 0.448397 +v 0.169759 1.1277 1.6563 +vn 0.0552983 -0.875268 0.480467 +v 0.208023 1.07906 1.54965 +vn 0.0588179 -0.919885 0.387753 +v 0 1.22086 1.80331 +vn -4.14515e-19 -0.769159 0.639058 +v 0.04304 1.15036 1.70434 +vn 0.0155334 -0.850706 0.525412 +v 0.126835 1.1094 1.62557 +vn 0.0390734 -0.893671 0.447018 +v 0 1.13523 1.67955 +vn -1.38146e-18 -0.867436 0.497549 +v 0.041952 1.08061 1.56827 +vn 0.0122314 -0.919352 0.393247 +v 1.02126 1.77771 1.78272 +vn 0.59677 -0.187127 0.780288 +v 1.00621 1.64919 1.75224 +vn 0.589461 -0.315248 0.743744 +v 1.11323 1.67397 1.67211 +vn 0.636542 -0.305397 0.7082 +v 1.12889 1.79522 1.69886 +vn 0.644314 -0.180219 0.743223 +v 1.0289 1.90744 1.79724 +vn 0.605731 -0.0572406 0.793608 +v 1.13658 1.92005 1.71152 +vn 0.645785 -0.0524286 0.761717 +v 1.04949 2.04463 1.7799 +vn 0.605379 0.0771867 0.792186 +v 1.15244 2.0453 1.69605 +vn 0.648344 0.0773708 0.757406 +v 0.913568 1.88704 1.87568 +vn 0.533657 -0.0712351 0.842695 +v 0.890728 1.76098 1.87026 +vn 0.521803 -0.191419 0.831312 +v 0.857386 1.7928 1.89711 +vn 0.499894 -0.157621 0.851623 +v 0.751926 1.89066 1.96491 +vn 0.418078 -0.0648301 0.906095 +v 0.792049 1.85912 1.94268 +vn 0.450136 -0.10194 0.887122 +v 0.800801 1.89555 1.94157 +vn 0.460046 -0.0603448 0.885842 +v 0.999373 1.94252 1.82085 +vn 0.58356 -0.01976 0.811829 +v 0.905859 2.03732 1.88047 +vn 0.530143 0.066166 0.845322 +v 0.864732 2.00376 1.90748 +vn 0.504071 0.0390016 0.862781 +v 0.793452 1.9303 1.94685 +vn 0.450828 -0.0209506 0.892365 +v 0.922533 1.73059 1.84197 +vn 0.543475 -0.223509 0.809122 +v 0.876724 1.62455 1.83587 +vn 0.513859 -0.327063 0.793082 +v 0.9066 1.59797 1.80417 +vn 0.533806 -0.358913 0.765658 +v 0.757773 1.73607 1.93877 +vn 0.423761 -0.21372 0.880199 +v 0.84506 1.65283 1.86656 +vn 0.492623 -0.294599 0.818862 +v 0.726787 1.60488 1.91241 +vn 0.406731 -0.33548 0.849719 +v 0.761797 1.57512 1.88227 +vn 0.433625 -0.368456 0.82232 +v 0.826672 1.52141 1.81769 +vn 0.481952 -0.432448 0.762044 +v 0.387899 1.74331 2.0598 +vn 0.186759 -0.193407 0.96318 +v 0.404501 1.58713 2.01276 +vn 0.193137 -0.339875 0.920425 +v 0.442431 1.62502 2.01746 +vn 0.216682 -0.301467 0.928529 +v 0.579077 1.73481 2.00952 +vn 0.297429 -0.203481 0.932808 +v 0.529219 1.73903 2.02564 +vn 0.267784 -0.19833 0.942845 +v 0.527345 1.7006 2.01714 +vn 0.266738 -0.240789 0.933205 +v 0.620079 1.70306 1.9882 +vn 0.325027 -0.242049 0.914204 +v 0.576743 1.57855 1.96288 +vn 0.300187 -0.356168 0.884891 +v 0.690382 1.63641 1.94057 +vn 0.3789 -0.300093 0.875431 +v 0.437132 1.55114 1.99125 +vn 0.212377 -0.379151 0.900633 +v 0.459114 1.44874 1.93461 +vn 0.224038 -0.4933 0.840513 +v 0.506887 1.48474 1.94125 +vn 0.25227 -0.454561 0.854245 +v 0.545565 1.45448 1.91211 +vn 0.276645 -0.491241 0.825924 +v 0.628967 1.46209 1.88562 +vn 0.333196 -0.486111 0.807884 +v 0.6742 1.49891 1.88727 +vn 0.366473 -0.445875 0.816635 +v 0.435722 1.78321 2.05716 +vn 0.213111 -0.158525 0.964082 +v 0.529489 1.8625 2.04402 +vn 0.268943 -0.0911276 0.958835 +v 0.390992 1.90875 2.08009 +vn 0.190702 -0.0531794 0.980206 +v 0.438325 1.94843 2.07169 +vn 0.217283 -0.0189495 0.975925 +v 0.575024 1.90161 2.03357 +vn 0.297854 -0.0567177 0.952925 +v 0.530294 2.02581 2.04727 +vn 0.272527 0.0498719 0.960855 +v 0.630829 1.74022 1.99334 +vn 0.336512 -0.198955 0.920422 +v 0.623968 1.7759 2.00258 +vn 0.3276 -0.158372 0.931449 +v 0.706556 1.85328 1.98155 +vn 0.387037 -0.102098 0.916394 +v 0.619501 1.94016 2.02054 +vn 0.327238 -0.0227481 0.944668 +v 0.708509 1.89429 1.98419 +vn 0.388185 -0.061452 0.919531 +v 0.746911 1.97415 1.96969 +vn 0.417919 0.00876731 0.908442 +v 0.70454 2.01545 1.98711 +vn 0.387491 0.0456277 0.920744 +v 0.342965 1.86855 2.08589 +vn 0.16443 -0.0873425 0.982514 +v 0.245477 1.78714 2.0896 +vn 0.11429 -0.1559 0.981139 +v 0.196351 1.74633 2.08751 +vn 0.0909021 -0.19108 0.977356 +v 0.197856 1.91592 2.108 +vn 0.0934682 -0.0504318 0.994344 +v 0.148528 1.87483 2.10922 +vn 0.0704131 -0.084094 0.993967 +v 0 1.77053 2.10127 +vn -7.64259e-07 -0.170461 0.985364 +v 0.049391 1.75928 2.09885 +vn 0.0241759 -0.180075 0.983356 +v 0.049506 1.80171 2.10571 +vn 0.0246474 -0.144123 0.989253 +v 0.390691 2.07629 2.07723 +vn 0.19499 0.0881252 0.976838 +v 0.343467 2.03732 2.08878 +vn 0.168534 0.0532108 0.984258 +v 0.246892 1.95697 2.10419 +vn 0.117504 -0.0160841 0.992942 +v 0.197569 2.08714 2.10463 +vn 0.0965445 0.0910182 0.991158 +v 0.148596 2.04685 2.11173 +vn 0.0728841 0.0563962 0.995745 +v 0 1.94227 2.11861 +vn 3.89726e-06 -0.0307182 0.999528 +v 0.049689 1.93068 2.11775 +vn 0.0250199 -0.0403551 0.998872 +v 0.049691 1.97399 2.11863 +vn 0.0255038 -0.00468285 0.999664 +v 0.339989 1.70332 2.05968 +vn 0.160737 -0.228309 0.960229 +v 0.250929 1.61814 2.04879 +vn 0.113393 -0.298613 0.947614 +v 0.25904 1.58186 2.03555 +vn 0.121088 -0.341123 0.932187 +v 0.202619 1.57715 2.03994 +vn 0.0910601 -0.345548 0.933973 +v 0.24805 1.54491 2.02235 +vn 0.111832 -0.385632 0.91585 +v 0.327928 1.47683 1.97879 +vn 0.154329 -0.454626 0.87721 +v 0.100569 1.75074 2.09514 +vn 0.0515666 -0.187207 0.980966 +v 0.147179 1.70602 2.08288 +vn 0.0689124 -0.2256 0.97178 +v 0.048933 1.63937 2.07011 +vn 0.0228821 -0.28877 0.957125 +v 0.148924 1.58206 2.04653 +vn 0.0679995 -0.339783 0.938042 +v 0.14792 1.54449 2.03192 +vn 0.0670417 -0.384801 0.920562 +v 0.048803 1.59761 2.05663 +vn 0.022572 -0.325954 0.945116 +v 0.049626 1.47482 2.00481 +vn 0.0248453 -0.451051 0.892152 +v 0 1.48468 2.0104 +vn -2.21039e-18 -0.44116 0.897429 +v 1.00145 2.31128 1.74721 +vn 0.577649 0.314568 0.753239 +v 1.01821 2.18181 1.77876 +vn 0.594151 0.204571 0.777905 +v 1.10663 2.29501 1.66825 +vn 0.620644 0.308814 0.720718 +v 1.12495 2.17015 1.69606 +vn 0.632542 0.200007 0.748257 +v 0.978825 2.43969 1.70117 +vn 0.56618 0.41226 0.71378 +v 0.90313 2.36001 1.79785 +vn 0.528571 0.344858 0.775684 +v 0.873797 2.33114 1.82938 +vn 0.5096 0.320497 0.798492 +v 0.854841 2.46758 1.77622 +vn 0.505228 0.425421 0.750841 +v 0.824433 2.44 1.81068 +vn 0.483823 0.399894 0.77846 +v 0.760115 2.38329 1.87429 +vn 0.439003 0.352783 0.82633 +v 0.951581 2.56143 1.6426 +vn 0.552227 0.501082 0.666305 +v 0.831363 2.59514 1.71016 +vn 0.49724 0.516044 0.697461 +v 0.802349 2.57098 1.74722 +vn 0.477995 0.493046 0.726929 +v 0.741553 2.52143 1.81507 +vn 0.435098 0.451108 0.779225 +v 0.919909 2.22199 1.83724 +vn 0.535875 0.236041 0.810631 +v 0.991639 2.14687 1.80687 +vn 0.576953 0.17237 0.798382 +v 0.888617 2.18996 1.86595 +vn 0.516509 0.206386 0.831038 +v 0.936534 2.0781 1.85661 +vn 0.545375 0.10478 0.831617 +v 0.842549 2.30115 1.86011 +vn 0.489966 0.295229 0.820227 +v 0.725254 2.35326 1.90427 +vn 0.412994 0.328225 0.849532 +v 0.732125 2.27974 1.92671 +vn 0.414529 0.27237 0.868321 +v 0.774492 2.23793 1.91812 +vn 0.443298 0.241354 0.86327 +v 0.855426 2.15688 1.89354 +vn 0.496356 0.176587 0.849969 +v 0.737774 2.20482 1.94483 +vn 0.415929 0.212599 0.884197 +v 0.74204 2.12884 1.95831 +vn 0.417013 0.148539 0.896681 +v 0.783454 2.08787 1.94428 +vn 0.446879 0.113391 0.887379 +v 0.380023 2.39779 2.00548 +vn 0.201735 0.337343 0.919512 +v 0.386827 2.24031 2.05135 +vn 0.198532 0.222498 0.954505 +v 0.431803 2.276 2.03236 +vn 0.224713 0.252325 0.941189 +v 0.518132 2.34415 1.98831 +vn 0.277737 0.308031 0.909934 +v 0.559283 2.37657 1.96347 +vn 0.304571 0.334118 0.891965 +v 0.569109 2.22268 2.00716 +vn 0.303231 0.218228 0.927592 +v 0.610483 2.25685 1.98423 +vn 0.330583 0.24767 0.9107 +v 0.688641 2.32216 1.93266 +vn 0.385756 0.302564 0.871578 +v 0.436994 2.11433 2.06318 +vn 0.221529 0.122697 0.967404 +v 0.526325 2.18753 2.02803 +vn 0.275666 0.187887 0.942712 +v 0.574624 2.06336 2.03135 +vn 0.301104 0.084425 0.949847 +v 0.617648 2.10004 2.01302 +vn 0.329523 0.118497 0.936682 +v 0.699328 2.17079 1.96963 +vn 0.387255 0.182688 0.903692 +v 0.423525 2.43081 1.98253 +vn 0.227983 0.362875 0.903519 +v 0.506693 2.49318 1.9314 +vn 0.280819 0.41127 0.867178 +v 0.371028 2.54644 1.9434 +vn 0.206757 0.43469 0.876525 +v 0.412992 2.5764 1.91734 +vn 0.23367 0.457236 0.858099 +v 0.546195 2.5225 1.90338 +vn 0.307352 0.434344 0.846688 +v 0.492992 2.63218 1.86059 +vn 0.2873 0.500982 0.816379 +v 0.598965 2.40787 1.93686 +vn 0.331247 0.359459 0.87239 +v 0.717314 2.42506 1.87779 +vn 0.411556 0.380514 0.828149 +v 0.673626 2.46702 1.8788 +vn 0.38445 0.407166 0.828501 +v 0.584203 2.55055 1.87384 +vn 0.333703 0.456825 0.824593 +v 0.708465 2.49483 1.84758 +vn 0.410398 0.429677 0.804333 +v 0.698861 2.56223 1.81395 +vn 0.4097 0.47609 0.778129 +v 0.655495 2.60278 1.81063 +vn 0.385108 0.499703 0.77588 +v 0.327848 2.51514 1.96781 +vn 0.180117 0.411948 0.893228 +v 0.238193 2.44853 2.01143 +vn 0.127475 0.364126 0.922585 +v 0.191909 2.41336 2.03046 +vn 0.101686 0.3388 0.935347 +v 0.187273 2.5634 1.96746 +vn 0.105822 0.43312 0.895103 +v 0.141446 2.53003 1.98779 +vn 0.0795136 0.411488 0.90794 +v 0.047686 2.46879 2.01938 +vn 0.0272843 0.37159 0.927996 +v 0.360597 2.68401 1.86895 +vn 0.216043 0.518035 0.827626 +v 0.318926 2.65605 1.89594 +vn 0.188165 0.497376 0.846883 +v 0.232187 2.59569 1.94527 +vn 0.132905 0.454959 0.880539 +v 0.181956 2.70199 1.89298 +vn 0.113119 0.511882 0.851575 +v 0.137529 2.67178 1.91576 +vn 0.084791 0.49297 0.865905 +v 0.046436 2.61569 1.95208 +vn 0.0287781 0.458908 0.888018 +v 0.335356 2.36356 2.02655 +vn 0.175621 0.311288 0.933947 +v 0.242966 2.29156 2.06273 +vn 0.124134 0.255418 0.958829 +v 0.340784 2.20355 2.06818 +vn 0.172386 0.191913 0.966154 +v 0.195472 2.25392 2.07762 +vn 0.0992786 0.225377 0.9692 +v 0.246019 2.12688 2.09493 +vn 0.121086 0.12599 0.984614 +v 0.144794 2.37728 2.04741 +vn 0.0764799 0.313405 0.946535 +v 0 2.43949 2.03148 +vn 1.79568e-18 0.351386 0.936231 +v 0.048497 2.35275 2.06045 +vn 0.0266331 0.295218 0.955059 +v 0.048723 2.30779 2.07372 +vn 0.0277456 0.267388 0.963189 +v 0.099824 2.26099 2.08347 +vn 0.0564112 0.228798 0.971838 +v 0.147275 2.21555 2.09019 +vn 0.0752784 0.195204 0.977869 +v 0.048914 2.27025 2.08357 +vn 0.0269947 0.235413 0.97152 +v 0.049407 2.14547 2.1073 +vn 0.0265906 0.137919 0.990086 +v 0.893145 2.77645 1.48756 +vn 0.529189 0.657708 0.536077 +v 0.921699 2.67427 1.57207 +vn 0.538462 0.584034 0.607423 +v 0.956555 2.82817 1.34335 +vn 0.546783 0.716768 0.432749 +v 0.854341 2.87537 1.39275 +vn 0.537765 0.706775 0.459649 +v 0.778004 2.81989 1.54238 +vn 0.493941 0.654494 0.572415 +v 0.750429 2.91155 1.45249 +vn 0.504107 0.697815 0.508852 +v 0.674954 2.88265 1.55504 +vn 0.4583 0.664923 0.589778 +v 0.75821 2.99727 1.31096 +vn 0.57201 0.711722 0.407746 +v 0.726302 2.99653 1.35353 +vn 0.555774 0.697358 0.452556 +v 0.664654 2.98888 1.43291 +vn 0.522197 0.678917 0.516122 +v 0.803784 2.71074 1.63477 +vn 0.487086 0.593096 0.641081 +v 0.639776 2.86839 1.59648 +vn 0.430699 0.652848 0.623127 +v 0.656306 2.80589 1.64829 +vn 0.419769 0.629323 0.654023 +v 0.697788 2.76743 1.65789 +vn 0.437338 0.614851 0.656273 +v 0.667482 2.74794 1.69468 +vn 0.413478 0.598908 0.685817 +v 0.678075 2.68875 1.7375 +vn 0.410857 0.561619 0.718179 +v 0.720098 2.64979 1.74271 +vn 0.434538 0.539536 0.721164 +v 0.338465 2.92546 1.6954 +vn 0.257432 0.626937 0.735308 +v 0.349529 2.80933 1.78551 +vn 0.232316 0.58472 0.777259 +v 0.388552 2.8328 1.75472 +vn 0.262775 0.601385 0.75451 +v 0.482847 2.88773 1.66873 +vn 0.334548 0.635721 0.695656 +v 0.514587 2.7817 1.74591 +vn 0.326952 0.595193 0.734062 +v 0.549478 2.80313 1.71146 +vn 0.353597 0.611747 0.707626 +v 0.609813 2.84606 1.63857 +vn 0.404588 0.639667 0.653556 +v 0.401042 2.71046 1.84044 +vn 0.244302 0.538676 0.806316 +v 0.478099 2.75922 1.77891 +vn 0.299861 0.577709 0.759168 +v 0.530894 2.65799 1.83003 +vn 0.313807 0.522243 0.792961 +v 0.567314 2.68239 1.79811 +vn 0.340016 0.54292 0.767872 +v 0.635629 2.7273 1.73038 +vn 0.389725 0.581584 0.714055 +v 0.376242 2.94706 1.66217 +vn 0.290078 0.636601 0.714558 +v 0.443887 2.98501 1.59653 +vn 0.344852 0.648316 0.678796 +v 0.310345 3.02642 1.61786 +vn 0.267899 0.63415 0.725316 +v 0.478474 3.00441 1.55908 +vn 0.380142 0.650259 0.657765 +v 0.437257 3.0431 1.54485 +vn 0.368692 0.640556 0.673612 +v 0.356576 3.10856 1.5258 +vn 0.332309 0.629905 0.701991 +v 0.601298 2.90453 1.585 +vn 0.423738 0.656224 0.624353 +v 0.524823 2.96843 1.56795 +vn 0.394192 0.658381 0.641207 +v 0.63139 2.98521 1.46938 +vn 0.492068 0.67171 0.553782 +v 0.593755 3.01599 1.46562 +vn 0.488766 0.664376 0.565431 +v 0.513009 3.08535 1.45407 +vn 0.461303 0.640953 0.613497 +v 0.211075 2.96874 1.6966 +vn 0.176934 0.622588 0.762285 +v 0.170505 2.94454 1.72441 +vn 0.140414 0.613481 0.777126 +v 0.164451 3.05496 1.63588 +vn 0.155648 0.62875 0.761871 +v 0.124462 3.03099 1.66268 +vn 0.114948 0.626753 0.770693 +v 0 2.96774 1.72202 +vn -4.69701e-18 0.61944 0.785044 +v 0.203285 3.07828 1.60742 +vn 0.196155 0.630302 0.75116 +v 0.140866 3.15197 1.56087 +vn 0.144905 0.624063 0.76782 +v 0 3.0811 1.63136 +vn 1.10523e-18 0.628491 0.777817 +v 0.29947 2.90281 1.72692 +vn 0.2242 0.61586 0.755282 +v 0.218346 2.85419 1.78469 +vn 0.157471 0.588704 0.792862 +v 0.309269 2.78458 1.81475 +vn 0.202306 0.56787 0.797869 +v 0.176306 2.82811 1.81103 +vn 0.124879 0.573618 0.809548 +v 0.225434 2.73096 1.86847 +vn 0.142505 0.531257 0.83514 +v 0.128948 2.91947 1.75041 +vn 0.104967 0.604144 0.789932 +v 0.043607 2.87316 1.7923 +vn 0.0351601 0.585125 0.81018 +v 0.133319 2.80095 1.8356 +vn 0.0934855 0.558762 0.824042 +v 0 2.85064 1.80931 +vn -2.42966e-06 0.574565 0.818459 +v 0.045057 2.75044 1.87513 +vn 0.0314636 0.531034 0.846766 +v 0.530334 4.17024 -0.361303 +vn 0.545818 -0.435934 -0.715573 +v 0.582689 4.18241 -0.325802 +vn 0.601282 -0.420618 -0.679368 +v 0.56073 4.15023 -0.323972 +vn 0.575416 -0.458019 -0.67758 +v 0.636013 4.19635 -0.285194 +vn 0.633794 -0.408499 -0.656837 +v 0.683465 4.21017 -0.244916 +vn 0.68404 -0.388528 -0.617361 +v 0.59414 4.13318 -0.281851 +vn 0.601639 -0.474843 -0.642304 +v 0.636972 4.11757 -0.227351 +vn 0.632639 -0.487093 -0.602087 +v 0.473665 4.05396 -0.321367 +vn 0.502154 -0.540621 -0.67496 +v 0.527459 4.06502 -0.287812 +vn 0.545569 -0.531999 -0.647559 +v 0.519863 4.0383 -0.271493 +vn 0.539739 -0.554036 -0.633819 +v 0.579329 4.07709 -0.251321 +vn 0.586294 -0.522531 -0.619048 +v 0.628967 4.08985 -0.212679 +vn 0.624642 -0.511565 -0.59002 +v 0.561942 4.02311 -0.219345 +vn 0.57201 -0.56695 -0.592767 +v 0.599659 4.008 -0.165594 +vn 0.599601 -0.579653 -0.551798 +v 0.731027 4.22567 -0.199777 +vn 0.714094 -0.37269 -0.592598 +v 0.772763 4.24085 -0.155564 +vn 0.761107 -0.346896 -0.548068 +v 0.754301 4.20692 -0.157874 +vn 0.7355 -0.392092 -0.552544 +v 0.813724 4.2576 -0.106769 +vn 0.78934 -0.326199 -0.52013 +v 0.848649 4.27372 -0.059837 +vn 0.833261 -0.293107 -0.46879 +v 0.778916 4.191 -0.111198 +vn 0.754172 -0.408324 -0.514292 +v 0.809602 4.17654 -0.051508 +vn 0.777139 -0.417864 -0.470579 +v 0.676167 4.10343 -0.17164 +vn 0.661686 -0.498619 -0.559956 +v 0.720716 4.11754 -0.128988 +vn 0.697198 -0.484118 -0.528719 +v 0.71128 4.08937 -0.114552 +vn 0.687481 -0.509627 -0.517349 +v 0.76232 4.13228 -0.084479 +vn 0.731823 -0.466966 -0.496365 +v 0.800928 4.14739 -0.038901 +vn 0.765464 -0.448116 -0.461798 +v 0.741686 4.07503 -0.056818 +vn 0.709481 -0.519592 -0.47609 +v 0.767358 4.06006 0.000861 +vn 0.728338 -0.529293 -0.43517 +v 0.416287 4.14821 -0.425558 +vn 0.447162 -0.456762 -0.769035 +v 0.472445 4.15832 -0.396054 +vn 0.508543 -0.44523 -0.73699 +v 0.371661 4.0889 -0.412784 +vn 0.414471 -0.514082 -0.750955 +v 0.424082 4.07038 -0.368351 +vn 0.459812 -0.527174 -0.714605 +v 0.29551 4.13084 -0.476248 +vn 0.33306 -0.472182 -0.816158 +v 0.354666 4.13859 -0.45358 +vn 0.404349 -0.463763 -0.788306 +v 0.331363 4.1084 -0.446672 +vn 0.376037 -0.496737 -0.782207 +v 0.168329 4.11899 -0.510849 +vn 0.190174 -0.48295 -0.854748 +v 0.231238 4.12399 -0.496214 +vn 0.278959 -0.477425 -0.833215 +v 0.124165 4.0628 -0.486074 +vn 0.154911 -0.527522 -0.835298 +v 0.18554 4.04059 -0.457094 +vn 0.226429 -0.548699 -0.804773 +v 0 4.11337 -0.527263 +vn -2.14442e-06 -0.486555 -0.87365 +v 0.092658 4.11517 -0.521978 +vn 0.113826 -0.485671 -0.866699 +v 0.062538 4.08204 -0.506402 +vn 0.0750016 -0.500421 -0.862527 +v 0.360892 4.03477 -0.379587 +vn 0.405098 -0.554345 -0.727047 +v 0.417987 4.04377 -0.352207 +vn 0.455311 -0.547655 -0.701973 +v 0.349181 3.98325 -0.344693 +vn 0.39802 -0.59381 -0.699264 +v 0.397047 3.9662 -0.299975 +vn 0.441847 -0.608179 -0.659461 +v 0.242858 4.02023 -0.423836 +vn 0.290617 -0.56464 -0.772479 +v 0.302329 4.02681 -0.403702 +vn 0.350231 -0.559283 -0.751359 +v 0.297634 4.00113 -0.38618 +vn 0.347713 -0.579309 -0.737222 +v 0.121448 4.00907 -0.450608 +vn 0.157437 -0.570558 -0.806026 +v 0.182301 4.01467 -0.43999 +vn 0.22621 -0.567492 -0.791696 +v 0.117041 3.95899 -0.414061 +vn 0.155609 -0.609671 -0.777231 +v 0.172374 3.93979 -0.384779 +vn 0.2217 -0.624668 -0.748758 +v 0 3.99425 -0.452341 +vn -1.10613e-18 -0.581499 -0.813547 +v 0.060498 4.00162 -0.454563 +vn 0.0815281 -0.576336 -0.813136 +v 0.059429 3.97655 -0.436323 +vn 0.0814132 -0.596741 -0.798293 +v 0.33636 4.16346 -0.47652 +vn 0.381096 -0.436509 -0.815001 +v 0.382024 4.19699 -0.471025 +vn 0.424546 -0.404288 -0.810131 +v 0.4413 4.23632 -0.456793 +vn 0.476848 -0.371308 -0.79671 +v 0.440567 4.26501 -0.470163 +vn 0.476715 -0.345901 -0.808143 +v 0.38108 4.25532 -0.498507 +vn 0.422031 -0.355804 -0.833842 +v 0.319881 4.24676 -0.52343 +vn 0.362842 -0.366357 -0.856813 +v 0.257567 4.23969 -0.544179 +vn 0.299889 -0.373472 -0.87783 +v 0.319209 4.27618 -0.535692 +vn 0.363059 -0.340112 -0.867475 +v 0.378904 4.31437 -0.522666 +vn 0.422031 -0.302322 -0.854688 +v 0.436064 4.35398 -0.505534 +vn 0.477163 -0.261679 -0.838952 +v 0.064269 4.14696 -0.542519 +vn 0.0748711 -0.471498 -0.878683 +v 0.128863 4.17234 -0.54684 +vn 0.156443 -0.437789 -0.885362 +v 0.194739 4.20518 -0.547949 +vn 0.231295 -0.405396 -0.884396 +v 0.193996 4.23415 -0.561059 +vn 0.231939 -0.381541 -0.89478 +v 0.129784 4.23203 -0.574084 +vn 0.160014 -0.385966 -0.90853 +v 0.06496 4.23513 -0.584186 +vn 0.0822082 -0.38478 -0.91934 +v 0 4.24201 -0.589889 +vn -5.53131e-19 -0.380062 -0.924961 +v 0.06473 4.26492 -0.596096 +vn 0.0824023 -0.358816 -0.929764 +v 0.128743 4.29178 -0.597664 +vn 0.159836 -0.334217 -0.928844 +v 0.191606 4.3243 -0.595539 +vn 0.23169 -0.303475 -0.924242 +v 0.608005 4.24302 -0.337435 +vn 0.621854 -0.35634 -0.697366 +v 0.567662 4.20613 -0.352569 +vn 0.585566 -0.394663 -0.708064 +v 0.607315 4.30103 -0.365119 +vn 0.623148 -0.303586 -0.720778 +v 0.553967 4.28795 -0.40322 +vn 0.576964 -0.320048 -0.751453 +v 0.705896 4.3297 -0.28152 +vn 0.708792 -0.267097 -0.652895 +v 0.65878 4.28643 -0.311197 +vn 0.665268 -0.315252 -0.676783 +v 0.658021 4.31489 -0.324657 +vn 0.666712 -0.287398 -0.687675 +v 0.793115 4.30343 -0.16221 +vn 0.783455 -0.275695 -0.556947 +v 0.761614 4.26409 -0.184268 +vn 0.750449 -0.322021 -0.577173 +v 0.791993 4.36132 -0.189392 +vn 0.787491 -0.221363 -0.575201 +v 0.75064 4.34514 -0.236534 +vn 0.748868 -0.246834 -0.615036 +v 0.863578 4.39518 -0.090799 +vn 0.859529 -0.164343 -0.483943 +v 0.830845 4.34964 -0.127707 +vn 0.822125 -0.224294 -0.523262 +v 0.829762 4.37798 -0.14091 +vn 0.82438 -0.195685 -0.531136 +v 0.604068 4.35923 -0.389787 +vn 0.62458 -0.244961 -0.741549 +v 0.552907 4.31703 -0.41568 +vn 0.577969 -0.291102 -0.762372 +v 0.597385 4.4187 -0.412331 +vn 0.623638 -0.18411 -0.759723 +v 0.544991 4.40626 -0.449974 +vn 0.577501 -0.201724 -0.791075 +v 0.694371 4.44608 -0.329434 +vn 0.70931 -0.14416 -0.689998 +v 0.6514 4.4023 -0.360937 +vn 0.668416 -0.195893 -0.717528 +v 0.647405 4.43195 -0.372151 +vn 0.667461 -0.164693 -0.726203 +v 0.787491 4.41862 -0.214255 +vn 0.789402 -0.159771 -0.59272 +v 0.749054 4.37385 -0.249052 +vn 0.750414 -0.21562 -0.624809 +v 0.77891 4.47638 -0.237838 +vn 0.78714 -0.0971863 -0.609069 +v 0.738431 4.46088 -0.284645 +vn 0.749301 -0.121453 -0.650998 +v 0.849009 4.50897 -0.13953 +vn 0.857199 -0.0421747 -0.513256 +v 0.820939 4.46374 -0.17763 +vn 0.825184 -0.101541 -0.555662 +v 0.816013 4.49242 -0.189433 +vn 0.823281 -0.0703232 -0.563262 +v 0.525286 3.58836 1.1385 +vn 0.641912 -0.0363546 0.765916 +v 0.763444 3.8499 0.987617 +vn 0.793472 -0.421089 0.439416 +v 0.67515 3.82319 1.09216 +vn 0.684448 -0.432123 0.587197 +v 0.71886 3.73625 0.967514 +vn 0.80568 -0.358832 0.471295 +v 0.642764 3.70989 1.05767 +vn 0.721113 -0.320123 0.614424 +v 0.694762 3.61832 0.933039 +vn 0.864435 -0.234619 0.444642 +v 0.618985 3.59172 1.04206 +vn 0.782428 -0.127407 0.609569 +v 0.775393 3.74196 0.844358 +vn 0.889485 -0.365064 0.274854 +v 0.839053 3.90343 0.87494 +vn 0.866085 -0.415225 0.278361 +v 0.799673 3.77782 0.811417 +vn 0.89512 -0.390813 0.214537 +v 0.841838 3.85085 0.759138 +vn 0.905185 -0.406381 0.124476 +v 0.734766 3.597 0.808408 +vn 0.944436 -0.251733 0.211357 +v 0.796995 3.73621 0.702351 +vn 0.925706 -0.376894 0.0319176 +v 0.804847 3.97127 1.03445 +vn 0.788348 -0.43915 0.430876 +v 0.879836 4.02957 0.934252 +vn 0.862853 -0.400572 0.308263 +v 0.843873 4.0918 1.07821 +vn 0.818702 -0.365178 0.443139 +v 0.906181 4.01043 0.80478 +vn 0.903951 -0.391935 0.171054 +v 0.930152 4.05732 0.780011 +vn 0.915271 -0.379338 0.135579 +v 0.937048 4.09364 0.825445 +vn 0.912868 -0.361452 0.1898 +v 0.927812 4.16128 0.951071 +vn 0.900949 -0.301455 0.312115 +v 0.814953 3.85911 0.439315 +vn 0.846232 -0.47342 -0.244467 +v 0.857574 3.88317 0.590657 +vn 0.897395 -0.430837 -0.0951933 +v 0.782661 3.72919 0.568274 +vn 0.904074 -0.389925 -0.174951 +v 0.735983 3.71633 0.432268 +vn 0.847813 -0.410008 -0.336313 +v 0.725706 3.58967 0.545647 +vn 0.933094 -0.265605 -0.242466 +v 0.862583 3.89038 0.733224 +vn 0.908107 -0.410186 0.0841985 +v 0.746694 3.5946 0.678207 +vn 0.961732 -0.272802 -0.0255093 +v 0.741355 3.83007 0.292824 +vn 0.770885 -0.524365 -0.361633 +v 0.660471 3.70038 0.296663 +vn 0.777291 -0.43306 -0.456375 +v 0.639043 3.80313 0.147183 +vn 0.684793 -0.571218 -0.452513 +v 0.674924 3.58311 0.413345 +vn 0.878832 -0.240391 -0.412149 +v 0.598919 3.57615 0.283384 +vn 0.816369 -0.20511 -0.539881 +v 0.559487 3.68377 0.163642 +vn 0.703686 -0.451738 -0.548415 +v 0.826499 3.94225 0.316389 +vn 0.807384 -0.521562 -0.275869 +v 0.8968 4.00713 0.437585 +vn 0.871845 -0.459636 -0.169177 +v 0.901422 4.0333 0.391905 +vn 0.866319 -0.463064 -0.187252 +v 0.825678 3.96613 0.269449 +vn 0.795666 -0.532046 -0.289558 +v 0.903467 4.08199 0.291497 +vn 0.853009 -0.468647 -0.229665 +v 0.739457 3.85722 0.248469 +vn 0.752275 -0.548668 -0.364754 +v 0.729702 3.90551 0.154957 +vn 0.713204 -0.589909 -0.378613 +v 0.777526 3.94514 0.188442 +vn 0.751768 -0.564827 -0.340317 +v 0.823702 3.99088 0.219096 +vn 0.780896 -0.546122 -0.303235 +v 0.748336 3.934 0.146044 +vn 0.723096 -0.582658 -0.371001 +v 0.814914 4.00836 0.167733 +vn 0.771694 -0.542282 -0.332293 +v 0.803739 4.02698 0.113654 +vn 0.758314 -0.542611 -0.361295 +v 0.88969 3.97872 0.480113 +vn 0.87741 -0.455222 -0.15141 +v 0.932565 4.04079 0.606439 +vn 0.91533 -0.40143 -0.0320277 +v 0.917884 4.00583 0.642869 +vn 0.913789 -0.406127 -0.00709569 +v 0.882468 3.92994 0.70572 +vn 0.91029 -0.411002 0.0494849 +v 0.964127 4.15335 0.427003 +vn 0.924021 -0.361148 -0.125525 +v 0.960362 4.12896 0.4753 +vn 0.920416 -0.376796 -0.104205 +v 0.944698 4.07303 0.566255 +vn 0.916762 -0.395503 -0.0558951 +v 0.993245 4.1998 0.61222 +vn 0.957841 -0.287219 -0.00680463 +v 0.984243 4.1734 0.660476 +vn 0.946689 -0.320307 0.0344078 +v 0.952497 4.1024 0.746693 +vn 0.929403 -0.3563 0.0962295 +v 0.92481 4.85995 0.225202 +vn 0.943776 0.279922 -0.175868 +v 0.930061 4.90173 0.366756 +vn 0.955773 0.285264 -0.071576 +v 0.944018 4.83182 0.307205 +vn 0.961809 0.253362 -0.103595 +v 0.949167 4.79435 0.271623 +vn 0.964629 0.230227 -0.1284 +v 0.95553 4.77665 0.289859 +vn 0.968582 0.221429 -0.113213 +v 0.957908 4.78856 0.341539 +vn 0.970268 0.228018 -0.0811597 +v 0.95719 4.80597 0.394019 +vn 0.970777 0.235398 -0.0466891 +v 0.954857 4.8221 0.445802 +vn 0.969163 0.245894 -0.0160805 +v 0.963304 4.78384 0.412612 +vn 0.972489 0.229861 -0.0378016 +v 0.971002 4.743 0.379567 +vn 0.974403 0.216429 -0.0608117 +v 0.977737 4.69955 0.345125 +vn 0.976808 0.195715 -0.0868422 +v 0.950484 4.84008 0.493505 +vn 0.968391 0.249139 0.0121706 +v 0.972796 4.74393 0.553109 +vn 0.968794 0.245368 0.0351154 +v 0.919882 4.76973 0.099892 +vn 0.938796 0.220284 -0.264832 +v 0.918562 4.81012 0.132457 +vn 0.938988 0.245682 -0.240711 +v 0.937923 4.71981 0.126957 +vn 0.951895 0.188273 -0.241763 +v 0.946033 4.74232 0.182604 +vn 0.959562 0.202875 -0.195147 +v 0.911589 4.68632 0.020464 +vn 0.928393 0.157892 -0.336388 +v 0.91723 4.72865 0.06057 +vn 0.934926 0.192029 -0.298393 +v 0.92634 4.70298 0.073492 +vn 0.941564 0.175 -0.287806 +v 0.852674 4.70835 -0.105745 +vn 0.877211 0.161727 -0.452046 +v 0.863505 4.7498 -0.06606 +vn 0.889116 0.200347 -0.411502 +v 0.872402 4.65387 -0.083711 +vn 0.891656 0.117348 -0.437239 +v 0.893764 4.66997 -0.032008 +vn 0.911789 0.139347 -0.386295 +v 0.818975 4.6227 -0.184506 +vn 0.838583 0.0689091 -0.540398 +v 0.838022 4.66594 -0.14537 +vn 0.860423 0.118263 -0.495666 +v 0.84764 4.63812 -0.134654 +vn 0.867298 0.0944577 -0.488746 +v 0.953817 4.66857 0.154248 +vn 0.962279 0.156599 -0.222478 +v 0.954651 4.71199 0.19506 +vn 0.964069 0.187817 -0.187873 +v 0.967488 4.61564 0.181656 +vn 0.97057 0.122649 -0.207247 +v 0.975687 4.63996 0.24379 +vn 0.97584 0.150608 -0.158283 +v 0.941999 4.57896 0.070618 +vn 0.94992 0.0725401 -0.303957 +v 0.949812 4.62417 0.112569 +vn 0.95795 0.118371 -0.261382 +v 0.95635 4.59731 0.125431 +vn 0.962266 0.0988944 -0.253504 +v 0.889365 4.59881 -0.060397 +vn 0.90384 0.0693997 -0.422206 +v 0.902509 4.64298 -0.020007 +vn 0.918206 0.11728 -0.378343 +v 0.903042 4.54326 -0.036338 +vn 0.912949 0.016819 -0.407726 +v 0.924416 4.56097 0.016719 +vn 0.933692 0.0458194 -0.355134 +v 0.871731 4.55407 -0.100357 +vn 0.883552 0.0162375 -0.468051 +v 0.878116 4.52594 -0.088473 +vn 0.88766 -0.0122026 -0.460338 +v 0.909331 4.83823 0.126322 +vn 0.933027 0.264947 -0.243442 +v 0.899755 4.81871 0.074096 +vn 0.923798 0.252391 -0.287917 +v 0.886787 4.80437 0.023623 +vn 0.911851 0.244151 -0.330026 +v 0.870978 4.79011 -0.026581 +vn 0.897864 0.232497 -0.37388 +v 0.875635 4.82916 0.012243 +vn 0.903665 0.260361 -0.340004 +v 0.877836 4.86686 0.05023 +vn 0.906937 0.285321 -0.30993 +v 0.876595 4.90157 0.081163 +vn 0.90187 0.320654 -0.289501 +v 0.876486 4.9367 0.122888 +vn 0.907817 0.334503 -0.252935 +v 0.840014 4.90249 -0.018447 +vn 0.876979 0.311612 -0.365795 +v 0.823165 4.89069 -0.065453 +vn 0.862015 0.302198 -0.406947 +v 0.828445 4.92454 -0.026442 +vn 0.863167 0.337921 -0.375169 +v 0.827625 5.02663 0.081942 +vn 0.873048 0.388654 -0.294509 +v 0.852387 4.77607 -0.076583 +vn 0.880929 0.219429 -0.419304 +v 0.830641 4.7622 -0.125938 +vn 0.861171 0.20312 -0.465969 +v 0.80577 4.74863 -0.174711 +vn 0.837603 0.185564 -0.513798 +v 0.777415 4.73534 -0.222405 +vn 0.810582 0.16523 -0.561833 +v 0.793994 4.77585 -0.183248 +vn 0.82922 0.206587 -0.519342 +v 0.806833 4.81528 -0.143786 +vn 0.843778 0.242558 -0.478753 +v 0.816413 4.8536 -0.104469 +vn 0.854329 0.274345 -0.441426 +v 0.803816 4.87907 -0.112412 +vn 0.844966 0.292093 -0.448012 +v 0.781713 4.86757 -0.158732 +vn 0.825264 0.28078 -0.490001 +v 0.756803 4.85637 -0.204602 +vn 0.802318 0.268344 -0.533177 +v 0.728885 4.84539 -0.249419 +vn 0.776905 0.253593 -0.576289 +v 0.743945 4.88272 -0.20995 +vn 0.792867 0.288332 -0.536868 +v 0.755812 4.91894 -0.17027 +vn 0.805366 0.319702 -0.499176 +v 0.765814 4.95205 -0.130398 +vn 0.810352 0.35768 -0.464107 +v 0.918632 4.84623 0.17501 +vn 0.940343 0.272011 -0.204366 +v 0.643017 3.35552 0.340025 +vn 0.888459 0.269374 -0.371589 +v 0.722208 3.22946 0.41628 +vn 0.838512 0.500656 -0.215038 +v 0.738639 3.21596 0.452204 +vn 0.846557 0.505984 -0.16529 +v 0.720931 3.34941 0.639026 +vn 0.98613 0.148287 -0.0745527 +v 0.750325 3.23156 0.588737 +vn 0.893334 0.435658 -0.110255 +v 0.569441 3.35574 0.191355 +vn 0.799332 0.391219 -0.456088 +v 0.597704 3.25657 0.126262 +vn 0.737648 0.569131 -0.363269 +v 0.64557 3.16024 0.039092 +vn 0.658212 0.691519 -0.297589 +v 0.580929 3.20402 -0.000285 +vn 0.653374 0.675605 -0.341556 +v 0.568706 3.46166 0.246766 +vn 0.833874 0.120989 -0.53853 +v 0.643996 3.46303 0.38114 +vn 0.905241 0.0173194 -0.424544 +v 0.502287 3.57008 0.157823 +vn 0.752751 -0.16462 -0.63739 +v 0.69633 3.4655 0.519875 +vn 0.961786 -0.0622673 -0.266629 +v 0.720929 3.46837 0.660291 +vn 0.993109 -0.0998506 -0.0613515 +v 0.681917 3.35762 0.941203 +vn 0.932603 0.185118 0.309812 +v 0.622048 3.35595 1.07758 +vn 0.832048 0.284921 0.475937 +v 0.651879 3.24212 1.11554 +vn 0.800154 0.439914 0.407712 +v 0.753426 3.15008 0.99991 +vn 0.784561 0.572783 0.237452 +v 0.713198 3.37708 0.796275 +vn 0.987029 0.0811653 0.138513 +v 0.751411 3.23397 0.761339 +vn 0.914645 0.400649 0.0538966 +v 0.7547 3.22003 0.80162 +vn 0.900016 0.426686 0.0889419 +v 0.680234 3.48108 0.919309 +vn 0.926691 -0.0372276 0.373975 +v 0.717655 3.48416 0.783083 +vn 0.98299 -0.116342 0.142107 +v 0.611391 3.4731 1.05019 +vn 0.826947 0.0974325 0.553774 +v 0.756653 2.6518 -1.73058 +vn 0.85984 0.370666 -0.351115 +v 0.777191 2.64745 -1.68344 +vn 0.862033 0.387122 -0.327164 +v 0.737948 2.7611 -1.64211 +vn 0.865984 0.424241 -0.264747 +v 0.81997 2.64864 -1.55618 +vn 0.861335 0.434085 -0.263953 +v 0.842915 2.53596 -1.64135 +vn 0.859399 0.378086 -0.344215 +v 0.897585 2.53998 -1.48329 +vn 0.857667 0.436298 -0.272123 +v 0.766778 2.77128 -1.51051 +vn 0.852975 0.488003 -0.185165 +v 0.766158 2.53367 -1.81336 +vn 0.847814 0.31307 -0.428018 +v 0.85719 2.42574 -1.71236 +vn 0.849215 0.329489 -0.41264 +v 0.779964 2.39811 -1.87071 +vn 0.81834 0.250088 -0.517471 +v 0.874587 2.30885 -1.75973 +vn 0.834272 0.276831 -0.476818 +v 0.734726 2.65557 -1.77857 +vn 0.856214 0.354037 -0.376239 +v 0.659411 2.66297 -1.9257 +vn 0.835347 0.292598 -0.465383 +v 0.686495 2.66098 -1.87631 +vn 0.844707 0.315969 -0.432011 +v 0.687379 2.62691 -1.89847 +vn 0.83756 0.300687 -0.456159 +v 0.606316 2.81162 -1.92522 +vn 0.855636 0.31318 -0.412075 +v 0.633471 2.80341 -1.87315 +vn 0.860426 0.340107 -0.379465 +v 0.602836 2.73876 -1.97973 +vn 0.831172 0.273737 -0.483964 +v 0.631233 2.70169 -1.95234 +vn 0.833885 0.285904 -0.472117 +v 0.549089 2.83381 -2.02034 +vn 0.833974 0.265329 -0.483826 +v 0.57756 2.83014 -1.97028 +vn 0.84963 0.290089 -0.44043 +v 0.578938 2.79088 -1.99213 +vn 0.842536 0.273086 -0.464281 +v 0.743657 2.52757 -1.86025 +vn 0.836756 0.293669 -0.462166 +v 0.664484 2.50807 -1.99417 +vn 0.778825 0.209338 -0.591277 +v 0.692887 2.51728 -1.95024 +vn 0.806555 0.244595 -0.538185 +v 0.695931 2.48202 -1.9608 +vn 0.79913 0.214705 -0.561509 +v 0.595704 2.66336 -2.02805 +vn 0.796699 0.233321 -0.557523 +v 0.629679 2.6649 -1.97573 +vn 0.819116 0.266879 -0.507765 +v 0.600333 2.58093 -2.05294 +vn 0.761175 0.200128 -0.616897 +v 0.631028 2.54296 -2.02634 +vn 0.777525 0.186781 -0.600473 +v 0.522415 2.65904 -2.12058 +vn 0.703885 0.144684 -0.695423 +v 0.559294 2.66924 -2.07549 +vn 0.770803 0.191177 -0.607712 +v 0.562822 2.61683 -2.08696 +vn 0.740252 0.176721 -0.648689 +v 0.683442 2.75648 -1.80063 +vn 0.862189 0.36313 -0.353224 +v 0.65813 2.79463 -1.82303 +vn 0.863945 0.360438 -0.351686 +v 0.681767 2.78561 -1.77284 +vn 0.864687 0.38076 -0.327626 +v 0.675647 2.8629 -1.68233 +vn 0.866889 0.433944 -0.245349 +v 0.650235 2.90238 -1.70191 +vn 0.868756 0.435881 -0.235099 +v 0.673425 2.88415 -1.64932 +vn 0.86329 0.457616 -0.21288 +v 0.716247 2.84676 -1.5464 +vn 0.851429 0.499687 -0.159317 +v 0.632837 2.83462 -1.84494 +vn 0.866294 0.35748 -0.348916 +v 0.607485 2.87588 -1.86556 +vn 0.869388 0.353519 -0.345237 +v 0.582597 2.91907 -1.88502 +vn 0.873083 0.350862 -0.338558 +v 0.557866 2.95998 -1.90633 +vn 0.875256 0.346716 -0.337217 +v 0.581447 2.94864 -1.85489 +vn 0.876577 0.369846 -0.30794 +v 0.604408 2.93405 -1.80517 +vn 0.875654 0.391687 -0.28251 +v 0.627291 2.91902 -1.75412 +vn 0.872147 0.413953 -0.260775 +v 0.624768 2.94328 -1.72169 +vn 0.871312 0.434752 -0.227609 +v 0.598869 2.98499 -1.74076 +vn 0.873639 0.438067 -0.211783 +v 0.573194 3.02819 -1.75946 +vn 0.877247 0.436768 -0.199176 +v 0.54735 3.07186 -1.77721 +vn 0.8813 0.437912 -0.177604 +v 0.567937 3.05147 -1.72543 +vn 0.869826 0.469591 -0.151285 +v 0.587964 3.03022 -1.67229 +vn 0.856062 0.504694 -0.111541 +v 0.606791 3.00966 -1.61922 +vn 0.840677 0.536262 -0.0753954 +v 0.383715 3.33114 -1.9923 +vn 0.889733 0.360032 -0.280627 +v 0.453444 3.24399 -1.84685 +vn 0.896401 0.424123 -0.128785 +v 0.506974 3.10927 -1.87595 +vn 0.892754 0.380523 -0.241229 +v 0.487107 3.12915 -1.91726 +vn 0.893628 0.356756 -0.272312 +v 0.498566 3.15926 -1.81121 +vn 0.892273 0.427996 -0.143763 +v 0.476039 3.20215 -1.82763 +vn 0.897003 0.421802 -0.132167 +v 0.527584 3.09088 -1.82669 +vn 0.889499 0.406314 -0.209049 +v 0.522713 3.11585 -1.79444 +vn 0.88712 0.432468 -0.161212 +v 0.406583 3.32819 -1.75019 +vn 0.817772 0.539151 0.201405 +v 0.482276 3.20287 -1.75059 +vn 0.869426 0.493823 -0.0153908 +v 0.46842 3.22479 -1.79848 +vn 0.889842 0.450845 -0.0701412 +v 0.490308 3.18786 -1.69772 +vn 0.841292 0.536747 0.0642681 +v 0.468559 3.21291 -1.66795 +vn 0.772701 0.603369 0.197174 +v 0.443917 3.19736 -1.96835 +vn 0.891417 0.344486 -0.294456 +v 0.389756 3.20667 -2.08955 +vn 0.845826 0.299894 -0.441183 +v 0.410305 3.157 -2.08272 +vn 0.845085 0.284834 -0.452438 +v 0.431306 3.10427 -2.07642 +vn 0.845276 0.279303 -0.455521 +v 0.452972 3.05086 -2.06841 +vn 0.843449 0.272015 -0.463251 +v 0.424117 3.08284 -2.10138 +vn 0.825356 0.258882 -0.501764 +v 0.339478 3.18045 -2.17424 +vn 0.701119 0.225095 -0.676583 +v 0.487659 3.10319 -1.94657 +vn 0.887936 0.341467 -0.30817 +v 0.509216 3.0557 -1.93703 +vn 0.884372 0.339699 -0.320141 +v 0.533768 3.0095 -1.91886 +vn 0.881341 0.344791 -0.323044 +v 0.533504 2.9804 -1.94851 +vn 0.873814 0.327634 -0.359311 +v 0.507831 2.99995 -1.99156 +vn 0.868427 0.305812 -0.390274 +v 0.481239 3.02319 -2.03179 +vn 0.859632 0.28789 -0.42208 +v 0.475714 2.99731 -2.05856 +vn 0.842339 0.270875 -0.465931 +v 0.499261 2.94356 -2.0468 +vn 0.840129 0.265603 -0.472904 +v 0.523983 2.89026 -2.03308 +vn 0.837896 0.267632 -0.475713 +v 0.517892 2.85847 -2.06011 +vn 0.818159 0.245713 -0.519847 +v 0.484449 2.88252 -2.09913 +vn 0.789854 0.216778 -0.573706 +v 0.449115 2.91253 -2.13504 +vn 0.754007 0.197057 -0.626611 +v 0.293454 3.39349 -2.13307 +vn 0.789634 0.306693 -0.531429 +v 0.307201 3.51761 -1.96634 +vn 0.876706 0.446649 -0.17858 +v 0.700094 5.31428 0.431139 +vn 0.694874 0.718281 0.0349501 +v 0.693326 5.29485 0.596349 +vn 0.671141 0.718142 0.183965 +v 0.815116 2.13523 -1.90081 +vn 0.742951 0.0717841 -0.665486 +v 0.797642 2.26439 -1.89674 +vn 0.783624 0.169074 -0.597785 +v 0.892767 2.19426 -1.78589 +vn 0.812872 0.208275 -0.54393 +v 0.828689 2.01286 -1.89004 +vn 0.702246 -0.0349285 -0.711077 +v 0.836203 1.89559 -1.86876 +vn 0.665461 -0.13773 -0.733616 +v 0.717259 2.05051 -1.99285 +vn 0.622415 -0.0808789 -0.778498 +v 0.702401 2.19168 -2.01117 +vn 0.668261 0.0180877 -0.743707 +v 0.59074 2.08585 -2.08482 +vn 0.49749 -0.128711 -0.857868 +v 0.72565 1.91864 -1.96486 +vn 0.586558 -0.172367 -0.791353 +v 0.599359 1.94098 -2.05134 +vn 0.467405 -0.206927 -0.859485 +v 0.683205 2.34565 -2.01498 +vn 0.722582 0.11885 -0.680992 +v 0.575377 2.24373 -2.11005 +vn 0.540931 -0.0404996 -0.840091 +v 0.551324 2.42017 -2.1259 +vn 0.604151 0.041996 -0.795762 +v 0.29568 2.30345 -2.23237 +vn 0.226602 -0.128815 -0.965431 +v 0.328149 2.34391 -2.22901 +vn 0.268103 -0.105545 -0.957591 +v 0.27916 2.48852 -2.25515 +vn 0.247399 -0.0707666 -0.966326 +v 0.389047 2.42748 -2.21578 +vn 0.362714 -0.0510566 -0.930501 +v 0.436809 2.28355 -2.18507 +vn 0.383096 -0.0985661 -0.918435 +v 0.427381 2.37511 -2.19692 +vn 0.399723 -0.063736 -0.914417 +v 0.423694 2.42131 -2.20105 +vn 0.407337 -0.0383451 -0.912473 +v 0.273582 2.54074 -2.26009 +vn 0.251093 -0.0539787 -0.966457 +v 0.307687 2.53715 -2.25017 +vn 0.29373 -0.044984 -0.954829 +v 0.267563 2.59258 -2.26398 +vn 0.256893 -0.0396158 -0.965628 +v 0.260901 2.6462 -2.26781 +vn 0.259237 -0.0272699 -0.965429 +v 0.334345 2.58583 -2.24277 +vn 0.349409 -0.0198617 -0.93676 +v 0.358312 2.63734 -2.23362 +vn 0.405271 0.00653381 -0.914173 +v 0.417763 2.4691 -2.20518 +vn 0.422132 -0.0207282 -0.906297 +v 0.410306 2.52348 -2.2097 +vn 0.434438 -0.00344988 -0.900695 +v 0.444582 2.51685 -2.19195 +vn 0.487094 0.0178169 -0.873168 +v 0.403571 2.5791 -2.21244 +vn 0.456296 0.0137387 -0.889722 +v 0.391009 2.63406 -2.21823 +vn 0.456453 0.0218391 -0.889479 +v 0.47962 2.67544 -2.15693 +vn 0.635657 0.103699 -0.764975 +v 0.494492 2.61668 -2.15215 +vn 0.623756 0.0856378 -0.776914 +v 0.341259 2.17072 -2.2004 +vn 0.248928 -0.171655 -0.953189 +v 0.306397 2.13395 -2.20165 +vn 0.210833 -0.191938 -0.958493 +v 0.452658 2.11408 -2.15454 +vn 0.349334 -0.167472 -0.921911 +v 0.348956 2.01066 -2.16432 +vn 0.235143 -0.230923 -0.944131 +v 0.460434 1.96015 -2.11785 +vn 0.329508 -0.23115 -0.91542 +v 0.261968 2.2636 -2.2338 +vn 0.188489 -0.149871 -0.970572 +v 0.191148 2.18495 -2.23137 +vn 0.123224 -0.186052 -0.974782 +v 0.148261 2.31604 -2.25835 +vn 0.100021 -0.144118 -0.984493 +v 0.112401 2.27466 -2.25505 +vn 0.070538 -0.160193 -0.984562 +v 0.154241 2.14591 -2.22771 +vn 0.0951069 -0.201254 -0.974911 +v 0 2.18013 -2.24168 +vn -1.65727e-18 -0.193099 -0.981179 +v 0.27048 2.09705 -2.20112 +vn 0.176984 -0.209499 -0.961658 +v 0.312281 1.97501 -2.1637 +vn 0.201951 -0.245863 -0.948033 +v 0.235509 1.98042 -2.17899 +vn 0.145299 -0.248561 -0.957656 +v 0.195935 2.02237 -2.19504 +vn 0.118978 -0.238039 -0.963941 +v 0.116502 2.10723 -2.22259 +vn 0.067994 -0.215142 -0.974213 +v 0.157564 1.98454 -2.18967 +vn 0.0929983 -0.24971 -0.963845 +v 0 2.01716 -2.20511 +vn 2.66506e-06 -0.242126 -0.970245 +v 0.182988 2.35832 -2.26014 +vn 0.131014 -0.126933 -0.983221 +v 0.24847 2.4454 -2.2587 +vn 0.204206 -0.0891306 -0.974862 +v 0.200511 2.59808 -2.27904 +vn 0.177484 -0.0518159 -0.982759 +v 0.170719 2.54911 -2.28082 +vn 0.138852 -0.0698257 -0.987848 +v 0.25354 2.70157 -2.27081 +vn 0.264566 -0.0141422 -0.964264 +v 0.228235 2.64881 -2.27579 +vn 0.217547 -0.0341169 -0.975453 +v 0 2.3526 -2.27058 +vn 0 -0.136385 -0.990656 +v 0.106008 2.45575 -2.27946 +vn 0.0738323 -0.102613 -0.991977 +v 0.133194 2.60232 -2.28886 +vn 0.107964 -0.0584122 -0.992437 +v 0.136296 2.55112 -2.28528 +vn 0.106244 -0.0726866 -0.99168 +v 0.064675 2.60602 -2.29433 +vn 0.0485992 -0.0593212 -0.997055 +v 0.036405 2.56332 -2.2926 +vn 0.0231968 -0.0733201 -0.997039 +v 0.126176 2.70951 -2.29454 +vn 0.108663 -0.0326567 -0.993542 +v 0.129818 2.65497 -2.29211 +vn 0.107581 -0.0457655 -0.993142 +v 0.096922 2.65694 -2.29515 +vn 0.0751992 -0.0473473 -0.996044 +v 1.01625 4.41485 0.399494 +vn 0.993001 -0.0251119 -0.115403 +v 1.02247 4.45087 0.472229 +vn 0.997609 0.0284946 -0.0629552 +v 1.02031 4.40446 0.442418 +vn 0.996172 -0.0252213 -0.0836943 +v 1.02404 4.46919 0.52169 +vn 0.997933 0.057986 -0.0276917 +v 1.02269 4.38739 0.487826 +vn 0.996701 -0.0566972 -0.058068 +v 1.02395 4.3693 0.542861 +vn 0.997043 -0.072293 -0.0260619 +v 1.00184 4.29034 0.401314 +vn 0.971488 -0.200119 -0.127134 +v 1.01055 4.3056 0.450979 +vn 0.980592 -0.172118 -0.0938927 +v 1.00431 4.27156 0.457495 +vn 0.971933 -0.215624 -0.094091 +v 1.01663 4.32035 0.500506 +vn 0.987494 -0.145492 -0.0607182 +v 1.02095 4.33486 0.549711 +vn 0.992593 -0.118457 -0.0269685 +v 1.00378 4.25056 0.512005 +vn 0.969663 -0.236435 -0.0620626 +v 1.00108 4.23011 0.564267 +vn 0.963624 -0.265768 -0.0282277 +v 1.0232 4.48561 0.571993 +vn 0.996542 0.0826608 0.00844967 +v 1.02366 4.46659 0.622691 +vn 0.99731 0.0655449 0.0328079 +v 1.00621 4.53702 0.742208 +vn 0.97938 0.156031 0.12833 +v 1.01913 4.42599 0.722415 +vn 0.994663 0.023876 0.100372 +v 1.02279 4.34936 0.599774 +vn 0.995777 -0.0913031 0.00961287 +v 1.01902 4.32308 0.653149 +vn 0.993198 -0.111103 0.0348318 +v 1.01382 4.40268 0.768499 +vn 0.989849 0.00111816 0.142116 +v 1.00725 4.33179 0.790055 +vn 0.982588 -0.0994759 0.156922 +v 1.00417 4.27638 0.755868 +vn 0.976129 -0.182163 0.118277 +v 1.00964 4.40412 0.352432 +vn 0.987932 -0.0342142 -0.151062 +v 0.988948 4.32436 0.285134 +vn 0.966035 -0.167635 -0.196661 +v 0.996833 4.30745 0.343913 +vn 0.969391 -0.184138 -0.162402 +v 0.973632 4.3616 0.196748 +vn 0.956138 -0.127785 -0.263573 +v 0.988008 4.37855 0.247386 +vn 0.973286 -0.0886575 -0.211789 +v 0.981813 4.34194 0.238865 +vn 0.962804 -0.143877 -0.228711 +v 0.934572 4.32618 0.092962 +vn 0.916563 -0.198513 -0.347139 +v 0.955148 4.3433 0.143008 +vn 0.94308 -0.157436 -0.292941 +v 0.911277 4.25654 0.082118 +vn 0.886262 -0.298486 -0.354182 +v 0.928822 4.24159 0.142611 +vn 0.899052 -0.307412 -0.311774 +v 0.881819 4.29128 -0.00871 +vn 0.859788 -0.266631 -0.435514 +v 0.909209 4.30806 0.040129 +vn 0.897148 -0.227298 -0.378762 +v 0.896659 4.27265 0.034491 +vn 0.875307 -0.28179 -0.392978 +v 0.977627 4.259 0.301472 +vn 0.94628 -0.256596 -0.196754 +v 0.991158 4.27483 0.351335 +vn 0.960174 -0.228331 -0.161027 +v 0.960125 4.19359 0.317326 +vn 0.921457 -0.335343 -0.196116 +v 0.96372 4.17432 0.372367 +vn 0.923258 -0.348553 -0.161572 +v 0.94274 4.22691 0.202013 +vn 0.90941 -0.315835 -0.270594 +v 0.961743 4.24301 0.251539 +vn 0.929093 -0.287218 -0.233006 +v 0.953258 4.21105 0.260433 +vn 0.916926 -0.325109 -0.231411 +v 0.895984 4.19468 0.103817 +vn 0.860268 -0.373243 -0.347316 +v 0.921049 4.21076 0.15258 +vn 0.886242 -0.345811 -0.308205 +v 0.875427 4.13353 0.125769 +vn 0.832468 -0.43883 -0.338268 +v 0.888498 4.11707 0.182987 +vn 0.843251 -0.446723 -0.298943 +v 0.83608 4.16293 0.00798 +vn 0.798982 -0.425299 -0.425144 +v 0.867849 4.17868 0.055427 +vn 0.830772 -0.400888 -0.386145 +v 0.858098 4.14872 0.067281 +vn 0.817866 -0.432152 -0.379921 +v 0.98364 4.40309 0.220431 +vn 0.970106 -0.0645456 -0.233939 +v 1.00009 4.48611 0.294758 +vn 0.985023 0.0325479 -0.169322 +v 0.997005 4.51539 0.284413 +vn 0.983891 0.0600479 -0.168384 +v 0.986888 4.50248 0.228344 +vn 0.978172 0.0334761 -0.20508 +v 0.97467 4.48576 0.173127 +vn 0.970031 0.00137076 -0.242976 +v 0.959527 4.46733 0.11896 +vn 0.957443 -0.0306609 -0.28699 +v 0.971288 4.51421 0.161758 +vn 0.969128 0.0298011 -0.244749 +v 0.978725 4.55992 0.206362 +vn 0.975276 0.0850249 -0.203981 +v 0.982603 4.60472 0.254433 +vn 0.977072 0.135844 -0.163943 +v 0.90222 4.33155 0.011483 +vn 0.890652 -0.203915 -0.406396 +v 0.921585 4.3725 0.038009 +vn 0.914823 -0.151147 -0.374505 +v 0.943006 4.42044 0.077619 +vn 0.938981 -0.0936311 -0.330981 +v 0.941149 4.44885 0.065206 +vn 0.940241 -0.0659992 -0.334052 +v 0.919077 4.43065 0.012378 +vn 0.918135 -0.098792 -0.383756 +v 0.893355 4.41272 -0.039827 +vn 0.891284 -0.13374 -0.433273 +v 0.891031 4.44114 -0.052097 +vn 0.892076 -0.102212 -0.440174 +v 0.913026 4.48723 -0.012039 +vn 0.917942 -0.0397825 -0.394715 +v 0.929932 4.53325 0.028983 +vn 0.936832 0.0192993 -0.349246 +v 1.01741 4.51436 0.458308 +vn 0.993101 0.0999702 -0.0612969 +v 1.01205 4.52185 0.400278 +vn 0.990496 0.0971543 -0.0973622 +v 1.02126 4.50152 0.515186 +vn 0.995131 0.0946373 -0.027524 +v 1.00628 4.59774 0.603554 +vn 0.979634 0.197655 0.0353637 +v 1.00836 4.57602 0.443946 +vn 0.986147 0.155257 -0.0583852 +v 1.00787 4.55209 0.392024 +vn 0.987607 0.124788 -0.0951848 +v 0.996412 4.63645 0.426498 +vn 0.979901 0.191782 -0.0548925 +v 0.99135 4.63999 0.366823 +vn 0.978686 0.183539 -0.0921301 +v 1.00415 4.61324 0.54869 +vn 0.979681 0.200471 0.0061027 +v 1.00716 4.59595 0.496516 +vn 0.982888 0.182477 -0.025165 +v 1.00098 4.62623 0.489902 +vn 0.979389 0.200604 -0.0235521 +v 0.999725 4.62923 0.599188 +vn 0.974645 0.220844 0.0359772 +v 0.9766 4.70989 0.644508 +vn 0.962974 0.259343 0.0736349 +v 0.975202 4.72637 0.598955 +vn 0.96487 0.256809 0.0554577 +v 0.978256 4.68941 0.690436 +vn 0.962303 0.254433 0.0961074 +v 0.829218 1.67345 -1.80428 +vn 0.610023 -0.327486 -0.721543 +v 0.836201 1.78219 -1.8401 +vn 0.635143 -0.233455 -0.736269 +v 0.816571 1.57058 -1.7606 +vn 0.587802 -0.419788 -0.691569 +v 0.709647 1.55812 -1.83674 +vn 0.519289 -0.435268 -0.735446 +v 0.720846 1.67149 -1.88748 +vn 0.538357 -0.344166 -0.769234 +v 0.586997 1.54739 -1.90677 +vn 0.419393 -0.451455 -0.78759 +v 0.71393 1.45847 -1.76633 +vn 0.513599 -0.525182 -0.678528 +v 0.581489 1.4283 -1.83078 +vn 0.408754 -0.554931 -0.724549 +v 0.726631 1.79214 -1.92981 +vn 0.559704 -0.256724 -0.787924 +v 0.596532 1.67077 -1.96343 +vn 0.432393 -0.360233 -0.826601 +v 0.601034 1.80257 -2.01113 +vn 0.447325 -0.27952 -0.84957 +v 0.311797 1.67323 -2.06597 +vn 0.196478 -0.370916 -0.907644 +v 0.350341 1.7086 -2.0711 +vn 0.223853 -0.351104 -0.909184 +v 0.313867 1.82097 -2.11895 +vn 0.197915 -0.300098 -0.933151 +v 0.425839 1.77846 -2.07565 +vn 0.285764 -0.31332 -0.905632 +v 0.459317 1.67495 -2.025 +vn 0.319016 -0.366396 -0.874061 +v 0.462469 1.81614 -2.07596 +vn 0.32593 -0.291538 -0.899319 +v 0.351771 1.85678 -2.12155 +vn 0.227765 -0.282969 -0.931693 +v 0.421807 1.6376 -2.02163 +vn 0.280997 -0.390682 -0.876589 +v 0.345442 1.56913 -2.01109 +vn 0.221974 -0.436276 -0.872004 +v 0.306774 1.53506 -2.00281 +vn 0.195464 -0.460836 -0.865693 +v 0.451988 1.54289 -1.9645 +vn 0.313689 -0.456184 -0.832764 +v 0.414127 1.50671 -1.95741 +vn 0.276497 -0.484591 -0.829892 +v 0.337851 1.44147 -1.93961 +vn 0.218465 -0.540049 -0.812785 +v 0.439624 1.42094 -1.89207 +vn 0.301216 -0.567278 -0.766462 +v 0.272891 1.63779 -2.05895 +vn 0.169889 -0.39076 -0.904679 +v 0.194502 1.56737 -2.03926 +vn 0.119411 -0.434677 -0.892635 +v 0.157709 1.67503 -2.09092 +vn 0.0939346 -0.368918 -0.924703 +v 0.118186 1.63907 -2.0797 +vn 0.0688825 -0.388225 -0.918987 +v 0.155263 1.53284 -2.02665 +vn 0.0949065 -0.459055 -0.883324 +v 0 1.55766 -2.04704 +vn 0 -0.439571 -0.898208 +v 0.267944 1.50133 -1.99251 +vn 0.169341 -0.485821 -0.857497 +v 0.299501 1.40969 -1.92752 +vn 0.191976 -0.569625 -0.79917 +v 0.226147 1.40638 -1.94042 +vn 0.142759 -0.570743 -0.808624 +v 0.190263 1.43566 -1.96595 +vn 0.119053 -0.541034 -0.832531 +v 0.116143 1.49927 -2.01235 +vn 0.0697162 -0.484008 -0.872282 +v 0.151629 1.40418 -1.94975 +vn 0.0943857 -0.571004 -0.815504 +v 0 1.42505 -1.9722 +vn 5.52825e-19 -0.548657 -0.836048 +v 0.197166 1.71155 -2.10054 +vn 0.118568 -0.350051 -0.929196 +v 0.275376 1.78472 -2.11458 +vn 0.170211 -0.315832 -0.933423 +v 0.158599 1.82689 -2.14458 +vn 0.0930673 -0.300117 -0.949352 +v 0.197795 1.86446 -2.1518 +vn 0.118135 -0.285784 -0.950985 +v 0.274773 1.93869 -2.16138 +vn 0.171889 -0.259102 -0.950432 +v 0 1.70329 -2.10944 +vn -1.10503e-18 -0.353567 -0.935409 +v 0.119113 1.78953 -2.13586 +vn 0.0678894 -0.314591 -0.946797 +v 0 1.85782 -2.16145 +vn 2.59638e-06 -0.289138 -0.957287 +v 0.118644 1.94664 -2.18289 +vn 0.0673593 -0.260627 -0.963087 +v 0.777625 1.38913 -1.65138 +vn 0.539947 -0.600034 -0.590269 +v 0.746714 1.23159 -1.47481 +vn 0.486445 -0.749648 -0.448775 +v 0.896645 1.3326 -1.45819 +vn 0.558332 -0.671832 -0.486732 +v 0.644944 1.20038 -1.52404 +vn 0.419447 -0.782857 -0.459565 +v 0.637133 1.26865 -1.63339 +vn 0.436845 -0.717062 -0.543128 +v 0.531427 1.16863 -1.56197 +vn 0.330862 -0.820527 -0.466117 +v 0.674194 1.36036 -1.70968 +vn 0.476161 -0.623029 -0.620568 +v 0.52665 1.23154 -1.663 +vn 0.342591 -0.757384 -0.555878 +v 0.553978 1.31635 -1.74697 +vn 0.377151 -0.66647 -0.643098 +v 0.282504 1.20652 -1.73493 +vn 0.167211 -0.78455 -0.597095 +v 0.287397 1.29969 -1.83896 +vn 0.181706 -0.69193 -0.698724 +v 0.428602 1.31327 -1.80529 +vn 0.279666 -0.671105 -0.68659 +v 0.416497 1.2215 -1.70662 +vn 0.256785 -0.768289 -0.58634 +v 0.328419 1.32843 -1.85489 +vn 0.212159 -0.655026 -0.72521 +v 0.369693 1.41541 -1.9124 +vn 0.246672 -0.569955 -0.783776 +v 0.276284 1.12941 -1.61769 +vn 0.146841 -0.867714 -0.474879 +v 0.40776 1.14497 -1.59368 +vn 0.232303 -0.849625 -0.47347 +v 0.139631 1.12094 -1.63315 +vn 0.0725781 -0.877573 -0.473918 +v 0.141265 1.19897 -1.75439 +vn 0.0885151 -0.796749 -0.597793 +v 0 1.13071 -1.66163 +vn -2.76434e-18 -0.866977 -0.498348 +v 0.140408 1.06185 -1.50166 +vn 0.0640668 -0.934887 -0.349116 +v 0 1.06795 -1.52991 +vn -2.69151e-06 -0.93105 -0.364892 +v 0.147232 1.29225 -1.8586 +vn 0.0902517 -0.688969 -0.71915 +v 0.184934 1.31987 -1.87877 +vn 0.114868 -0.659488 -0.742887 +v 0.26116 1.37875 -1.91332 +vn 0.165495 -0.599418 -0.783141 +v 0 1.21109 -1.77948 +vn 2.52351e-06 -0.778529 -0.627609 +v 0.109899 1.26616 -1.83679 +vn 0.0652409 -0.717488 -0.693508 +v 0 1.30918 -1.88312 +vn 1.65866e-18 -0.669184 -0.743097 +v 0.113262 1.37408 -1.93181 +vn 0.0689549 -0.600944 -0.796311 +v 0.345517 3.7519 -0.114254 +vn 0.467437 -0.617685 -0.632431 +v 0.372745 3.73248 -0.074375 +vn 0.509185 -0.590022 -0.626582 +v 0.50204 3.77488 0.004418 +vn 0.589089 -0.603141 -0.537769 +v 0.437127 3.66875 0.037634 +vn 0.62166 -0.458791 -0.634861 +v 0.298765 3.6568 -0.069327 +vn 0.502759 -0.45134 -0.737242 +v 0.520009 3.75397 0.047781 +vn 0.618952 -0.573965 -0.536155 +v 0.261259 3.74306 -0.16091 +vn 0.384776 -0.621571 -0.682346 +v 0.210146 3.71707 -0.16485 +vn 0.343547 -0.593917 -0.727488 +v 0.174302 3.7364 -0.196439 +vn 0.279818 -0.622956 -0.730498 +v 0.142682 3.64196 -0.143397 +vn 0.305135 -0.377851 -0.87414 +v 0 3.7155 -0.21377 +vn -2.21304e-18 -0.605137 -0.796121 +v 0.315838 3.77267 -0.155947 +vn 0.420806 -0.649987 -0.632802 +v 0.280615 3.78915 -0.194594 +vn 0.379412 -0.653712 -0.654757 +v 0.242513 3.80757 -0.23334 +vn 0.328139 -0.664766 -0.671127 +v 0.395628 3.84922 -0.179953 +vn 0.463402 -0.655328 -0.596493 +v 0.348321 3.84227 -0.206959 +vn 0.422843 -0.660923 -0.619987 +v 0.359038 3.86658 -0.22555 +vn 0.424658 -0.658928 -0.62087 +v 0.299893 3.83612 -0.231284 +vn 0.379128 -0.662581 -0.645948 +v 0.250623 3.83072 -0.252454 +vn 0.329371 -0.667268 -0.668033 +v 0.318255 3.88403 -0.269628 +vn 0.382811 -0.654841 -0.651643 +v 0.273446 3.90184 -0.311358 +vn 0.334663 -0.650056 -0.682223 +v 0.135037 3.75561 -0.226585 +vn 0.214597 -0.647608 -0.73113 +v 0.047703 3.79199 -0.277383 +vn 0.079988 -0.689419 -0.719933 +v 0.200562 3.82625 -0.270411 +vn 0.274506 -0.669275 -0.690448 +v 0.149968 3.82248 -0.284546 +vn 0.21477 -0.674082 -0.706744 +v 0.154817 3.84529 -0.304746 +vn 0.215433 -0.671434 -0.70906 +v 0.099308 3.81834 -0.293681 +vn 0.150141 -0.674941 -0.722434 +v 0.0492 3.81236 -0.296126 +vn 0.0789085 -0.676832 -0.731896 +v 0.105772 3.86379 -0.334622 +vn 0.151181 -0.667059 -0.729505 +v 0.054042 3.88046 -0.357972 +vn 0.0795967 -0.663717 -0.743736 +v 0.456451 3.81348 -0.086897 +vn 0.529663 -0.639781 -0.5569 +v 0.428051 3.8316 -0.133456 +vn 0.49725 -0.650867 -0.573685 +v 0.482383 3.79685 -0.041788 +vn 0.555603 -0.632865 -0.539247 +v 0.610887 3.84523 0.051098 +vn 0.637943 -0.613686 -0.465208 +v 0.593011 3.86465 0.00173 +vn 0.615082 -0.626675 -0.47849 +v 0.626845 3.82704 0.097888 +vn 0.657134 -0.603325 -0.451856 +v 0.486467 3.865 -0.118521 +vn 0.533064 -0.645701 -0.54673 +v 0.441773 3.85678 -0.150313 +vn 0.499055 -0.652596 -0.570143 +v 0.514873 3.9171 -0.152117 +vn 0.542218 -0.634991 -0.55026 +v 0.480082 3.93344 -0.203018 +vn 0.512458 -0.631286 -0.582121 +v 0.57123 3.88297 -0.049059 +vn 0.592884 -0.632831 -0.498009 +v 0.529739 3.87373 -0.084599 +vn 0.563116 -0.641503 -0.520937 +v 0.545263 3.90036 -0.10053 +vn 0.567753 -0.637803 -0.520446 +v 0.648617 3.90259 0.02632 +vn 0.647001 -0.61569 -0.449795 +v 0.610979 3.8926 -0.011915 +vn 0.619569 -0.626672 -0.472669 +v 0.684058 3.96012 -0.00073 +vn 0.663079 -0.600336 -0.447128 +v 0.66074 3.97681 -0.055622 +vn 0.643534 -0.598795 -0.476769 +v 0.717449 3.92336 0.105554 +vn 0.698368 -0.593832 -0.399558 +v 0.684254 3.91286 0.065657 +vn 0.671937 -0.607097 -0.424186 +v 0.702922 3.94238 0.053241 +vn 0.680155 -0.600755 -0.420098 +v 0.32498 5.10806 -0.475289 +vn 0.421593 0.518414 -0.74398 +v 0.372087 5.0874 -0.460664 +vn 0.474844 0.479282 -0.738114 +v 0.467384 5.12784 -0.360765 +vn 0.548485 0.519848 -0.654922 +v 0.479927 5.01949 -0.422896 +vn 0.572892 0.404957 -0.712604 +v 0.331169 5.01543 -0.526155 +vn 0.443307 0.402613 -0.800863 +v 0.411004 4.93287 -0.513522 +vn 0.518996 0.297726 -0.801251 +v 0.510124 5.10404 -0.34186 +vn 0.590944 0.486156 -0.643769 +v 0.619066 5.05554 -0.264659 +vn 0.68346 0.434904 -0.586295 +v 0.584946 5.04048 -0.313361 +vn 0.655495 0.425621 -0.623838 +v 0.609967 5.02132 -0.298886 +vn 0.684099 0.398709 -0.61077 +v 0.569882 4.95368 -0.378898 +vn 0.649044 0.337448 -0.681814 +v 0.214544 5.07662 -0.547839 +vn 0.310395 0.47754 -0.821955 +v 0.165966 5.09957 -0.550409 +vn 0.244427 0.522863 -0.816621 +v 0.182951 4.99514 -0.598928 +vn 0.273693 0.366047 -0.889439 +v 0.135704 5.02018 -0.601113 +vn 0.209954 0.401407 -0.891511 +v 0 5.07825 -0.587904 +vn 6.65165e-18 0.48698 -0.873413 +v 0.370021 4.9001 -0.549724 +vn 0.482475 0.255481 -0.837823 +v 0.327022 4.92472 -0.565473 +vn 0.438893 0.290464 -0.850296 +v 0.230926 4.97014 -0.592273 +vn 0.333419 0.331099 -0.882726 +v 0.162989 4.87539 -0.642416 +vn 0.246218 0.219692 -0.943987 +v 0.047365 4.95439 -0.640698 +vn 0.0785987 0.310578 -0.947293 +v 0.159805 5.19332 -0.483587 +vn 0.228379 0.62843 -0.743585 +v 0.153204 5.2758 -0.404919 +vn 0.203014 0.730661 -0.651859 +v 0 5.17536 -0.523778 +vn 2.21808e-18 0.614012 -0.789297 +v 0 5.26147 -0.445474 +vn 1.10813e-18 0.723481 -0.690345 +v 0.45526 5.16617 -0.338882 +vn 0.539574 0.557563 -0.63086 +v 0.49357 4.65611 -0.512279 +vn 0.561018 0.0264356 -0.827381 +v 0.54175 4.66555 -0.477151 +vn 0.603435 0.0449413 -0.796145 +v 0.587827 4.67574 -0.439724 +vn 0.642969 0.0643683 -0.763183 +v 0.631418 4.68657 -0.399821 +vn 0.680466 0.083757 -0.727978 +v 0.597195 4.64511 -0.433745 +vn 0.6472 0.0369756 -0.761423 +v 0.558937 4.60332 -0.465397 +vn 0.610184 -0.0104788 -0.792191 +v 0.516758 4.56145 -0.494541 +vn 0.568899 -0.057165 -0.820418 +v 0.523662 4.52999 -0.487089 +vn 0.571148 -0.0854366 -0.816389 +v 0.574309 4.54114 -0.450453 +vn 0.615949 -0.0665943 -0.784967 +v 0.622673 4.55308 -0.411366 +vn 0.658101 -0.0462067 -0.75151 +v 0.668214 4.56579 -0.369744 +vn 0.698282 -0.0255086 -0.715368 +v 0.62992 4.52253 -0.402422 +vn 0.661116 -0.0749205 -0.746534 +v 0.587298 4.47944 -0.432659 +vn 0.620563 -0.124241 -0.774252 +v 0.540643 4.43678 -0.460184 +vn 0.576352 -0.171602 -0.798982 +v 0.672447 4.69801 -0.358062 +vn 0.715658 0.104103 -0.690649 +v 0.710541 4.70998 -0.314297 +vn 0.749066 0.124056 -0.650777 +v 0.74567 4.72246 -0.269118 +vn 0.780523 0.145058 -0.608064 +v 0.756674 4.69391 -0.261049 +vn 0.787577 0.120624 -0.604295 +v 0.731588 4.6517 -0.298692 +vn 0.761487 0.0730447 -0.644051 +v 0.702134 4.60892 -0.33508 +vn 0.731609 0.024591 -0.681281 +v 0.710966 4.57916 -0.326124 +vn 0.736291 -0.00305809 -0.676658 +v 0.750398 4.59316 -0.280461 +vn 0.772327 0.0196518 -0.634921 +v 0.786595 4.6077 -0.233257 +vn 0.806372 0.0443747 -0.589742 +v 0.795145 4.57885 -0.222875 +vn 0.811591 0.0170382 -0.583977 +v 0.76637 4.53462 -0.260041 +vn 0.781127 -0.0368819 -0.623282 +v 0.732791 4.49026 -0.295702 +vn 0.746883 -0.090282 -0.658798 +v 0.349194 4.56726 -0.591032 +vn 0.416076 -0.0804133 -0.905767 +v 0.398005 4.60723 -0.569524 +vn 0.468207 -0.0366828 -0.882857 +v 0.359295 4.50224 -0.578588 +vn 0.418113 -0.135564 -0.898223 +v 0.4159 4.51047 -0.551399 +vn 0.472488 -0.120071 -0.87312 +v 0.242093 4.4891 -0.622225 +vn 0.296842 -0.161511 -0.941169 +v 0.297157 4.52778 -0.608756 +vn 0.358889 -0.122052 -0.925366 +v 0.301335 4.49506 -0.602402 +vn 0.359574 -0.149442 -0.921072 +v 0.117563 4.55015 -0.661166 +vn 0.159145 -0.123475 -0.979503 +v 0.173667 4.58438 -0.653705 +vn 0.229414 -0.089569 -0.969199 +v 0.121232 4.48345 -0.650274 +vn 0.159211 -0.177256 -0.971201 +v 0.181954 4.48457 -0.638261 +vn 0.230096 -0.171469 -0.957943 +v 0 4.49582 -0.662712 +vn -2.55942e-06 -0.172284 -0.985047 +v 0.059551 4.52123 -0.664363 +vn 0.082386 -0.150477 -0.985175 +v 0.06047 4.48779 -0.658783 +vn 0.0821743 -0.177614 -0.980663 +v 0.367843 4.43806 -0.562877 +vn 0.419885 -0.190572 -0.887344 +v 0.420995 4.47853 -0.543631 +vn 0.473791 -0.147869 -0.868134 +v 0.374505 4.37529 -0.544153 +vn 0.421288 -0.24633 -0.872833 +v 0.433278 4.38447 -0.516139 +vn 0.47655 -0.232733 -0.847783 +v 0.252744 4.36054 -0.589128 +vn 0.29874 -0.268704 -0.915725 +v 0.311657 4.39861 -0.578185 +vn 0.361557 -0.230594 -0.903384 +v 0.314324 4.36721 -0.568673 +vn 0.362085 -0.258304 -0.895641 +v 0.124392 4.41776 -0.635913 +vn 0.159372 -0.22979 -0.960103 +v 0.184342 4.45174 -0.631261 +vn 0.230453 -0.197657 -0.952798 +v 0.126954 4.3537 -0.618305 +vn 0.159601 -0.282065 -0.946027 +v 0.190225 4.35536 -0.605679 +vn 0.231279 -0.277137 -0.93258 +v 0 4.36492 -0.632558 +vn 8.61863e-07 -0.276541 -0.961002 +v 0.062807 4.3894 -0.636602 +vn 0.0823444 -0.255321 -0.963344 +v 0.063446 4.35737 -0.62767 +vn 0.0822003 -0.281763 -0.955956 +v 0.391445 4.63955 -0.573906 +vn 0.466482 -0.00840737 -0.884491 +v 0.337953 4.63256 -0.59994 +vn 0.413743 -0.024158 -0.910073 +v 0.28321 4.62654 -0.622778 +vn 0.356528 -0.0386423 -0.933485 +v 0.227348 4.6215 -0.641751 +vn 0.29487 -0.0510719 -0.954171 +v 0.278157 4.65942 -0.625473 +vn 0.355618 -0.0095182 -0.934583 +v 0.325906 4.69758 -0.605057 +vn 0.410968 0.0342116 -0.911007 +v 0.370485 4.73578 -0.581007 +vn 0.460463 0.0792175 -0.884137 +v 0.363308 4.7674 -0.581449 +vn 0.458054 0.109819 -0.882115 +v 0.313388 4.76177 -0.60615 +vn 0.407436 0.0954997 -0.908227 +v 0.262493 4.75697 -0.6278 +vn 0.352303 0.0818391 -0.932301 +v 0.210468 4.75291 -0.645829 +vn 0.292004 0.0697328 -0.953872 +v 0.25674 4.78883 -0.626545 +vn 0.351062 0.113668 -0.929427 +v 0.300864 4.82624 -0.602681 +vn 0.403203 0.160484 -0.900928 +v 0.339566 4.85935 -0.577273 +vn 0.448377 0.20785 -0.869343 +v 0.170665 4.61777 -0.657104 +vn 0.229135 -0.0616526 -0.97144 +v 0.11356 4.61723 -0.668359 +vn 0.159095 -0.0673039 -0.984966 +v 0.056559 4.62204 -0.675858 +vn 0.0823092 -0.067475 -0.99432 +v 0 4.63025 -0.678691 +vn 0 -0.0612391 -0.998123 +v 0.055491 4.65563 -0.677641 +vn 0.0825491 -0.0373724 -0.995886 +v 0.109312 4.68406 -0.67163 +vn 0.159019 -0.00768393 -0.987246 +v 0.161153 4.71732 -0.661018 +vn 0.22811 0.0292095 -0.973197 +v 0.15793 4.75004 -0.660352 +vn 0.227799 0.0604844 -0.971828 +v 0.104882 4.75001 -0.670777 +vn 0.158619 0.055162 -0.985798 +v 0.052242 4.75509 -0.677114 +vn 0.082393 0.0566536 -0.994988 +v 0 4.7631 -0.67875 +vn -2.61635e-07 0.0634884 -0.997983 +v 0.050805 4.78749 -0.674774 +vn 0.081661 0.0905594 -0.992537 +v 0.099766 4.81527 -0.665838 +vn 0.15393 0.120606 -0.980693 +v 0.134932 4.84501 -0.655183 +vn 0.208906 0.161074 -0.964579 +v 0.523271 4.72737 -0.485398 +vn 0.595701 0.100568 -0.796886 +v 0.485132 4.68754 -0.516353 +vn 0.557947 0.054638 -0.828076 +v 0.504066 4.78835 -0.489796 +vn 0.586788 0.15717 -0.794341 +v 0.458803 4.78074 -0.523067 +vn 0.547271 0.140952 -0.825002 +v 0.588697 4.80542 -0.416689 +vn 0.657715 0.189979 -0.728917 +v 0.557782 4.76675 -0.452111 +vn 0.628695 0.146012 -0.763822 +v 0.547436 4.79664 -0.454425 +vn 0.623313 0.17366 -0.762446 +v 0.687859 4.76767 -0.326869 +vn 0.735324 0.173624 -0.655098 +v 0.661621 4.72749 -0.364124 +vn 0.70962 0.129886 -0.692509 +v 0.664139 4.82454 -0.335972 +vn 0.720354 0.222417 -0.656978 +v 0.627669 4.81478 -0.377287 +vn 0.689808 0.206588 -0.693892 +v 0.710239 4.80703 -0.288567 +vn 0.757425 0.215376 -0.616377 +v 0.697959 4.8348 -0.293427 +vn 0.749107 0.238567 -0.618001 +v 0.484589 4.84805 -0.49006 +vn 0.575985 0.215886 -0.788438 +v 0.449817 4.8112 -0.52316 +vn 0.542742 0.170975 -0.822313 +v 0.464782 4.90644 -0.486139 +vn 0.562984 0.275504 -0.779196 +v 0.419618 4.90235 -0.518646 +vn 0.52484 0.264269 -0.809139 +v 0.54469 4.91935 -0.417453 +vn 0.62895 0.298585 -0.717823 +v 0.516217 4.88416 -0.454737 +vn 0.604362 0.258382 -0.753648 +v 0.506002 4.91251 -0.452701 +vn 0.597335 0.286909 -0.748915 +v 0.639984 4.88025 -0.3412 +vn 0.704074 0.271223 -0.656291 +v 0.61605 4.8433 -0.379663 +vn 0.682538 0.232042 -0.693036 +v 0.615933 4.93456 -0.342177 +vn 0.686113 0.321435 -0.652632 +v 0.58143 4.92681 -0.38063 +vn 0.658455 0.309821 -0.685892 +v 0.677919 4.95132 -0.261759 +vn 0.737564 0.342448 -0.582004 +v 0.660559 4.91628 -0.301844 +vn 0.722309 0.307607 -0.619393 +v 0.648185 4.9428 -0.302596 +vn 0.712119 0.332429 -0.618366 +v 0.297999 5.39625 -0.159791 +vn 0.317251 0.835939 -0.447836 +v 0.152323 5.4083 -0.216105 +vn 0.17619 0.857373 -0.4836 +v 0.153937 5.45965 -0.115511 +vn 0.17374 0.891135 -0.419157 +v 0.303317 5.44444 -0.056075 +vn 0.316762 0.868606 -0.381033 +v 0 5.40118 -0.256881 +vn 0 0.859843 -0.510558 +v 0 5.45566 -0.156037 +vn 1.10617e-18 0.896215 -0.44362 +v 0 5.50508 -0.047297 +vn 1.07818e-17 0.920487 -0.390773 +v 0.43099 5.37237 -0.088143 +vn 0.434579 0.804283 -0.405303 +v 0.443234 5.41682 0.02559 +vn 0.434892 0.836996 -0.332125 +v 0.566991 5.37265 0.107332 +vn 0.556004 0.783343 -0.277909 +v 0.292707 5.33998 -0.257623 +vn 0.32488 0.786525 -0.525196 +v 0.404608 5.26582 -0.278184 +vn 0.454145 0.680375 -0.575189 +v 0.524124 5.28479 -0.134629 +vn 0.555001 0.694356 -0.458087 +v 0.151194 5.34726 -0.314312 +vn 0.184834 0.806583 -0.561481 +v 0 5.33663 -0.355088 +vn 2.91895e-06 0.8053 -0.592868 +v 0.712341 5.19834 0.03604 +vn 0.757367 0.559119 -0.337314 +v 0.743679 5.22684 0.180839 +vn 0.780109 0.585553 -0.220357 +v 0.774087 5.11454 0.055071 +vn 0.824953 0.465194 -0.321008 +v 0.804875 5.14518 0.210298 +vn 0.848705 0.489787 -0.199519 +v 0.717083 5.08371 -0.100956 +vn 0.774102 0.453266 -0.441946 +v 0.651162 5.17181 -0.112613 +vn 0.701426 0.547354 -0.456515 +v 0.638442 5.08284 -0.219577 +vn 0.698114 0.465235 -0.544237 +v 0.650775 5.05999 -0.222267 +vn 0.715546 0.431643 -0.549252 +v 0.775228 5.02134 -0.053236 +vn 0.828101 0.391911 -0.400818 +v 0.711541 5.05073 -0.141699 +vn 0.772416 0.419579 -0.476788 +v 0.771024 4.98824 -0.091668 +vn 0.821717 0.371032 -0.43257 +v 0.693095 4.98334 -0.221391 +vn 0.745835 0.383056 -0.544975 +v 0.705041 4.96023 -0.220286 +vn 0.762509 0.351258 -0.543322 +v 0.666794 5.30642 0.156218 +vn 0.682116 0.690643 -0.24027 +v 0.604358 5.3869 0.249768 +vn 0.609977 0.777264 -0.15424 +v 0.576561 5.40483 0.238284 +vn 0.562281 0.807239 -0.179459 +v 0.223692 3.11185 -2.26331 +vn 0.353836 0.125692 -0.926824 +v 0.190276 3.1014 -2.2756 +vn 0.268668 0.0883521 -0.959172 +v 0.249216 3.05328 -2.25987 +vn 0.377882 0.0943872 -0.92103 +v 0.257906 3.10681 -2.24979 +vn 0.415583 0.135905 -0.899345 +v 0.23871 2.81913 -2.27513 +vn 0.271932 0.0120929 -0.962241 +v 0.228399 2.8768 -2.27721 +vn 0.2669 0.0223289 -0.963466 +v 0.298143 2.81291 -2.2554 +vn 0.368139 0.0312182 -0.929246 +v 0.309219 2.86637 -2.24872 +vn 0.406606 0.0505768 -0.912202 +v 0.245593 2.75877 -2.27368 +vn 0.264466 -0.00233178 -0.964392 +v 0.276024 2.75671 -2.26447 +vn 0.311197 0.00555428 -0.950329 +v 0.338917 3.06426 -2.20712 +vn 0.610692 0.163991 -0.774702 +v 0.310702 3.11262 -2.21818 +vn 0.576418 0.179997 -0.797084 +v 0.335606 3.12445 -2.1951 +vn 0.641968 0.209825 -0.737462 +v 0.360987 3.12538 -2.17029 +vn 0.726715 0.226201 -0.648628 +v 0.353068 2.81313 -2.22977 +vn 0.483268 0.0613973 -0.873317 +v 0.331378 2.86264 -2.23823 +vn 0.457115 0.0539261 -0.887771 +v 0.406709 2.81702 -2.19478 +vn 0.600536 0.10368 -0.792847 +v 0.409956 2.87927 -2.18306 +vn 0.646032 0.136081 -0.751082 +v 0.382362 2.69228 -2.2204 +vn 0.472474 0.0426938 -0.88031 +v 0.360979 2.74811 -2.22929 +vn 0.455686 0.0349599 -0.889454 +v 0.390418 2.75755 -2.21221 +vn 0.528985 0.0631795 -0.846276 +v 0.163658 3.11479 -2.28062 +vn 0.199725 0.0989361 -0.974844 +v 0.20141 3.0464 -2.27686 +vn 0.271292 0.0750415 -0.959567 +v 0.151593 3.05701 -2.28736 +vn 0.177345 0.0644246 -0.982038 +v 0.097007 3.10898 -2.29163 +vn 0.106179 0.0754687 -0.991479 +v 0.065102 3.10735 -2.29412 +vn 0.0544256 0.0735819 -0.995803 +v 0.09873 3.05237 -2.29497 +vn 0.102518 0.0565858 -0.99312 +v 0.048511 3.05335 -2.29834 +vn 0.0437326 0.0569222 -0.99742 +v 0.200117 2.87809 -2.28423 +vn 0.2232 0.0164861 -0.974633 +v 0.178004 2.82044 -2.28911 +vn 0.182667 -0.00111422 -0.983174 +v 0.153288 2.76415 -2.29262 +vn 0.142149 -0.0181477 -0.989679 +v 0.11404 2.88184 -2.29832 +vn 0.105639 0.00627286 -0.994385 +v 0.085069 2.8835 -2.30082 +vn 0.0729546 0.00499597 -0.997323 +v 0.118225 2.82332 -2.29771 +vn 0.10796 -0.0069973 -0.994131 +v 0.12229 2.7656 -2.29659 +vn 0.107175 -0.0203933 -0.994031 +v 0.057251 2.82658 -2.30232 +vn 0.0480596 -0.00794323 -0.998813 +v 0.029723 2.78473 -2.30276 +vn 0.0225994 -0.019531 -0.999554 +v 0.147524 3.23247 -2.27165 +vn 0.202109 0.109055 -0.973272 +v 0.127284 3.28799 -2.26814 +vn 0.185473 0.150446 -0.971064 +v 0.117417 3.43745 -2.2385 +vn 0.203344 0.249464 -0.946794 +v 0.061474 3.24132 -2.28189 +vn 0.050943 0.107143 -0.992938 +v 0.049756 3.45088 -2.24416 +vn 0.0593977 0.255054 -0.965101 +v 0.17147 3.28853 -2.25741 +vn 0.286526 0.166877 -0.943427 +v 0.188559 3.33063 -2.24269 +vn 0.384869 0.216537 -0.897211 +v 0.300788 3.2284 -2.19708 +vn 0.656304 0.193073 -0.729375 +v 0 3.48922 -1.67513 +vn 3.31436e-18 0.569344 0.822099 +v 0 3.39192 -1.59291 +vn 0 0.729307 0.684187 +v 1.38832 2.57245 0.952098 +vn 0.83947 0.515581 0.171658 +v 1.41062 2.57796 0.806361 +vn 0.840467 0.527187 0.125257 +v 1.42927 2.57806 0.650838 +vn 0.838299 0.53997 0.0754098 +v 1.43581 2.47725 0.984192 +vn 0.869471 0.45575 0.190557 +v 1.46227 2.48124 0.835465 +vn 0.873188 0.465387 0.144769 +v 1.48461 2.48081 0.676286 +vn 0.874181 0.475797 0.0970789 +v 1.34071 2.69402 0.727858 +vn 0.79289 0.602815 0.0891017 +v 1.36263 2.56523 1.08121 +vn 0.832531 0.507675 0.221717 +v 1.40617 2.47166 1.11588 +vn 0.860672 0.448622 0.240793 +v 1.51121 2.27168 1.02903 +vn 0.934051 0.281748 0.21947 +v 1.52808 2.16308 1.06838 +vn 0.956232 0.17301 0.235983 +v 1.56661 2.14969 0.901608 +vn 0.969379 0.155553 0.190021 +v 1.54373 2.2697 0.87656 +vn 0.94338 0.281601 0.175316 +v 1.58506 2.17938 0.764113 +vn 0.971602 0.185306 0.147144 +v 1.54571 2.04631 1.05025 +vn 0.972355 0.0475176 0.228622 +v 1.5795 2.11795 0.856033 +vn 0.977607 0.118589 0.173845 +v 1.57466 2.02107 0.918315 +vn 0.982525 0.0130894 0.185669 +v 1.59676 2.05409 0.782164 +vn 0.988128 0.0403697 0.148235 +v 1.47764 2.37687 1.00977 +vn 0.902216 0.378377 0.206971 +v 1.50762 2.37842 0.858851 +vn 0.908781 0.38468 0.161673 +v 1.57147 2.26578 0.712572 +vn 0.951042 0.281125 0.128408 +v 1.55684 2.29533 0.750782 +vn 0.939914 0.312187 0.138209 +v 1.53205 2.37845 0.699133 +vn 0.910872 0.395381 0.118261 +v 1.44463 2.37377 1.14318 +vn 0.891 0.373785 0.257688 +v 1.47572 2.27213 1.16345 +vn 0.920117 0.282807 0.270933 +v 1.49127 2.16751 1.19904 +vn 0.939881 0.180676 0.289794 +v 1.51031 2.05648 1.18337 +vn 0.957719 0.0656789 0.28011 +v 1.48302 1.4885 0.885728 +vn 0.944935 -0.297561 0.136218 +v 1.41562 2.0259 -1.03157 +vn 0.891015 0.271154 -0.364098 +v 1.47759 2.03282 -0.857865 +vn 0.902707 0.283526 -0.323624 +v 1.39499 2.09755 -1.01603 +vn 0.857852 0.384368 -0.341103 +v 1.45333 2.10866 -0.842537 +vn 0.857858 0.410156 -0.3096 +v 1.45698 1.97628 -0.954193 +vn 0.931919 0.153521 -0.328571 +v 1.46072 1.89727 -0.963118 +vn 0.94524 -0.00983626 -0.326227 +v 1.51548 1.98612 -0.775962 +vn 0.949557 0.153157 -0.273651 +v 1.52041 1.90047 -0.78235 +vn 0.964247 -0.0115004 -0.264757 +v 1.50628 1.88579 -0.828968 +vn 0.954607 -0.0386282 -0.295354 +v 1.59273 2.04812 -0.408733 +vn 0.970627 0.179475 -0.160227 +v 1.56031 2.01324 -0.59404 +vn 0.963164 0.163865 -0.213219 +v 1.58553 1.97047 -0.50038 +vn 0.979394 0.0646804 -0.191322 +v 1.58611 1.94293 -0.501589 +vn 0.981862 0.00150787 -0.189593 +v 1.56708 1.92002 -0.59881 +vn 0.981128 -0.00941403 -0.193131 +v 1.56227 2.0985 -0.493655 +vn 0.922191 0.305374 -0.237299 +v 1.52912 2.18481 -0.481705 +vn 0.860093 0.441165 -0.256152 +v 1.52642 2.05948 -0.677116 +vn 0.911983 0.298172 -0.281745 +v 1.49823 2.13933 -0.661548 +vn 0.858623 0.427077 -0.283499 +v 1.58468 2.14862 -0.310577 +vn 0.928786 0.317238 -0.191617 +v 1.61381 2.19016 0.003607 +vn 0.959035 0.272317 -0.0780792 +v 1.54816 2.23886 -0.301942 +vn 0.869504 0.443977 -0.216442 +v 1.52577 2.3347 -0.167605 +vn 0.839846 0.509643 -0.186879 +v 1.57729 2.29122 0.006228 +vn 0.909011 0.404358 -0.100959 +v 1.6022 2.08468 -0.311153 +vn 0.965274 0.203029 -0.164395 +v 1.6134 2.01095 -0.309907 +vn 0.988219 0.0774603 -0.131993 +v 1.61344 1.98632 -0.318218 +vn 0.990867 0.0346102 -0.130328 +v 1.62349 1.94783 -0.226337 +vn 0.995044 -0.0449663 -0.088686 +v 1.63045 2.09843 -0.039443 +vn 0.987282 0.144714 -0.0658147 +v 1.63114 2.02343 -0.132559 +vn 0.995754 0.0508037 -0.0767711 +v 1.63547 2.07892 0.007084 +vn 0.993405 0.104351 -0.0475112 +v 1.63912 2.02005 0.007874 +vn 0.999084 0.0196083 -0.0380476 +v 1.63708 1.98206 -0.038476 +vn 0.998674 -0.0266821 -0.0440267 +v 1.60655 2.24396 0.366988 +vn 0.960199 0.277621 0.0307296 +v 1.631 2.12588 0.374112 +vn 0.99076 0.128803 0.0424747 +v 1.6288 2.15193 0.327415 +vn 0.985798 0.165491 0.0285459 +v 1.6202 2.20008 0.234191 +vn 0.971388 0.237488 -0.00234811 +v 1.61395 2.22185 0.187889 +vn 0.961792 0.273054 -0.0199245 +v 1.63701 2.10675 0.19195 +vn 0.993111 0.117149 -0.00274185 +v 1.63333 2.13012 0.145091 +vn 0.987764 0.154932 -0.0178163 +v 1.622 2.17152 0.05226 +vn 0.97122 0.232033 -0.053785 +v 1.63927 2.08182 0.238914 +vn 0.996738 0.0799005 0.0113595 +v 1.64129 1.98185 0.196405 +vn 0.998943 -0.0453892 0.00722441 +v 1.64211 2.00871 0.148711 +vn 0.999945 -0.0094744 -0.00450825 +v 1.63913 2.0574 0.053982 +vn 0.997335 0.0657502 -0.0316281 +v 1.60045 2.26726 0.320772 +vn 0.950216 0.311269 0.0141942 +v 1.58464 2.3096 0.228835 +vn 0.92662 0.375222 -0.0241612 +v 1.56314 2.36142 0.367787 +vn 0.912216 0.409497 0.0131931 +v 1.55504 2.3794 0.314824 +vn 0.900703 0.434383 -0.00679469 +v 1.57384 2.33076 0.183161 +vn 0.911978 0.407008 -0.0513787 +v 1.52309 2.42748 0.177054 +vn 0.859796 0.505729 -0.0706289 +v 1.60648 2.24194 0.141872 +vn 0.949979 0.309766 -0.0398202 +v 1.52703 2.38706 0.00543 +vn 0.850914 0.508819 -0.130567 +v 1.5735 2.33459 0.411415 +vn 0.927268 0.373105 0.0310786 +v 1.58603 2.27875 0.540168 +vn 0.950176 0.302031 0.0770848 +v 1.54559 2.38302 0.547048 +vn 0.910658 0.407482 0.0682607 +v 1.54935 2.34875 0.659542 +vn 0.923452 0.368555 0.106783 +v 1.50454 2.47374 0.343316 +vn 0.86028 0.509435 -0.0198697 +v 1.51941 2.44516 0.475476 +vn 0.88246 0.469033 0.0356566 +v 1.50111 2.47503 0.514567 +vn 0.870653 0.489652 0.0469572 +v 1.61128 2.21965 0.4133 +vn 0.968572 0.24423 0.0471149 +v 1.61465 2.15808 0.548408 +vn 0.982207 0.164705 0.0902282 +v 1.63172 2.09887 0.42049 +vn 0.994218 0.0910747 0.0568861 +v 1.58489 2.23565 0.673496 +vn 0.961274 0.249026 0.11806 +v 1.59623 2.14739 0.724735 +vn 0.979737 0.146966 0.136077 +v 1.60582 2.11474 0.68462 +vn 0.986207 0.108638 0.12487 +v 1.62011 2.05154 0.599165 +vn 0.994456 0.0317676 0.100244 +v 1.40919 2.33756 -0.536614 +vn 0.751243 0.606604 -0.260126 +v 1.46288 2.25815 -0.552794 +vn 0.79994 0.542657 -0.256163 +v 1.36839 2.42534 -0.441779 +vn 0.700401 0.654518 -0.284684 +v 1.30846 2.48859 -0.432932 +vn 0.64546 0.705427 -0.292837 +v 1.35365 2.37166 -0.609488 +vn 0.719572 0.639364 -0.270979 +v 1.29728 2.43515 -0.597033 +vn 0.665874 0.695613 -0.269692 +v 1.37437 2.48664 -0.279342 +vn 0.695864 0.66342 -0.275039 +v 1.37892 2.5441 -0.119018 +vn 0.709213 0.661517 -0.243746 +v 1.31391 2.6092 -0.12005 +vn 0.650073 0.709024 -0.273294 +v 1.46725 2.42238 -0.163303 +vn 0.782095 0.585381 -0.213676 +v 1.46655 2.47717 0.003324 +vn 0.796421 0.583271 -0.159711 +v 1.44313 2.56715 0.327889 +vn 0.81584 0.576228 -0.0486372 +v 1.462 2.52011 0.16843 +vn 0.810907 0.57671 -0.0991745 +v 1.37672 2.59755 0.038925 +vn 0.728768 0.658355 -0.188324 +v 1.4439 2.56979 0.491355 +vn 0.832939 0.553006 0.0199473 +v 1.29083 2.30985 -0.949967 +vn 0.768198 0.584328 -0.261598 +v 1.32846 2.3315 -0.782275 +vn 0.744256 0.616721 -0.256393 +v 1.27899 2.39428 -0.763865 +vn 0.69105 0.680555 -0.243506 +v 1.34153 2.27123 -0.882197 +vn 0.789723 0.557473 -0.256051 +v 1.3821 2.19844 -0.90475 +vn 0.821192 0.497797 -0.279002 +v 1.38014 2.29825 -0.707733 +vn 0.768784 0.587403 -0.252842 +v 1.42755 2.22181 -0.72922 +vn 0.808458 0.52526 -0.265514 +v 1.11503 2.67505 -0.275105 +vn 0.380123 0.854198 -0.354757 +v 1.40878 1.73467 -1.04264 +vn 0.907126 -0.233639 -0.350051 +v 1.45521 1.68497 -0.863724 +vn 0.912492 -0.295925 -0.282466 +v 1.46014 1.71501 -0.877322 +vn 0.91715 -0.266557 -0.296283 +v 1.47821 1.74785 -0.848571 +vn 0.928719 -0.237023 -0.285133 +v 1.4213 1.81869 -1.05433 +vn 0.919869 -0.134734 -0.368359 +v 1.43582 1.84564 -1.02563 +vn 0.930859 -0.0858995 -0.355137 +v 1.47522 1.78155 -0.882556 +vn 0.929983 -0.19512 -0.311544 +v 1.48243 1.81183 -0.878652 +vn 0.934748 -0.166408 -0.313933 +v 1.38603 1.64773 -1.03348 +vn 0.893416 -0.304592 -0.3302 +v 1.35764 1.55834 -1.01962 +vn 0.8778 -0.358033 -0.318245 +v 1.43515 1.62479 -0.861026 +vn 0.902506 -0.328343 -0.278699 +v 1.40305 1.53328 -0.849056 +vn 0.889862 -0.369019 -0.268273 +v 1.35288 1.63406 -1.10978 +vn 0.89038 -0.305623 -0.337371 +v 1.34434 1.18005 -0.387244 +vn 0.777179 -0.613628 -0.139478 +v 1.3306 1.20755 -0.540511 +vn 0.797532 -0.569342 -0.199482 +v 1.41499 1.3039 -0.381001 +vn 0.910104 -0.387834 -0.145931 +v 1.44351 1.37687 -0.386596 +vn 0.922225 -0.357939 -0.146222 +v 1.38767 1.31895 -0.556989 +vn 0.897268 -0.395597 -0.195994 +v 1.41588 1.39058 -0.565579 +vn 0.908284 -0.371638 -0.19211 +v 1.45633 1.37599 -0.296638 +vn 0.926196 -0.355692 -0.125075 +v 1.4801 1.38722 -0.115572 +vn 0.934898 -0.34602 -0.0789647 +v 1.44073 1.62411 1.24863 +vn 0.889984 -0.284696 0.356198 +v 1.52978 1.80104 1.05236 +vn 0.967854 -0.147505 0.20372 +v 1.5091 1.68233 1.04466 +vn 0.959193 -0.210735 0.188522 +v 1.55279 1.7772 0.907215 +vn 0.970891 -0.178179 0.160073 +v 1.5266 1.65342 0.903369 +vn 0.96091 -0.235939 0.144862 +v 1.56019 1.72744 0.788871 +vn 0.968086 -0.216206 0.126746 +v 1.57136 1.90304 0.905476 +vn 0.979296 -0.09646 0.177976 +v 1.54332 1.92431 1.05374 +vn 0.973558 -0.0645834 0.219122 +v 1.59043 1.87528 0.762854 +vn 0.982967 -0.128057 0.131825 +v 1.58124 1.93412 0.86498 +vn 0.9834 -0.0748307 0.165301 +v 1.60281 2.01413 0.745512 +vn 0.99024 -0.00668988 0.13921 +v 1.50271 1.82282 1.17923 +vn 0.958001 -0.121673 0.259673 +v 1.51137 1.94026 1.1842 +vn 0.961476 -0.0383498 0.2722 +v 1.4871 1.70913 1.16754 +vn 0.949426 -0.191409 0.248903 +v 1.3701 1.4459 -0.835282 +vn 0.880576 -0.390304 -0.268793 +v 0.396543 5.48944 0.177743 +vn 0.396906 0.887878 -0.232677 +v 0.430629 5.47603 0.187377 +vn 0.426177 0.876254 -0.224838 +v 0.258802 5.51365 0.084987 +vn 0.284105 0.909694 -0.302888 +v 0.546485 5.42937 0.490906 +vn 0.572298 0.812195 0.113198 +v 0.924369 4.82209 0.784864 +vn 0.929337 0.294042 0.223319 +v 0.944899 4.48669 0.983783 +vn 0.882644 0.119145 0.454692 +v 0.972984 4.57457 0.875637 +vn 0.943749 0.18943 0.271025 +v 0.987973 4.46371 0.880988 +vn 0.958491 0.0788608 0.274 +v 0.96834 4.33979 0.941784 +vn 0.937624 -0.0727314 0.339958 +v 1.00585 4.38511 0.815951 +vn 0.981323 -0.0231696 0.190966 +v 0.938015 4.69347 0.889462 +vn 0.909987 0.283537 0.302539 +v 0.923301 4.68677 0.933666 +vn 0.884092 0.283792 0.371273 +v 0.978088 4.66945 0.738469 +vn 0.958022 0.25278 0.135262 +v 0.294456 3.93581 1.41021 +vn 0.203808 -0.638339 0.742284 +v 0.826594 1.10423 -1.11006 +vn 0.383351 -0.865499 -0.322419 +v 1.03316 1.00729 -0.390916 +vn 0.224048 -0.970839 -0.0852925 +v 1.05502 1.00126 -0.21209 +vn 0.210848 -0.976731 -0.0392294 +v 0.644469 0.960213 -0.300291 +vn 0.00150094 -0.999998 -0.0013954 +v 0.640748 0.960279 -0.350536 +vn 0.00181998 -0.999997 -0.00182082 +v 0.648151 0.960153 -0.249901 +vn -0.000529957 -0.999999 -0.000915498 +v 0.662131 0.960029 0.003646 +vn -0.00184224 -0.999998 3.08951e-05 +v 0.5027 0.960178 -0.154386 +vn -1.28706e-05 -1 5.93434e-07 +v 0.504919 0.960178 -0.102191 +vn -6.46395e-05 -1 -1.6274e-06 +v 0.507073 0.960178 -0.049953 +vn -2.55376e-05 -1 9.6448e-07 +v 0.508853 0.960178 0.002316 +vn -9.17791e-05 -1 -7.52281e-07 +v 0 0.960178 -0.351271 +vn 0 -1 0 +v 0 0.960178 -0.405183 +vn 0 -1 0 +v 0 0.960178 -0.244122 +vn 0 -1 0 +v 0 0.960178 -0.298619 +vn 0 -1 0 +v 0 0.960178 -0.136155 +vn 0 -1 0 +v 0 0.960178 -0.191014 +vn 0 -1 0 +v 0 0.960178 -0.027695 +vn 0 -1 0 +v 0 0.960178 -0.082744 +vn 0 -1 0 +v 0 0.960178 -0.457151 +vn 0 -1 6.57735e-05 +v 0 0.960171 -0.510307 +vn 0 -1 0.000719792 +v 0 0.960114 -0.561435 +vn 3.45112e-20 -0.999998 0.002017 +v 0 0.959953 -0.613613 +vn 6.90225e-20 -0.999989 0.00463313 +v 0 0.959669 -0.663676 +vn 0 -0.999978 0.00655864 +v 0 0.959269 -0.714702 +vn -1.38046e-19 -0.999986 0.00530669 +v 0 0.9602 -0.860502 +vn 2.76109e-19 -0.999688 -0.0249635 +v 1.05927 1.0141 0.491224 +vn 0.236568 -0.96857 0.0768603 +v 1.05553 1.03097 0.661709 +vn 0.274573 -0.953946 0.120814 +v 0.659777 0.961513 0.789288 +vn 0.0287938 -0.999561 0.00696418 +v 0.752509 0.960594 0.250779 +vn 0.0174306 -0.999829 0.00613638 +v 0.677486 0.960064 0.154908 +vn -0.00138758 -0.999998 0.00140895 +v 0.664501 0.960023 0.054383 +vn -0.00266144 -0.999996 0.000222967 +v 0.515366 0.96018 0.415116 +vn 0.0002298 -1 4.56619e-06 +v 0.672631 0.960334 0.306617 +vn 0.00386973 -0.99999 0.00202216 +v 0.350021 0.960178 0.42333 +vn 0 -1 0 +v 0.17726 0.960178 0.428725 +vn 0 -1 0 +v 0 0.960178 0.562412 +vn 0 -1 0 +v 0 0.960178 0.614727 +vn 0 -1 0 +v 0 0.960178 0.457959 +vn 0 -1 0 +v 0 0.960178 0.511183 +vn 0 -1 0 +v 0 0.960188 0.862997 +vn 0 -0.999999 0.00116654 +v 0 0.960178 0.664966 +vn 0 -1 0 +v 0 0.960178 0.716214 +vn 0 -1 0 +v 0 0.960178 0.146126 +vn 0 -1 0 +v 0 0.960178 0.083294 +vn 0 -1 0 +v 0 0.960178 0.025993 +vn 0 -1 0 +v 0.090031 0.960178 0.105655 +vn 0 -1 0 +v 0 1.01689 1.38902 +vn -1.25357e-06 -0.959291 0.282418 +v 0 1.06892 1.54065 +vn -1.66244e-06 -0.928141 0.37223 +v 0.846162 3.06664 0.926009 +vn 0.669683 0.727749 0.148004 +v 0.780034 3.13353 0.947759 +vn 0.766818 0.613311 0.189313 +v 0.859352 3.08106 0.751062 +vn 0.68567 0.726498 0.0453617 +v 0.799317 3.14889 0.760667 +vn 0.7975 0.601749 0.043498 +v 0.616212 3.09911 1.34334 +vn 0.582945 0.630405 0.512607 +v 0.522017 3.09288 -1.42904 +vn 0.645923 0.744686 0.168007 +v 0.708635 2.86943 -1.5078 +vn 0.836608 0.536196 -0.11217 +v 0.651507 2.95087 -1.54438 +vn 0.828661 0.556237 -0.0626165 +v 0.591584 3.0355 -1.5783 +vn 0.815018 0.579427 -0.00318672 +v 0.560975 3.0779 -1.60243 +vn 0.807182 0.589784 0.0247568 +v 0.529393 3.12289 -1.61935 +vn 0.797124 0.598908 0.0768301 +v 0.604345 3.11583 -0.153852 +vn 0.586548 0.751719 -0.301463 +v 0.959637 2.85734 -0.095499 +vn 0.590425 0.758653 -0.275398 +v 0.955058 2.93765 0.145523 +vn 0.569519 0.794128 -0.212152 +v 0.940563 2.89816 -0.020271 +vn 0.583538 0.771103 -0.254723 +v 0.663876 3.16219 0.085838 +vn 0.675123 0.681763 -0.281793 +v 0.695894 3.16757 0.181062 +vn 0.710404 0.656039 -0.254832 +v 0.581425 3.15018 -0.114989 +vn 0.598809 0.734632 -0.318974 +v 0.629483 3.15383 -0.010888 +vn 0.640089 0.707098 -0.300496 +v 0.863459 3.05906 0.3884 +vn 0.650215 0.747326 -0.136835 +v 0.881541 3.06377 0.569153 +vn 0.663841 0.745831 -0.0552411 +v 0.797559 3.12075 0.385566 +vn 0.72371 0.670091 -0.164994 +v 0.774114 3.14904 0.394091 +vn 0.742272 0.646836 -0.175032 +v 0.79793 3.15152 0.577288 +vn 0.780197 0.620209 -0.0814448 +v 0.93349 3.00559 0.396489 +vn 0.589274 0.798299 -0.124398 +v 0.94644 3.01308 0.575861 +vn 0.58424 0.810763 -0.036428 +v 0.969536 2.99548 0.545828 +vn 0.563681 0.824673 -0.04668 +v 0.520916 3.15578 -0.206871 +vn 0.547465 0.763942 -0.341578 +v 0.55261 3.10455 -0.2763 +vn 0.538935 0.783524 -0.309257 +v 1.62077 1.8756 0.455107 +vn 0.987454 -0.142662 0.0676957 +v 1.47795 1.34645 0.335915 +vn 0.935072 -0.353548 0.0253852 +v 1.47566 1.33881 0.156557 +vn 0.933922 -0.357308 -0.0110093 +v 1.50683 1.42598 0.164587 +vn 0.945683 -0.324871 -0.011924 +v 1.47409 1.35513 0.508656 +vn 0.934411 -0.351067 0.0602288 +v 1.50085 1.54092 -0.42475 +vn 0.924965 -0.352972 -0.140892 +v 1.44252 1.51251 -0.669221 +vn 0.905266 -0.367255 -0.213584 +v 1.63778 1.95848 0.009117 +vn 0.997605 -0.0618149 -0.031037 +v 0.708883 1.47182 1.85517 +vn 0.392665 -0.479699 0.784667 +v 0.117854 1.3107 1.8917 +vn 0.0491977 -0.656613 0.752622 +v 0 1.31261 1.89744 +vn 0 -0.651529 0.758624 +v 0.220069 1.31217 1.88291 +vn 0.0930954 -0.655681 0.749277 +v 0.744812 2.05207 1.96683 +vn 0.417703 0.0800735 0.905048 +v 0.101251 1.92152 2.11519 +vn 0.0531055 -0.0471392 0.997476 +v 0.100997 2.09366 2.11121 +vn 0.0551122 0.0944142 0.994006 +v 0.049525 2.10305 2.11253 +vn 0.0260835 0.101639 0.994479 +v 0.688661 2.62694 1.77719 +vn 0.409966 0.520098 0.749284 +v 0 2.58855 1.96656 +vn -5.92696e-06 0.441976 0.897027 +v 0 2.72581 1.89115 +vn -2.48613e-18 0.516794 0.85611 +v 0 2.28129 2.08137 +vn 1.79561e-18 0.244022 0.96977 +v 0 2.1145 2.11177 +vn -1.6576e-18 0.111306 0.993786 +v 0.470862 3.12172 1.44778 +vn 0.445586 0.623276 0.642636 +v 0.546237 3.10854 1.40234 +vn 0.515928 0.624854 0.585983 +v 0.540434 3.96981 -0.186131 +vn 0.556332 -0.606903 -0.567594 +v 0.491545 3.95935 -0.220616 +vn 0.519364 -0.615075 -0.593248 +v 0.632582 3.99268 -0.110817 +vn 0.623453 -0.58956 -0.513542 +v 0.587681 3.98093 -0.149467 +vn 0.590322 -0.600193 -0.539711 +v 0.715575 4.01766 -0.028764 +vn 0.685288 -0.566512 -0.457651 +v 0.675461 4.00494 -0.070503 +vn 0.654443 -0.580196 -0.484847 +v 0.787957 4.04413 0.057869 +vn 0.744726 -0.536181 -0.397357 +v 0.75336 4.03076 0.014123 +vn 0.714589 -0.553914 -0.427249 +v 0.44074 3.94972 -0.252549 +vn 0.480003 -0.619992 -0.620651 +v 0.388596 3.94088 -0.281778 +vn 0.436674 -0.626504 -0.645606 +v 0.334963 3.93303 -0.307898 +vn 0.389937 -0.629937 -0.671661 +v 0.280361 3.92613 -0.330799 +vn 0.338093 -0.635078 -0.694528 +v 0.224703 3.92041 -0.350032 +vn 0.281349 -0.637599 -0.717155 +v 0.168416 3.91559 -0.365363 +vn 0.219746 -0.641704 -0.734797 +v 0.111808 3.9106 -0.375272 +vn 0.153427 -0.643984 -0.749496 +v 0.055557 3.90385 -0.378427 +vn 0.0798837 -0.649375 -0.756261 +v 0.498361 4.276 -0.438136 +vn 0.528597 -0.332725 -0.780948 +v 0.490092 4.39489 -0.484566 +vn 0.528578 -0.218045 -0.820404 +v 0.43278 3.90067 1.33054 +vn 0.337222 -0.569964 0.749281 +v 0.578098 3.93447 1.26995 +vn 0.50494 -0.547178 0.667557 +v 0.949797 4.10907 0.788613 +vn 0.926233 -0.348804 0.14293 +v 0.991693 4.24973 0.804322 +vn 0.95932 -0.221935 0.174498 +v 0.935458 4.12634 0.33134 +vn 0.891047 -0.408517 -0.19786 +v 0.951019 4.13979 0.378209 +vn 0.907899 -0.386129 -0.16317 +v 0.897255 4.09901 0.238519 +vn 0.850709 -0.454282 -0.264429 +v 0.917852 4.11278 0.284831 +vn 0.871439 -0.432789 -0.230841 +v 0.848399 4.07143 0.147185 +vn 0.801405 -0.497725 -0.331694 +v 0.874414 4.08525 0.192663 +vn 0.826643 -0.477699 -0.29743 +v 0.819862 4.05773 0.102268 +vn 0.773168 -0.519428 -0.363876 +v 0.897169 3.97164 0.751951 +vn 0.908808 -0.403195 0.107247 +v 0.995919 4.21076 0.662618 +vn 0.961335 -0.273077 0.035547 +v 0.952965 4.75628 0.238071 +vn 0.965333 0.211045 -0.153596 +v 0.979557 4.72102 0.497583 +vn 0.971786 0.235863 0.000604318 +v 0.982769 4.65435 0.310362 +vn 0.977834 0.172279 -0.118998 +v 0.984229 4.68051 0.378224 +vn 0.977156 0.20028 -0.0710851 +v 0.92776 4.84205 0.738269 +vn 0.946272 0.274239 0.171353 +v 0.941892 4.80125 0.723739 +vn 0.950608 0.273812 0.146187 +v 0.965565 4.75955 0.609919 +vn 0.96378 0.257706 0.0686757 +v 0.730374 4.96972 -0.17612 +vn 0.786813 0.360147 -0.501219 +v 0.753635 3.20142 0.491526 +vn 0.850235 0.511716 -0.12348 +v 0.744421 3.2298 0.842104 +vn 0.896648 0.414617 0.155292 +v 0.768338 3.20387 0.674005 +vn 0.893869 0.447872 0.0202098 +v 0.765873 2.78562 -1.47384 +vn 0.846794 0.509501 -0.152804 +v 0.715816 2.5915 -1.86921 +vn 0.840554 0.304942 -0.447749 +v 0.53085 2.71796 -2.09593 +vn 0.761147 0.18671 -0.621123 +v 0.464575 3.15126 -1.95972 +vn 0.887901 0.343622 -0.305868 +v 0.394032 3.11834 -2.13041 +vn 0.794743 0.252022 -0.552148 +v 0.376984 3.07582 -2.16864 +vn 0.721426 0.209912 -0.65991 +v 0.494086 2.72883 -2.13452 +vn 0.702578 0.152403 -0.695096 +v 0.439911 2.87046 -2.15654 +vn 0.711938 0.152137 -0.685565 +v 0.3244 3.48993 -1.94926 +vn 0.884915 0.437745 -0.159076 +v 0.600214 5.40031 0.335303 +vn 0.611658 0.790078 -0.0406343 +v 0.547131 2.47813 -2.12538 +vn 0.630859 0.0560219 -0.773872 +v 0.535594 2.53019 -2.12936 +vn 0.628428 0.0957596 -0.771951 +v 0.530083 2.59076 -2.12564 +vn 0.659753 0.115587 -0.74254 +v 0.473382 2.56488 -2.172 +vn 0.556489 0.0582992 -0.828807 +v 0.139239 2.49968 -2.28068 +vn 0.105741 -0.0890368 -0.9904 +v 0 2.53306 -2.29057 +vn 4.46608e-06 -0.0896286 -0.995975 +v 0 2.58636 -2.29462 +vn -5.52332e-19 -0.0632034 -0.998001 +v 0 2.63994 -2.2978 +vn 1.10467e-18 -0.0569332 -0.998378 +v 0 2.69187 -2.30027 +vn 5.52311e-19 -0.0359603 -0.999353 +v 1.00471 4.52606 0.340777 +vn 0.987614 0.086179 -0.131114 +v 0 3.80603 -0.29308 +vn -2.76342e-18 -0.677283 -0.735723 +v 0 3.89702 -0.375486 +vn -1.05055e-17 -0.652822 -0.757511 +v 0 4.97618 -0.635148 +vn 8.96575e-07 0.343065 -0.939312 +v 0.312436 4.89009 -0.583182 +vn 0.418855 0.236264 -0.876778 +v 0.212727 4.87725 -0.6274 +vn 0.304088 0.223844 -0.925972 +v 0.115409 4.87242 -0.653898 +vn 0.176674 0.213204 -0.960901 +v 0 4.87324 -0.664902 +vn 0 0.204786 -0.978807 +v 0.418732 5.17418 -0.361596 +vn 0.500758 0.567442 -0.653644 +v 0.470704 4.51977 -0.520701 +vn 0.523506 -0.103503 -0.845712 +v 0.443359 4.64741 -0.544466 +vn 0.515578 0.00850901 -0.8568 +v 0.411798 4.7737 -0.553538 +vn 0.50455 0.125373 -0.854231 +v 0.90378 4.8392 0.835614 +vn 0.902117 0.311665 0.298411 +v 0.842498 5.118 0.34587 +vn 0.879455 0.46846 -0.08429 +v 0.290008 3.08803 -2.23607 +vn 0.494531 0.128624 -0.85959 +v 0.303727 3.02088 -2.23765 +vn 0.481833 0.120558 -0.86793 +v 0.313432 2.96311 -2.23913 +vn 0.470037 0.0799615 -0.879017 +v 0.319478 2.9083 -2.24085 +vn 0.454725 0.0783057 -0.887183 +v 0.128865 3.11637 -2.28663 +vn 0.157862 0.0934537 -0.983029 +v 0 3.09986 -2.2964 +vn 5.52395e-19 0.0689793 -0.997618 +v 0 3.15261 -2.29232 +vn 3.3142e-18 0.0874884 -0.996166 +v 0.037041 3.14249 -2.29248 +vn 0.0371439 0.0887384 -0.995362 +v 0 2.86447 -2.30386 +vn 5.52339e-19 -0.00435615 -0.999991 +v 0 2.9216 -2.30354 +vn 0 0.0178136 -0.999841 +v 0 2.74902 -2.30217 +vn -5.52329e-19 -0.0311503 -0.999515 +v 0 2.80432 -2.3034 +vn 0 -0.0106511 -0.999943 +v 0.108228 3.34087 -2.26226 +vn 0.161218 0.197677 -0.966919 +v 0.031108 3.36536 -2.2643 +vn 0.0386231 0.199111 -0.979216 +v 0 3.32712 -2.27179 +vn 0 0.163838 -0.986487 +v 0 3.37423 -2.26313 +vn -2.21008e-18 0.201591 -0.97947 +v 0.231603 3.22442 -2.24479 +vn 0.418594 0.125879 -0.899407 +v 1.48893 1.49198 0.850123 +vn 0.947477 -0.295253 0.122938 +v 1.35663 1.95636 -1.20601 +vn 0.894888 0.144265 -0.422331 +v 1.44156 2.05106 -0.941816 +vn 0.898203 0.303882 -0.317627 +v 1.49781 2.06537 -0.764068 +vn 0.908153 0.314655 -0.276133 +v 1.41619 2.12455 -0.924908 +vn 0.856963 0.418996 -0.300096 +v 1.46837 2.14305 -0.747583 +vn 0.856244 0.438797 -0.272587 +v 1.42622 1.95163 -1.04465 +vn 0.917203 0.129741 -0.376704 +v 1.42573 1.87538 -1.05535 +vn 0.924692 -0.0242121 -0.379945 +v 1.49044 1.95462 -0.868647 +vn 0.936365 0.123613 -0.328542 +v 1.49021 1.86929 -0.875881 +vn 0.943959 -0.0547704 -0.325488 +v 1.48995 1.83598 -0.867525 +vn 0.944873 -0.121199 -0.304181 +v 1.58109 2.00826 -0.50278 +vn 0.966943 0.137854 -0.214517 +v 1.54328 1.97052 -0.687296 +vn 0.954734 0.122344 -0.271135 +v 1.58433 1.90512 -0.505874 +vn 0.981046 -0.0513264 -0.186855 +v 1.54413 1.88104 -0.690504 +vn 0.966295 -0.0551201 -0.251468 +v 1.56934 2.13957 -0.400964 +vn 0.92355 0.334918 -0.186776 +v 1.53234 2.22659 -0.389928 +vn 0.861013 0.45878 -0.219494 +v 1.54143 2.09284 -0.582655 +vn 0.917468 0.323969 -0.230859 +v 1.50801 2.17615 -0.568636 +vn 0.856205 0.453814 -0.246912 +v 1.60833 2.04562 -0.316853 +vn 0.976211 0.148729 -0.157772 +v 1.55932 2.36716 0.420093 +vn 0.911223 0.410944 0.0282419 +v 1.42841 2.35093 -0.453316 +vn 0.749316 0.601167 -0.277712 +v 1.4084 2.29828 -0.626154 +vn 0.762856 0.584641 -0.276127 +v 1.48363 2.26916 -0.467305 +vn 0.801243 0.534834 -0.268257 +v 1.45786 2.21945 -0.644405 +vn 0.8069 0.519411 -0.281291 +v 1.36065 2.46823 -0.358729 +vn 0.689874 0.67138 -0.270782 +v 1.35119 2.40999 -0.522518 +vn 0.703397 0.66068 -0.262174 +v 1.29391 2.47059 -0.511993 +vn 0.647888 0.71436 -0.264444 +v 1.36273 2.53112 -0.198259 +vn 0.693177 0.673442 -0.256867 +v 1.35715 2.59428 -0.041237 +vn 0.709608 0.671098 -0.214674 +v 1.29973 2.59218 -0.196661 +vn 0.636056 0.719797 -0.278074 +v 1.29617 2.33938 -0.861394 +vn 0.752498 0.616159 -0.232581 +v 1.32778 2.36813 -0.691221 +vn 0.72741 0.642234 -0.241682 +v 1.27431 2.42801 -0.678648 +vn 0.672969 0.702758 -0.230745 +v 1.33097 2.24154 -0.972958 +vn 0.800983 0.525374 -0.287069 +v 1.36629 2.16954 -0.996038 +vn 0.828304 0.463751 -0.314401 +v 1.37321 2.26526 -0.80084 +vn 0.780993 0.56182 -0.27278 +v 1.41897 2.18421 -0.824007 +vn 0.817487 0.496763 -0.291447 +v 0.994324 2.68375 -0.486373 +vn 0.653272 0.718013 -0.240194 +v 0.986528 2.64076 -0.656015 +vn 0.689154 0.701898 -0.180018 +v 1.42824 1.69632 -0.957829 +vn 0.913756 -0.273473 -0.300438 +v 1.40137 1.60626 -0.946055 +vn 0.896764 -0.333465 -0.290887 +v 1.37438 1.52716 -0.932845 +vn 0.883976 -0.369688 -0.286213 +v 1.42441 1.58894 -0.851779 +vn 0.898278 -0.345989 -0.270901 +v 1.41687 1.56588 -0.846774 +vn 0.895591 -0.35569 -0.267211 +v 1.41199 1.49186 -0.756797 +vn 0.895252 -0.375771 -0.239418 +v 1.41132 1.33338 -0.471454 +vn 0.907618 -0.381713 -0.174715 +v 1.44142 1.41143 -0.477777 +vn 0.917315 -0.361588 -0.166697 +v 1.37956 1.349 -0.647391 +vn 0.88846 -0.398998 -0.226802 +v 1.40879 1.42422 -0.65804 +vn 0.900299 -0.377709 -0.216328 +v 1.44901 1.32814 -0.20487 +vn 0.923687 -0.370134 -0.0990065 +v 1.4663 1.33278 -0.024774 +vn 0.930377 -0.362564 -0.0542764 +v 1.47913 1.40853 -0.208309 +vn 0.934419 -0.342492 -0.0977749 +v 1.49748 1.41804 -0.02494 +vn 0.94114 -0.333833 -0.0530135 +v 1.3836 1.41678 -0.744344 +vn 0.890662 -0.383985 -0.243467 +v 0.311884 5.52685 0.189025 +vn 0.329731 0.913347 -0.238903 +v 0.333314 5.49421 0.104572 +vn 0.341009 0.89466 -0.288612 +v 0.420377 5.50313 0.293655 +vn 0.431449 0.8904 -0.14505 +v 0.462914 5.46573 0.211198 +vn 0.451934 0.868361 -0.204215 +v 0.19041 5.51128 0.025809 +vn 0.209918 0.915785 -0.34245 +v 0.039142 5.51781 -0.013904 +vn 0.0457122 0.928149 -0.36939 +v 0.574319 5.41957 0.349938 +vn 0.56429 0.825389 -0.0175811 +v 0 5.67859 0.701356 +vn -2.76226e-19 0.996795 0.0799946 +v 0 5.63534 0.342003 +vn -3.34935e-06 0.959033 -0.283296 +v 0.815962 4.09336 1.12747 +vn 0.793281 -0.360598 0.490586 +v 0.709744 4.03063 1.22438 +vn 0.673006 -0.459144 0.57987 +v 0.584706 3.98014 1.30321 +vn 0.511368 -0.55389 0.657045 +v 0.253002 3.32442 -2.20838 +vn 0.600295 0.268987 -0.753188 +v 0.557078 5.01022 1.17102 +vn 0.489954 0.566008 0.663008 +v -0.797062 1.12203 -1.19156 +vn -0.412208 -0.845435 -0.339594 +v -0.825265 1.07662 -1.03323 +vn -0.355198 -0.886632 -0.296173 +v -0.84029 1.00032 -0.738665 +vn -0.247475 -0.952362 -0.17822 +v -0.698216 1.0124 -0.944315 +vn -0.212229 -0.952696 -0.217551 +v -0.672393 1.04774 -1.11392 +vn -0.278461 -0.926835 -0.251867 +v -0.573517 0.994869 -0.970013 +vn -0.145277 -0.975395 -0.165829 +v -0.725771 0.981626 -0.764163 +vn -0.142169 -0.979189 -0.144834 +v -0.596225 0.97191 -0.792808 +vn -0.0811289 -0.991099 -0.105553 +v -0.652458 1.08831 -1.26929 +vn -0.336801 -0.889611 -0.308475 +v -0.552365 1.02346 -1.14068 +vn -0.203606 -0.956555 -0.208677 +v -0.642493 1.13862 -1.40674 +vn -0.384067 -0.841305 -0.380393 +v -0.536354 1.05949 -1.29765 +vn -0.252922 -0.926586 -0.278333 +v -0.286802 0.994719 -1.1823 +vn -0.0795308 -0.984141 -0.15856 +v -0.410497 1.0385 -1.32176 +vn -0.167088 -0.952661 -0.254005 +v -0.277459 1.02515 -1.34024 +vn -0.0999472 -0.966106 -0.238014 +v -0.422475 1.00578 -1.16329 +vn -0.132265 -0.975339 -0.17669 +v -0.40512 1.084 -1.46553 +vn -0.201885 -0.911555 -0.358204 +v -0.274131 1.06909 -1.48614 +vn -0.123082 -0.929047 -0.348887 +v -0.528774 1.10714 -1.43854 +vn -0.295774 -0.881265 -0.368632 +v -0.296463 0.973807 -1.00804 +vn -0.0498127 -0.994398 -0.0932236 +v -0.329337 0.979907 -1.04884 +vn -0.0666564 -0.991382 -0.112774 +v -0.30887 0.962244 -0.822931 +vn -0.0204244 -0.99919 -0.0346794 +v -0.342978 0.965124 -0.867022 +vn -0.0326835 -0.997864 -0.0565547 +v -0.407959 0.974936 -0.951457 +vn -0.0680441 -0.992535 -0.101209 +v -0.440021 0.982253 -0.99334 +vn -0.0952658 -0.987433 -0.1261 +v -0.456837 0.965727 -0.808153 +vn -0.0380637 -0.997505 -0.0594505 +v -0.487877 0.97035 -0.850478 +vn -0.0594752 -0.994182 -0.0898007 +v -0.252598 0.986544 -1.14216 +vn -0.0581525 -0.989284 -0.133925 +v -0.184373 0.974235 -1.06087 +vn -0.0311217 -0.994856 -0.0963966 +v -0.143588 0.98851 -1.19196 +vn -0.0323724 -0.98932 -0.142121 +v -0.108558 0.982212 -1.15196 +vn -0.02119 -0.992058 -0.123985 +v -0.149031 0.969584 -1.01841 +vn -0.0215467 -0.996612 -0.0793723 +v -0.262665 0.968828 -0.965968 +vn -0.0355599 -0.996551 -0.0749754 +v -0.192196 0.962155 -0.878046 +vn -0.0151322 -0.999136 -0.038704 +v -0.112845 0.965877 -0.975158 +vn -0.013854 -0.997879 -0.0635983 +v -0.038274 0.961385 -0.897069 +vn -0.00376024 -0.999326 -0.0365159 +v -0.155483 0.960373 -0.832328 +vn -0.0088759 -0.999721 -0.0219068 +v -0.215014 0.990818 -1.18718 +vn -0.0521597 -0.987766 -0.14696 +v -0.177952 0.995828 -1.23107 +vn -0.0458586 -0.985648 -0.162465 +v -0.141083 1.01825 -1.35393 +vn -0.0494877 -0.97163 -0.231272 +v -0.105379 1.00852 -1.31592 +vn -0.030247 -0.979122 -0.20101 +v -0.140408 1.06185 -1.50166 +vn -0.0640668 -0.934887 -0.349116 +v -0.103858 1.04757 -1.46669 +vn -0.0404539 -0.949495 -0.311163 +v -0.893126 0.976156 -0.371679 +vn -0.16556 -0.984878 -0.0510348 +v -0.868229 0.983399 -0.555251 +vn -0.201463 -0.975738 -0.0857154 +v -0.911235 0.972448 -0.182918 +vn -0.143559 -0.989343 -0.0243101 +v -0.923385 0.971819 0.007151 +vn -0.139296 -0.990245 -0.00326538 +v -0.947983 0.975869 -0.03897 +vn -0.164415 -0.986356 -0.00832395 +v -1.03063 1.00042 -0.3038 +vn -0.21687 -0.974527 -0.0571303 +v -1.0442 0.996225 -0.123994 +vn -0.208609 -0.977766 -0.0213635 +v -0.868792 0.970577 -0.325891 +vn -0.130819 -0.990842 -0.033453 +v -0.817383 0.963621 -0.23665 +vn -0.0684741 -0.99756 -0.0135925 +v -0.772383 0.9631 -0.385352 +vn -0.0593792 -0.998077 -0.017776 +v -0.744321 0.961339 -0.340421 +vn -0.0308242 -0.999477 -0.00976897 +v -0.68084 0.960134 -0.247626 +vn -0.00220547 -0.999996 -0.0020004 +v -0.789292 0.961618 -0.190561 +vn -0.0428058 -0.999054 -0.00769662 +v -0.885571 0.968299 -0.135955 +vn -0.113628 -0.993424 -0.0140536 +v -0.831032 0.962839 -0.042699 +vn -0.0618962 -0.998075 -0.00382442 +v -0.759665 0.960496 -0.143457 +vn -0.0207148 -0.999778 -0.00376932 +v -0.696103 0.959924 -0.046312 +vn 0.00116513 -0.999999 -0.000330655 +v -0.801477 0.961255 0.005338 +vn -0.039976 -0.9992 -0.00119452 +v -0.798897 0.966052 -0.42925 +vn -0.0943633 -0.995076 -0.0303227 +v -0.752568 0.967575 -0.579707 +vn -0.0977995 -0.993523 -0.0578478 +v -0.724788 0.963635 -0.534646 +vn -0.0555174 -0.997976 -0.0309971 +v -0.706283 0.960902 -0.393174 +vn -0.0202031 -0.999766 -0.00773069 +v -0.66742 0.960729 -0.446316 +vn -0.0113612 -0.999912 -0.00690047 +v -0.647493 0.964067 -0.640888 +vn -0.0392373 -0.998291 -0.0433143 +v -0.330771 0.960178 -0.422018 +vn -9.16528e-06 -1 -2.31285e-05 +v -0.368222 0.960182 -0.471698 +vn -0.000128193 -1 -0.00035553 +v -0.328455 0.96018 -0.473871 +vn -4.71841e-05 -1 -0.000187208 +v -0.404547 0.960229 -0.520346 +vn -0.000741211 -0.999999 -0.00151684 +v -0.439776 0.960397 -0.56794 +vn -0.00244119 -0.999988 -0.00421236 +v -0.32594 0.960197 -0.525275 +vn -0.000487345 -1 -0.000468976 +v -0.323403 0.960224 -0.576299 +vn -0.0011875 -0.999999 -0.000535968 +v -0.488268 0.960179 -0.412905 +vn -0.000187275 -1 -0.000106414 +v -0.522747 0.960196 -0.460785 +vn -0.000888537 -0.999999 -0.00139216 +v -0.484946 0.960187 -0.463868 +vn -0.000204322 -1 -0.000925305 +v -0.587787 0.960916 -0.553127 +vn -0.00962109 -0.999883 -0.0119096 +v -0.48133 0.960271 -0.514427 +vn -0.00131549 -0.999995 -0.00292021 +v -0.477686 0.960467 -0.564652 +vn -0.00265652 -0.999981 -0.00564092 +v -0.32055 0.960246 -0.628752 +vn -0.00308219 -0.999995 -0.00098046 +v -0.356437 0.960471 -0.673849 +vn -0.00679942 -0.999964 -0.0051381 +v -0.314937 0.960458 -0.726062 +vn -0.00926128 -0.999909 -0.00978275 +v -0.424563 0.96281 -0.764597 +vn -0.0235316 -0.999144 -0.0340235 +v -0.473588 0.960827 -0.616335 +vn -0.00631805 -0.999931 -0.0098927 +v -0.506488 0.961656 -0.6596 +vn -0.0136127 -0.999727 -0.0189765 +v -0.56811 0.966401 -0.746601 +vn -0.0469347 -0.996801 -0.0646946 +v -0.333071 0.960178 -0.369861 +vn 0 -1 0 +v -0.335166 0.960178 -0.317355 +vn 0 -1 0 +v -0.337236 0.960178 -0.264631 +vn 0 -1 0 +v -0.339083 0.960178 -0.211659 +vn 0 -1 0 +v -0.377995 0.960178 -0.26328 +vn 0 -1 0 +v -0.415839 0.960178 -0.314076 +vn -3.72103e-06 -1 3.85451e-09 +v -0.452651 0.960178 -0.36399 +vn -5.34281e-06 -1 -8.02923e-07 +v -0.340894 0.960178 -0.158545 +vn 0 -1 0 +v -0.342465 0.960178 -0.105286 +vn 0 -1 0 +v -0.343991 0.960178 -0.051967 +vn 0 -1 0 +v -0.345261 0.960178 0.001394 +vn 0 -1 0 +v -0.385494 0.960178 -0.051531 +vn 0 -1 0 +v -0.424733 0.960178 -0.103883 +vn 0 -1 0 +v -0.463006 0.960178 -0.155564 +vn 0 -1 0 +v -0.491564 0.960178 -0.361675 +vn -5.26121e-05 -1 -3.33544e-06 +v -0.494554 0.960179 -0.310133 +vn -5.68764e-05 -1 -1.05551e-05 +v -0.497507 0.960178 -0.258404 +vn -1.34591e-05 -1 -1.04096e-05 +v -0.50013 0.960178 -0.206455 +vn 1.86352e-05 -1 -5.67576e-06 +v -0.536158 0.960179 -0.256478 +vn -3.34249e-05 -1 -8.54904e-05 +v -0.570905 0.960189 -0.305532 +vn -0.000300146 -1 -0.000291495 +v -0.604456 0.960237 -0.353578 +vn -0.00126918 -0.999999 -0.00107695 +v -0.651395 0.960117 -0.199334 +vn 0.000423113 -1 -0.000725875 +v -0.617682 0.960141 -0.150242 +vn 0.00118149 -0.999999 -0.000307628 +v -0.654582 0.960078 -0.148676 +vn 0.00198554 -0.999998 -0.000525403 +v -0.582593 0.960163 -0.100204 +vn 0.00075042 -1 -7.28771e-05 +v -0.546344 0.960176 -0.049324 +vn 0.000216967 -1 -1.98329e-05 +v -0.659964 0.960035 -0.047146 +vn 0.00263922 -0.999997 -0.000101098 +v -0.292338 0.960178 -0.371417 +vn 0 -1 0 +v -0.252893 0.960178 -0.319953 +vn 0 -1 0 +v -0.21256 0.960178 -0.267761 +vn 0 -1 0 +v -0.166991 0.960178 -0.427836 +vn -4.20287e-06 -1 1.86535e-05 +v -0.126209 0.960178 -0.376361 +vn 0 -1 0 +v -0.16819 0.960178 -0.37497 +vn 0 -1 0 +v -0.084679 0.960178 -0.328021 +vn 0 -1 0 +v -0.042574 0.960178 -0.285151 +vn 0 -1 0 +v -0.169277 0.960178 -0.321998 +vn 0 -1 0 +v -0.170364 0.960178 -0.268523 +vn 0 -1 0 +v -0.299258 0.960178 -0.159336 +vn 0 -1 0 +v -0.258498 0.960178 -0.106401 +vn 0 -1 0 +v -0.216946 0.960178 -0.05299 +vn 0 -1 0 +v -0.171329 0.960178 -0.215051 +vn 0 -1 0 +v -0.12933 0.960178 -0.162192 +vn 0 -1 0 +v -0.172287 0.960178 -0.161155 +vn 0 -1 0 +v -0.08667 0.960178 -0.112799 +vn 0 -1 0 +v -0.043525 0.960178 -0.069192 +vn 0 -1 0 +v -0.173113 0.960178 -0.107372 +vn 0 -1 0 +v -0.173929 0.960178 -0.053248 +vn 0 -1 0 +v -0.283799 0.96018 -0.578517 +vn -0.00120029 -0.999999 0.000288277 +v -0.245842 0.960172 -0.529183 +vn -0.000341848 -1 0.000343215 +v -0.206908 0.960177 -0.478897 +vn -5.62507e-05 -1 0.000141107 +v -0.27367 0.960619 -0.777581 +vn -0.0122619 -0.999792 -0.0163272 +v -0.200094 0.959772 -0.683371 +vn -0.00286305 -0.999993 0.00257367 +v -0.165793 0.960176 -0.480113 +vn -1.65796e-05 -1 0.000229547 +v -0.164483 0.960154 -0.532175 +vn -0.000189629 -1 0.00088886 +v -0.163164 0.960083 -0.583572 +vn -0.00046971 -0.999997 0.00220366 +v -0.161724 0.959927 -0.634643 +vn -0.00121889 -0.999991 0.00401207 +v -0.122389 0.960061 -0.585261 +vn -0.000410697 -0.999997 0.0026118 +v -0.082216 0.96014 -0.538649 +vn -4.40424e-05 -0.999999 0.0013168 +v -0.041381 0.960173 -0.497123 +vn 4.10106e-05 -1 0.000471742 +v -0.160262 0.959667 -0.684963 +vn -0.00221399 -0.99999 0.00385935 +v -0.158629 0.959528 -0.736789 +vn -0.00401324 -0.99999 -0.00186629 +v -0.117778 0.959516 -0.785878 +vn -0.0049049 -0.999956 -0.00801686 +v -0.03992 0.959389 -0.702006 +vn -0.000897933 -0.999984 0.00566296 +v -0.933004 0.979265 0.379347 +vn -0.177142 -0.983462 0.0377336 +v -0.933091 0.976422 0.287688 +vn -0.162046 -0.986466 0.0250206 +v -0.945954 0.976437 0.194408 +vn -0.164983 -0.986123 0.0185147 +v -1.0623 1.00413 0.316416 +vn -0.218995 -0.97485 0.0413467 +v -0.964666 0.978963 0.145918 +vn -0.178616 -0.983844 0.0121473 +v -1.00437 0.986076 0.055413 +vn -0.20107 -0.979576 0.00114935 +v -1.05579 0.997087 0.055145 +vn -0.212358 -0.977189 0.0025901 +v -0.929363 0.98732 0.562298 +vn -0.221767 -0.972994 0.0640524 +v -1.07481 1.02577 0.573524 +vn -0.245874 -0.963414 0.106673 +v -0.809881 0.964221 0.3913 +vn -0.0701547 -0.997444 0.0135384 +v -0.841681 0.967751 0.435184 +vn -0.106467 -0.994095 0.0209831 +v -0.900837 0.978985 0.519474 +vn -0.184368 -0.981844 0.0446142 +v -0.669946 0.960499 0.404224 +vn -0.00711393 -0.999973 0.00197249 +v -0.705984 0.960936 0.450163 +vn -0.0149287 -0.99988 0.0041976 +v -0.774293 0.963864 0.53834 +vn -0.0620363 -0.997979 0.0137548 +v -0.806328 0.967148 0.580564 +vn -0.103682 -0.994356 0.0225068 +v -0.836857 0.972186 0.621558 +vn -0.153519 -0.987479 0.0362868 +v -0.918552 0.997907 0.737508 +vn -0.277557 -0.956613 0.0886195 +v -0.666912 0.960912 0.599964 +vn -0.0156816 -0.999872 0.00306767 +v -0.7018 0.961772 0.643014 +vn -0.0290059 -0.999556 0.00674628 +v -0.767454 0.966434 0.725194 +vn -0.0995641 -0.994734 0.0243064 +v -0.90382 0.973163 0.334498 +vn -0.143745 -0.98927 0.0261203 +v -0.850931 0.965331 0.244892 +vn -0.0865124 -0.996151 0.0141212 +v -0.897401 0.968423 0.054145 +vn -0.116034 -0.993245 0.000619076 +v -0.848815 0.964157 0.14994 +vn -0.0772316 -0.99699 0.00684531 +v -0.776973 0.962033 0.346226 +vn -0.0393735 -0.999185 0.00891529 +v -0.712898 0.960299 0.252847 +vn -0.00527829 -0.99998 0.00351461 +v -0.688125 0.960147 0.204437 +vn -0.00163219 -0.999997 0.00193561 +v -0.679457 0.960235 0.254539 +vn -0.0013435 -0.999997 0.00203118 +v -0.825363 0.962917 0.198649 +vn -0.0614041 -0.998079 0.00823431 +v -0.770759 0.960384 0.05427 +vn -0.0206445 -0.999787 0.000429466 +v -0.750463 0.960177 0.152835 +vn -0.0119949 -0.999926 0.00225972 +v -0.710888 0.960024 0.154026 +vn -0.00173734 -0.999996 0.00231093 +v -0.353219 0.960178 0.318764 +vn 0 -1 0 +v -0.350433 0.960178 0.371209 +vn 0 -1 0 +v -0.436913 0.960178 0.315952 +vn -3.42223e-06 -1 7.12587e-08 +v -0.47529 0.960178 0.366032 +vn -8.16187e-06 -1 5.52295e-06 +v -0.37165 0.960178 0.213326 +vn 0 -1 0 +v -0.361204 0.960178 0.266115 +vn 0 -1 0 +v -0.403184 0.960178 0.265001 +vn 0 -1 0 +v -0.518353 0.960179 0.312638 +vn -0.000122374 -1 1.63976e-05 +v -0.515793 0.960178 0.364023 +vn -7.50938e-05 -1 1.19597e-05 +v -0.597088 0.960206 0.30885 +vn -0.000972265 -0.999999 0.000384807 +v -0.629766 0.960282 0.357315 +vn -0.00264346 -0.999996 0.000975141 +v -0.535473 0.960178 0.209434 +vn 2.09676e-05 -1 1.59898e-05 +v -0.525824 0.960178 0.261076 +vn -2.54607e-05 -1 1.38547e-05 +v -0.565389 0.96018 0.259566 +vn -0.000170684 -1 0.000189459 +v -0.401791 0.960178 0.16023 +vn 0 -1 0 +v -0.359926 0.960178 0.1608 +vn 0 -1 0 +v -0.433976 0.960178 0.107302 +vn 0 -1 0 +v -0.470651 0.960178 0.054594 +vn 0 -1 0 +v -0.350735 0.960178 0.107913 +vn 0 -1 0 +v -0.346797 0.960178 0.054728 +vn 0 -1 0 +v -0.563612 0.960176 0.157453 +vn 0.000186347 -1 0.000111923 +v -0.52413 0.960178 0.158225 +vn 2.48824e-05 -1 4.88551e-06 +v -0.593428 0.960157 0.105766 +vn 0.000853278 -1 0.000151357 +v -0.627224 0.960111 0.054415 +vn 0.00175919 -0.999998 0.000133217 +v -0.515022 0.960178 0.106579 +vn 8.88115e-05 -1 1.02394e-05 +v -0.510861 0.960178 0.054546 +vn 3.74795e-05 -1 2.18996e-06 +v -0.391988 0.960178 0.473141 +vn 0 -1 0 +v -0.433177 0.960178 0.521915 +vn -1.06909e-05 -1 -1.01129e-07 +v -0.470152 0.960178 0.569844 +vn -4.09193e-05 -1 5.1545e-06 +v -0.514589 0.960181 0.518366 +vn -0.000355527 -1 2.61235e-05 +v -0.515184 0.960178 0.46594 +vn -0.000114214 -1 9.92559e-06 +v -0.348316 0.960178 0.630139 +vn 0 -1 0 +v -0.389433 0.960178 0.675366 +vn 0 -1 0 +v -0.468993 0.960178 0.766268 +vn -8.10881e-05 -1 0.000113079 +v -0.513002 0.960182 0.616064 +vn -0.000506037 -1 1.25852e-05 +v -0.554917 0.960187 0.463137 +vn -0.000755222 -1 0.000141453 +v -0.63073 0.960461 0.555591 +vn -0.00716498 -0.999973 0.00147824 +v -0.551439 0.9602 0.661338 +vn -0.00164841 -0.999999 0.000247709 +v -0.624906 0.960702 0.747988 +vn -0.0136128 -0.999904 0.00272703 +v -0.349487 0.960178 0.526568 +vn 0 -1 0 +v -0.349884 0.960178 0.47516 +vn 0 -1 0 +v -0.263973 0.960178 0.53029 +vn 0 -1 0 +v -0.220882 0.960178 0.479884 +vn 0 -1 0 +v -0.349049 0.960178 0.577618 +vn 0 -1 0 +v -0.30652 0.960178 0.579758 +vn 0 -1 0 +v -0.176941 0.960178 0.53317 +vn 0 -1 0 +v -0.177174 0.960178 0.481039 +vn 0 -1 0 +v -0.088735 0.960178 0.539597 +vn 0 -1 0 +v -0.044456 0.960178 0.497987 +vn 0 -1 0 +v -0.176314 0.960178 0.635872 +vn 0 -1 0 +v -0.176701 0.960178 0.584663 +vn 0 -1 0 +v -0.132742 0.960178 0.58633 +vn 0 -1 0 +v -0.219369 0.960178 0.684787 +vn 0 -1 0 +v -0.346608 0.960178 0.727685 +vn -6.82875e-08 -1 1.85904e-05 +v -0.303416 0.960178 0.779423 +vn -1.20469e-05 -1 7.79785e-05 +v -0.17592 0.960178 0.686368 +vn 0 -1 0 +v -0.044083 0.960178 0.703462 +vn 0 -1 0 +v -0.131279 0.960178 0.787808 +vn -1.09006e-05 -1 6.5518e-05 +v -0.307811 0.960178 0.372605 +vn 0 -1 0 +v -0.267697 0.960178 0.321037 +vn 0 -1 0 +v -0.23266 0.960178 0.268762 +vn 0 -1 0 +v -0.200079 0.960178 0.215904 +vn 0 -1 0 +v -0.189051 0.960178 0.269423 +vn 0 -1 0 +v -0.180592 0.960178 0.32281 +vn 0 -1 0 +v -0.177668 0.960178 0.375841 +vn 0 -1 0 +v -0.304547 0.960178 0.054762 +vn 0 -1 0 +v -0.26571 0.960178 0.108397 +vn 0 -1 0 +v -0.231757 0.960178 0.162134 +vn 0 -1 0 +v -0.133523 0.960178 0.377073 +vn 0 -1 0 +v -0.090891 0.960178 0.327048 +vn 0 -1 0 +v -0.045268 0.960178 0.276267 +vn 0 -1 0 +v -0.188282 0.960178 0.162457 +vn 0 -1 0 +v -0.17914 0.960178 0.108664 +vn 0 -1 0 +v -0.175597 0.960178 0.05481 +vn 0 -1 0 +v -0.174604 0.960178 0.000653 +vn 0 -1 0 +v -0.131876 0.960178 0.054271 +vn 0 -1 0 +v -0.044977 0.960178 0.157301 +vn 0 -1 0 +v -0.065066 0.960178 0.216849 +vn 0 -1 0 +v -0.892744 1.04005 1.07127 +vn -0.405102 -0.878288 0.253975 +v -0.905587 1.013 0.909096 +vn -0.353789 -0.925725 0.133666 +v -0.884857 1.0938 1.22055 +vn -0.409864 -0.833542 0.370432 +v -0.77375 1.00505 1.10697 +vn -0.25774 -0.931331 0.257281 +v -0.638236 0.988457 1.14008 +vn -0.123648 -0.964198 0.234593 +v -0.76616 1.0612 1.26084 +vn -0.299775 -0.873221 0.384213 +v -0.886963 1.15867 1.35357 +vn -0.416457 -0.807875 0.417016 +v -0.631406 1.04055 1.29808 +vn -0.197903 -0.913036 0.356651 +v -0.767811 1.12715 1.39952 +vn -0.338093 -0.84525 0.413819 +v -0.785779 0.9794 0.940498 +vn -0.205597 -0.974049 0.0946488 +v -0.799729 0.971954 0.766593 +vn -0.161184 -0.985877 0.0454539 +v -0.648859 0.965753 0.974283 +vn -0.0693541 -0.995216 0.0688159 +v -0.693315 0.963035 0.829198 +vn -0.0531483 -0.998432 0.0175839 +v -0.332085 0.97708 1.187 +vn -0.0343423 -0.985893 0.163815 +v -0.490008 0.980944 1.16738 +vn -0.0627271 -0.979046 0.193739 +v -0.453201 0.973035 1.13059 +vn -0.038973 -0.989771 0.137236 +v -0.335097 0.966839 1.10076 +vn -0.0165412 -0.99635 0.0837398 +v -0.377398 0.964225 1.05266 +vn -0.012432 -0.998353 0.056009 +v -0.535037 0.96554 1.03288 +vn -0.0262799 -0.996877 0.0744634 +v -0.338331 0.96218 1.01162 +vn -0.00601927 -0.999397 0.0342032 +v -0.498795 0.962812 0.994043 +vn -0.0120365 -0.998929 0.0446781 +v -0.461588 0.961261 0.953801 +vn -0.00547032 -0.999712 0.0233698 +v -0.341468 0.96046 0.919666 +vn -0.00130215 -0.99995 0.00990426 +v -0.384317 0.960229 0.86924 +vn -0.000551264 -0.999995 0.00315553 +v -0.615446 0.962323 0.932153 +vn -0.030884 -0.998938 0.0341974 +v -0.544463 0.960281 0.85196 +vn -0.00364737 -0.999983 0.00457006 +v -0.370809 0.986098 1.22469 +vn -0.0522866 -0.975212 0.215007 +v -0.446849 1.01092 1.29559 +vn -0.0979645 -0.950996 0.293273 +v -0.328016 1.01712 1.35046 +vn -0.0719718 -0.954316 0.290003 +v -0.36741 1.03131 1.38458 +vn -0.0913166 -0.945504 0.312544 +v -0.446045 1.06339 1.44778 +vn -0.137486 -0.924214 0.356266 +v -0.484336 1.02609 1.32864 +vn -0.125651 -0.939932 0.317396 +v -0.526152 0.991915 1.20266 +vn -0.0941724 -0.9628 0.253274 +v -0.52159 1.04263 1.35997 +vn -0.155454 -0.927961 0.338708 +v -0.631257 1.10117 1.44421 +vn -0.25629 -0.884721 0.389339 +v -0.167649 0.974984 1.19914 +vn -0.0159368 -0.988878 0.147873 +v -0.208347 0.982767 1.239 +vn -0.0255866 -0.980749 0.193589 +v -0.329595 0.994643 1.27026 +vn -0.0549945 -0.968815 0.241605 +v -0.288439 1.00411 1.31477 +vn -0.0540326 -0.962521 0.265772 +v -0.04174 0.983664 1.25776 +vn -0.00738521 -0.980082 0.198454 +v -0.124473 1.00091 1.32626 +vn -0.0220228 -0.967016 0.25376 +v -0.165501 1.01244 1.36387 +vn -0.0323987 -0.960623 0.275959 +v -0.206348 1.02505 1.40049 +vn -0.0448379 -0.953517 0.297985 +v -0.327682 1.04207 1.42752 +vn -0.0851269 -0.941457 0.326209 +v -0.287921 1.0535 1.46935 +vn -0.0769269 -0.93611 0.343191 +v -0.041441 1.02619 1.41904 +vn -0.00932882 -0.954329 0.298612 +v -0.124435 1.04898 1.48212 +vn -0.0305033 -0.940929 0.337228 +v -0.292787 0.970611 1.14788 +vn -0.0209921 -0.993162 0.114842 +v -0.212275 0.963466 1.06559 +vn -0.00602572 -0.998909 0.0463014 +v -0.298455 0.961008 0.969248 +vn -0.00283599 -0.999837 0.0178146 +v -0.21633 0.960218 0.880632 +vn -0.000261051 -0.999997 0.00245617 +v -0.170993 0.961822 1.0226 +vn -0.00288832 -0.99959 0.028487 +v -0.126415 0.969407 1.15841 +vn -0.00951246 -0.994439 0.104879 +v -0.042539 0.963606 1.08464 +vn -0.00208779 -0.998856 0.0477794 +v -0.129011 0.960872 0.978829 +vn -0.0014637 -0.999885 0.0151071 +v -0.043411 0.960225 0.899903 +vn -0.000133553 -0.999996 0.00268815 +v -0.912945 3.01305 0.912156 +vn -0.594769 0.792142 0.136969 +v -0.922899 3.02745 0.742126 +vn -0.600561 0.798147 0.0478366 +v -0.874669 3.05713 0.835965 +vn -0.670916 0.731685 0.120453 +v -0.811384 3.12047 0.846683 +vn -0.774884 0.616005 0.141752 +v -0.882316 3.06462 0.658522 +vn -0.666519 0.745018 0.0264596 +v -0.820142 3.12758 0.664367 +vn -0.776298 0.629812 0.0264164 +v -0.858968 3.03579 1.00562 +vn -0.646548 0.733488 0.209694 +v -0.864935 2.94011 1.26066 +vn -0.565609 0.747344 0.348659 +v -0.787517 3.10063 1.01999 +vn -0.731435 0.640672 0.233543 +v -0.78377 3.11768 0.984374 +vn -0.746001 0.631945 0.210066 +v -0.75821 2.99727 1.31096 +vn -0.572011 0.711722 0.407744 +v -0.738715 3.0354 1.27212 +vn -0.604267 0.693936 0.391554 +v -0.698902 3.13021 1.17614 +vn -0.705494 0.606301 0.366984 +v -0.291586 3.37092 1.3527 +vn -0.330585 0.494398 0.803918 +v -0.304047 3.25861 1.42537 +vn -0.329311 0.571194 0.751859 +v -0.264156 3.29017 1.41817 +vn -0.289031 0.562171 0.774871 +v -0.148575 3.3782 1.3915 +vn -0.167285 0.523358 0.835531 +v -0.307967 3.14083 1.51917 +vn -0.299786 0.617421 0.727269 +v -0.268599 3.17739 1.50429 +vn -0.273816 0.60739 0.745723 +v -0.190707 3.23662 1.48201 +vn -0.206158 0.600961 0.772233 +v -0.142976 3.26623 1.47057 +vn -0.154369 0.592183 0.790879 +v -0.406709 3.27582 1.35819 +vn -0.446866 0.536052 0.716212 +v -0.423474 3.36204 1.28797 +vn -0.499341 0.451863 0.739242 +v -0.566623 3.2327 1.25562 +vn -0.657407 0.518023 0.547237 +v -0.447115 3.24171 1.35765 +vn -0.484911 0.549354 0.680494 +v -0.344692 3.22592 1.43173 +vn -0.364122 0.580841 0.728038 +v -0.428371 3.1574 1.44244 +vn -0.42217 0.607526 0.672818 +v -0.616212 3.09911 1.34334 +vn -0.582945 0.630403 0.512608 +v -0.573504 3.13627 1.34683 +vn -0.569499 0.604377 0.557135 +v -0.489026 3.20642 1.35564 +vn -0.516171 0.563783 0.644761 +v -0.283803 3.47996 1.29906 +vn -0.323902 0.357581 0.875913 +v -0.411677 3.47688 1.23895 +vn -0.496115 0.295858 0.816295 +v -0.535697 3.35639 1.1958 +vn -0.678558 0.382273 0.627237 +v -0.522509 3.47449 1.15547 +vn -0.674735 0.207341 0.708338 +v -0.1448 3.4825 1.33561 +vn -0.160595 0.397695 0.903354 +v -0.760129 2.82546 -1.14833 +vn -0.735535 0.677484 0.00207423 +v -0.839908 2.71688 -1.26886 +vn -0.813823 0.572616 -0.0990102 +v -0.853737 2.71972 -1.10021 +vn -0.769958 0.635382 -0.0587749 +v -0.74857 2.83524 -1.32716 +vn -0.796157 0.603917 -0.0376609 +v -0.831345 2.69219 -1.42087 +vn -0.848915 0.500015 -0.171257 +v -0.650162 2.93905 -1.19857 +vn -0.674581 0.73377 0.0807652 +v -0.52891 3.0462 -1.24676 +vn -0.577614 0.798859 0.167889 +v -0.639734 2.96866 -1.38418 +vn -0.741483 0.668854 0.0532645 +v -0.669079 2.93498 -1.41288 +vn -0.781333 0.6241 -0.00429321 +v -0.744583 2.832 -1.41135 +vn -0.82383 0.560684 -0.0832991 +v -0.719659 2.85994 -1.46741 +vn -0.82907 0.550892 -0.0957156 +v -0.582149 3.03302 -1.4119 +vn -0.709042 0.697954 0.100598 +v -0.522017 3.09288 -1.42904 +vn -0.645923 0.744686 0.168007 +v -0.550936 3.07343 -1.46799 +vn -0.710175 0.693603 0.12069 +v -0.623432 2.99001 -1.56317 +vn -0.823372 0.565751 -0.0445456 +v -0.65804 2.91323 -1.01185 +vn -0.624348 0.778965 0.0583467 +v -0.771717 2.8123 -0.965614 +vn -0.685817 0.72776 -0.00444838 +v -0.667778 2.89977 -0.828218 +vn -0.599769 0.799817 -0.0238668 +v -0.534089 3.00779 -1.05893 +vn -0.535211 0.835958 0.121343 +v -0.537837 2.98794 -0.873066 +vn -0.517484 0.855407 0.022147 +v -0.869508 2.71649 -0.921632 +vn -0.723959 0.687175 -0.0606074 +v -0.781701 2.81033 -0.784268 +vn -0.652007 0.75503 -0.0694001 +v -0.882972 2.72351 -0.742392 +vn -0.684809 0.719628 -0.114769 +v -0.793386 2.87118 -0.440652 +vn -0.608227 0.760159 -0.228512 +v -0.819693 2.84046 -0.472347 +vn -0.619041 0.754042 -0.219563 +v -0.891142 2.75248 -0.569501 +vn -0.653335 0.732585 -0.190977 +v -0.897504 2.79667 -0.404058 +vn -0.628082 0.738356 -0.245647 +v -0.789497 2.83006 -0.611244 +vn -0.627933 0.761486 -0.160744 +v -0.673873 2.94974 -0.485166 +vn -0.572598 0.790422 -0.217634 +v -0.703707 2.91955 -0.51599 +vn -0.586013 0.784481 -0.202923 +v -0.790938 2.84933 -0.524984 +vn -0.616694 0.76173 -0.198636 +v -0.761187 2.86019 -0.578288 +vn -0.613099 0.770486 -0.174529 +v -0.545793 3.0235 -0.532535 +vn -0.51356 0.831305 -0.212573 +v -0.576157 2.99667 -0.564122 +vn -0.530885 0.825552 -0.191378 +v -0.638928 2.94217 -0.624276 +vn -0.565602 0.810932 -0.149944 +v -0.669473 2.91505 -0.655183 +vn -0.582378 0.802328 -0.13079 +v -0.699269 2.88814 -0.686577 +vn -0.599977 0.791923 -0.113513 +v -0.540914 2.99462 -0.697525 +vn -0.512333 0.852167 -0.106424 +v -0.572795 2.97105 -0.732417 +vn -0.536336 0.840051 -0.0815929 +v -0.634984 2.92482 -0.796319 +vn -0.578419 0.814782 -0.0395068 +v -0.766229 2.9024 -0.408952 +vn -0.598993 0.764539 -0.23809 +v -0.710169 2.96619 -0.344655 +vn -0.583645 0.770369 -0.256689 +v -0.80073 2.92056 -0.271924 +vn -0.598083 0.757988 -0.260289 +v -0.775694 2.95178 -0.238413 +vn -0.594606 0.759849 -0.262818 +v -0.727106 3.01448 -0.167226 +vn -0.595459 0.758079 -0.265981 +v -0.681534 2.99903 -0.311378 +vn -0.577166 0.772092 -0.265994 +v -0.64348 2.98022 -0.454489 +vn -0.56079 0.794258 -0.233814 +v -0.581103 3.04206 -0.394168 +vn -0.535989 0.800371 -0.268556 +v -0.652585 3.03286 -0.276823 +vn -0.574332 0.770433 -0.276725 +v -0.590777 3.1053 -0.206402 +vn -0.567468 0.764124 -0.306749 +v -0.558883 3.1444 -0.169392 +vn -0.571643 0.752975 -0.325966 +v -0.552303 3.1266 -0.222836 +vn -0.551385 0.76962 -0.321963 +v -0.548842 3.07322 -0.365839 +vn -0.523828 0.802126 -0.286702 +v -0.873679 2.82834 -0.369469 +vn -0.618919 0.744346 -0.250775 +v -0.796395 2.89543 -0.35647 +vn -0.602006 0.758628 -0.249142 +v -0.825606 2.88953 -0.304725 +vn -0.603973 0.754081 -0.258029 +v -0.901308 2.85221 -0.236938 +vn -0.607085 0.747629 -0.269255 +v -0.807018 2.94516 -0.186592 +vn -0.59596 0.759022 -0.262141 +v -0.83712 2.93915 -0.135538 +vn -0.596289 0.759304 -0.26057 +v -0.918053 2.89988 -0.066017 +vn -0.588446 0.765079 -0.261505 +v -0.914808 2.9857 0.220731 +vn -0.584704 0.789102 -0.188253 +v -0.840405 3.00383 0.075127 +vn -0.60175 0.76668 -0.223827 +v -0.801488 3.07197 0.2054 +vn -0.644526 0.737942 -0.200072 +v -0.711033 3.16995 0.231193 +vn -0.728372 0.641112 -0.241765 +v -0.735459 3.10183 0.108126 +vn -0.659533 0.712321 -0.24003 +v -0.748098 3.07527 0.061914 +vn -0.635592 0.733479 -0.240898 +v -0.761655 3.04951 0.017843 +vn -0.617622 0.748002 -0.242972 +v -0.796104 2.99563 -0.062865 +vn -0.598683 0.760667 -0.250926 +v -0.671183 3.10638 -0.038455 +vn -0.624594 0.7298 -0.277984 +v -0.658511 3.13266 0.000742 +vn -0.637841 0.715132 -0.28591 +v -0.684077 3.07767 -0.086411 +vn -0.610632 0.743128 -0.273659 +v -0.826074 3.09899 0.422922 +vn -0.699232 0.704194 -0.123227 +v -0.852036 3.08144 0.474125 +vn -0.668961 0.738849 -0.0811914 +v -0.774114 3.14904 0.394091 +vn -0.742271 0.646839 -0.175023 +v -0.74842 3.17403 0.373241 +vn -0.774052 0.605895 -0.18367 +v -0.806541 3.12801 0.476681 +vn -0.746798 0.659312 -0.0871787 +v -0.901493 3.0136 0.305018 +vn -0.592149 0.79182 -0.1496 +v -0.916929 3.02815 0.482374 +vn -0.597156 0.79908 -0.0698229 +v -0.269343 3.18413 -1.28511 +vn -0.279215 0.912416 0.299225 +v -0.301465 3.18716 -1.32542 +vn -0.320942 0.894144 0.312253 +v -0.363622 3.19086 -1.40684 +vn -0.422541 0.847594 0.321003 +v -0.401304 3.12769 -1.27023 +vn -0.424228 0.871103 0.247409 +v -0.26582 3.25003 -1.44765 +vn -0.303632 0.858104 0.414083 +v -0.367911 3.28068 -1.59831 +vn -0.553967 0.70843 0.437318 +v -0.393482 3.19068 -1.44854 +vn -0.482831 0.817084 0.315036 +v -0.432332 3.12325 -1.31078 +vn -0.471775 0.847424 0.243517 +v -0.492528 3.10738 -1.3918 +vn -0.585569 0.78445 0.20432 +v -0.422397 3.18846 -1.49154 +vn -0.553283 0.780751 0.290356 +v -0.473236 3.18049 -1.5879 +vn -0.709484 0.668911 0.221788 +v -0.49665 3.16804 -1.63815 +vn -0.78426 0.607996 0.123598 +v -0.506735 3.1429 -1.58191 +vn -0.738274 0.653313 0.167731 +v -0.521749 3.10517 -1.48232 +vn -0.682176 0.71559 0.150226 +v -0.135033 3.21662 -1.29287 +vn -0.134046 0.936377 0.324393 +v -0.167976 3.22556 -1.33229 +vn -0.169052 0.921436 0.349825 +v -0.266849 3.21518 -1.36894 +vn -0.28702 0.889909 0.354516 +v -0.232007 3.24295 -1.40964 +vn -0.251819 0.882833 0.396476 +v -0.099297 3.2694 -1.41222 +vn -0.0965755 0.899781 0.42552 +v -0.134443 3.28266 -1.44795 +vn -0.134721 0.877169 0.460895 +v -0.247017 3.33792 -1.58057 +vn -0.31054 0.749712 0.584377 +v -0.123369 3.36723 -1.57461 +vn -0.122662 0.759872 0.638395 +v -0.236698 3.18068 -1.24494 +vn -0.241798 0.928936 0.280378 +v -0.170152 3.17321 -1.16461 +vn -0.173729 0.956336 0.23503 +v -0.27175 3.13676 -1.11084 +vn -0.277837 0.940373 0.196227 +v -0.238329 3.13839 -1.07181 +vn -0.246752 0.953614 0.172436 +v -0.170763 3.14188 -0.995114 +vn -0.182097 0.976245 0.117415 +v -0.136409 3.16946 -1.12447 +vn -0.140789 0.967724 0.209016 +v -0.101659 3.20772 -1.25323 +vn -0.0995181 0.949796 0.296619 +v -0.102464 3.16583 -1.08471 +vn -0.106529 0.97766 0.181196 +v -0.369675 3.13087 -1.22994 +vn -0.382833 0.891409 0.242549 +v -0.270854 3.15792 -1.19841 +vn -0.2762 0.928443 0.248408 +v -0.304831 3.1351 -1.15022 +vn -0.310072 0.925752 0.216423 +v -0.499013 3.05692 -1.20381 +vn -0.523884 0.831997 0.182557 +v -0.436781 3.07494 -1.12626 +vn -0.441162 0.879172 0.180092 +v -0.404777 3.08256 -1.08773 +vn -0.407096 0.897719 0.168446 +v -0.372273 3.08981 -1.04962 +vn -0.374499 0.914734 0.151699 +v -0.272256 3.12108 -1.0239 +vn -0.282213 0.949157 0.139485 +v -0.306103 3.10403 -0.975249 +vn -0.315105 0.943042 0.106678 +v -0.503184 3.02068 -1.01767 +vn -0.495769 0.860671 0.11601 +v -0.406556 3.05882 -0.910644 +vn -0.41029 0.910248 0.0557786 +v -0.273726 3.1308 -0.63388 +vn -0.314461 0.927249 -0.203283 +v -0.40815 3.06019 -0.745121 +vn -0.417497 0.905068 -0.0809224 +v -0.409791 3.08497 -0.588138 +vn -0.426532 0.880773 -0.205693 +v -0.273287 3.10985 -0.780672 +vn -0.300562 0.951539 -0.0650874 +v -0.137064 3.1598 -0.664706 +vn -0.170588 0.964038 -0.203788 +v -0.136997 3.14115 -0.804577 +vn -0.159518 0.985563 -0.0567364 +v -0.269271 3.1123 -0.939946 +vn -0.285421 0.955388 0.0759539 +v -0.133393 3.14435 -0.958228 +vn -0.14646 0.985457 0.0861593 +v -0.1364 3.19714 -0.536017 +vn -0.18633 0.92253 -0.337964 +v -0.273141 3.17123 -0.496107 +vn -0.337362 0.884766 -0.321521 +v -0.134292 3.25058 -0.416379 +vn -0.207087 0.869124 -0.449153 +v -0.51173 3.05083 -0.50739 +vn -0.496684 0.835835 -0.233849 +v -0.410845 3.12999 -0.435633 +vn -0.446178 0.841618 -0.304309 +v -0.269118 3.2287 -0.367365 +vn -0.369076 0.830341 -0.417513 +v -0.515482 3.10424 -0.340288 +vn -0.514057 0.801182 -0.306353 +v -0.408485 3.19426 -0.286141 +vn -0.484321 0.788573 -0.378928 +v -0.25045 3.38339 -0.155329 +vn -0.454162 0.631158 -0.628789 +v -0.386322 3.27841 -0.162223 +vn -0.528735 0.709027 -0.466605 +v -0.369309 3.36994 -0.064474 +vn -0.588206 0.574027 -0.569654 +v -0.259673 3.30074 -0.251161 +vn -0.406356 0.757081 -0.511569 +v -0.506561 3.25598 -0.036986 +vn -0.635682 0.656117 -0.406718 +v -0.477191 3.35967 0.053461 +vn -0.698075 0.497781 -0.514689 +v -0.427417 3.24701 -0.16317 +vn -0.542941 0.720028 -0.432175 +v -0.513836 3.1807 -0.164638 +vn -0.56408 0.74483 -0.356429 +v -0.544591 3.17377 -0.129032 +vn -0.586007 0.732259 -0.346976 +v -0.12631 3.39412 -0.214234 +vn -0.261861 0.680984 -0.683879 +v -0.130188 3.31738 -0.30634 +vn -0.231021 0.799737 -0.554121 +v -0.285278 3.50189 -0.05284 +vn -0.610229 0.208589 -0.764272 +v -0.475172 3.46248 0.119808 +vn -0.753301 0.224054 -0.618335 +v -0.389698 3.56592 0.040727 +vn -0.674345 -0.117627 -0.728988 +v -1.5936 1.72364 0.393928 +vn -0.970209 -0.238209 0.0441664 +v -1.58352 1.69307 0.440823 +vn -0.966651 -0.250733 0.0521462 +v -1.56196 1.63432 0.532244 +vn -0.960754 -0.269167 0.0670938 +v -1.58532 1.73769 0.575128 +vn -0.971165 -0.224225 0.0810006 +v -1.55708 1.59157 0.396338 +vn -0.957153 -0.286861 0.0396186 +v -1.54662 1.56395 0.441811 +vn -0.954878 -0.293208 0.0472874 +v -1.51568 1.49016 0.570668 +vn -0.950953 -0.301886 0.0674825 +v -1.55082 1.60661 0.576399 +vn -0.958387 -0.275675 0.0741479 +v -1.57434 1.70808 0.619812 +vn -0.967613 -0.236404 0.0885316 +v -1.55164 1.65239 0.705839 +vn -0.961773 -0.253927 0.102537 +v -1.57145 1.75494 0.747358 +vn -0.971335 -0.205473 0.11954 +v -1.53969 1.58032 0.619274 +vn -0.956081 -0.281634 0.0811938 +v -1.53964 1.62543 0.748927 +vn -0.959238 -0.260399 0.109794 +v -1.5952 1.71016 0.207063 +vn -0.968164 -0.250191 0.0079277 +v -1.58654 1.67983 0.255169 +vn -0.964907 -0.262094 0.0161595 +v -1.57584 1.65628 0.395667 +vn -0.963032 -0.266101 0.0419368 +v -1.56732 1.62026 0.349963 +vn -0.959364 -0.280355 0.0319783 +v -1.58907 1.69467 0.017612 +vn -0.964203 -0.263624 -0.0285493 +v -1.58221 1.66579 0.06612 +vn -0.961453 -0.274215 -0.0203519 +v -1.56632 1.60772 0.162517 +vn -0.956846 -0.290563 -0.00426049 +v -1.55753 1.57913 0.210153 +vn -0.95503 -0.296485 0.00380172 +v -1.54837 1.55124 0.257226 +vn -0.953136 -0.302308 0.0118742 +v -1.53822 1.53053 0.395671 +vn -0.952763 -0.301423 0.0372375 +v -1.52953 1.49854 0.349025 +vn -0.950505 -0.309489 0.0274917 +v -1.55066 1.56686 0.021472 +vn -0.950789 -0.30791 -0.0345135 +v -1.54332 1.53976 0.06924 +vn -0.94956 -0.312501 -0.0260397 +v -1.52764 1.48738 0.161873 +vn -0.948125 -0.317751 -0.00963379 +v -1.60299 1.75467 0.346476 +vn -0.973665 -0.225067 0.0363542 +v -1.61908 1.8168 0.250345 +vn -0.98105 -0.19279 0.0193024 +v -1.62327 1.87015 0.397267 +vn -0.987201 -0.151213 0.0506891 +v -1.62956 1.89603 0.343308 +vn -0.990831 -0.128725 0.0410394 +v -1.62449 1.86197 0.345593 +vn -0.986298 -0.15992 0.0405217 +v -1.63885 1.95373 0.244292 +vn -0.996605 -0.0802416 0.0184474 +v -1.62551 1.84729 0.201939 +vn -0.985026 -0.172101 0.0102606 +v -1.60304 1.74047 0.158677 +vn -0.97129 -0.237898 -0.000222612 +v -1.61579 1.79975 0.061537 +vn -0.978203 -0.206966 -0.0168314 +v -1.63069 1.87702 0.153523 +vn -0.98862 -0.150432 0.00110103 +v -1.63691 1.93293 0.057034 +vn -0.995226 -0.095706 -0.0191077 +v -1.62048 1.8281 0.012993 +vn -0.981918 -0.187551 -0.025738 +v -1.59579 1.76823 0.529852 +vn -0.974791 -0.210644 0.0735579 +v -1.60954 1.79342 0.392487 +vn -0.978469 -0.200983 0.0469547 +v -1.61509 1.83665 0.444449 +vn -0.982693 -0.175437 0.0594759 +v -1.58242 1.78368 0.704908 +vn -0.974865 -0.192838 0.111585 +v -1.60898 1.87697 0.60147 +vn -0.986366 -0.134794 0.0944116 +v -1.62627 1.90644 0.433355 +vn -0.991056 -0.119355 0.0596938 +v -1.62747 1.97922 0.509651 +vn -0.99501 -0.0572347 0.0817208 +v -1.62508 2.01812 0.551439 +vn -0.995896 -0.0058584 0.0903129 +v -1.63 2.01324 0.493254 +vn -0.997074 -0.00741937 0.076075 +v -1.63816 2.00902 0.358015 +vn -0.998795 -0.0147808 0.0467946 +v -1.60821 1.97999 0.698044 +vn -0.991235 -0.0441202 0.124527 +v -1.44725 1.27039 0.149434 +vn -0.904733 -0.425884 -0.00902041 +v -1.46836 1.31818 0.244392 +vn -0.929784 -0.368102 -0.00126703 +v -1.49792 1.39897 0.252004 +vn -0.94411 -0.329602 0.00441036 +v -1.50924 1.43219 0.253814 +vn -0.948147 -0.31776 0.00680104 +v -1.50351 1.4152 0.210714 +vn -0.945338 -0.326068 -0.00405568 +v -1.46289 1.31239 0.064187 +vn -0.928203 -0.369787 -0.0411906 +v -1.4936 1.39449 0.068046 +vn -0.941011 -0.336457 -0.0359935 +v -1.47031 1.33334 0.419916 +vn -0.931459 -0.362258 0.0339527 +v -1.52012 1.47469 0.397731 +vn -0.949433 -0.311949 0.0355556 +v -1.55078 1.65791 -0.359785 +vn -0.946269 -0.302342 -0.114732 +v -1.52629 1.64569 -0.503214 +vn -0.935229 -0.317394 -0.156868 +v -1.51461 1.63947 -0.556829 +vn -0.929825 -0.324322 -0.173896 +v -1.51705 1.61834 -0.501284 +vn -0.929546 -0.333731 -0.156744 +v -1.53116 1.59863 -0.357676 +vn -0.937755 -0.326457 -0.118493 +v -1.51349 1.56627 -0.403261 +vn -0.931797 -0.338063 -0.132164 +v -1.4639 1.56967 -0.675738 +vn -0.910705 -0.354317 -0.21231 +v -1.5077 1.53591 -0.363796 +vn -0.929339 -0.346638 -0.12717 +v -1.46139 1.46467 -0.483345 +vn -0.917567 -0.362874 -0.162461 +v -1.43011 1.47764 -0.660555 +vn -0.90298 -0.373304 -0.212771 +v -1.42203 1.45529 -0.655672 +vn -0.903757 -0.371232 -0.213096 +v -1.44221 1.4364 -0.52622 +vn -0.913796 -0.365588 -0.176978 +v -1.55267 1.68338 -0.408124 +vn -0.94784 -0.292729 -0.126131 +v -1.55319 1.73277 -0.504299 +vn -0.951451 -0.266494 -0.154018 +v -1.584 1.7774 -0.364936 +vn -0.966767 -0.229716 -0.112217 +v -1.58343 1.80055 -0.412764 +vn -0.969404 -0.21056 -0.126178 +v -1.5781 1.84404 -0.505847 +vn -0.974646 -0.151277 -0.164862 +v -1.55154 1.75656 -0.551993 +vn -0.953916 -0.247028 -0.170359 +v -1.51739 1.66959 -0.596085 +vn -0.934552 -0.304903 -0.183428 +v -1.50471 1.64509 -0.617569 +vn -0.925831 -0.325545 -0.191981 +v -1.51249 1.72046 -0.692974 +vn -0.934123 -0.281393 -0.219617 +v -1.5484 1.77965 -0.599388 +vn -0.956119 -0.224621 -0.188102 +v -1.53756 1.82412 -0.691353 +vn -0.959155 -0.159577 -0.233574 +v -1.51942 1.74582 -0.694357 +vn -0.941324 -0.253385 -0.222945 +v -1.57428 1.67593 -0.171685 +vn -0.956979 -0.28193 -0.0686059 +v -1.57827 1.7024 -0.220153 +vn -0.958941 -0.272741 -0.0777451 +v -1.56855 1.71762 -0.362619 +vn -0.955987 -0.270953 -0.112572 +v -1.58324 1.75326 -0.316845 +vn -0.963863 -0.247197 -0.099312 +v -1.59505 1.72305 -0.030954 +vn -0.966774 -0.252996 -0.0366257 +v -1.60402 1.77751 -0.127996 +vn -0.972693 -0.225588 -0.0545788 +v -1.60683 1.80326 -0.176348 +vn -0.976013 -0.207792 -0.0649679 +v -1.60839 1.82781 -0.224505 +vn -0.979062 -0.18881 -0.0760839 +v -1.59628 1.8363 -0.366505 +vn -0.977778 -0.175632 -0.114475 +v -1.60735 1.87295 -0.31997 +vn -0.984967 -0.138025 -0.103868 +v -1.62392 1.85518 -0.035407 +vn -0.985272 -0.167383 -0.0349656 +v -1.62671 1.90489 -0.13153 +vn -0.991623 -0.115485 -0.0578456 +v -1.54795 1.63202 -0.311432 +vn -0.944775 -0.31068 -0.104298 +v -1.54007 1.57967 -0.214782 +vn -0.94334 -0.32072 -0.0851355 +v -1.50726 1.51527 -0.308125 +vn -0.93041 -0.348239 -0.114312 +v -1.51699 1.54235 -0.310165 +vn -0.933958 -0.339067 -0.11294 +v -1.5005 1.46746 -0.211157 +vn -0.934997 -0.341702 -0.0949813 +v -1.53525 1.55354 -0.1666 +vn -0.943067 -0.323689 -0.0764856 +v -1.56942 1.64895 -0.123224 +vn -0.954931 -0.290762 -0.0596959 +v -1.55752 1.59423 -0.026578 +vn -0.951842 -0.303588 -0.0427942 +v -1.52998 1.52765 -0.118655 +vn -0.942747 -0.326552 -0.0677673 +v -1.51831 1.47724 -0.025248 +vn -0.943213 -0.328314 -0.0505946 +v -1.20618 2.4803 -0.689444 +vn -0.55868 0.798487 -0.224265 +v -0.926742 1.31696 1.56641 +vn -0.503728 -0.665767 0.550466 +v -0.99817 1.263 1.42043 +vn -0.505206 -0.723597 0.470292 +v -0.881879 1.22497 1.47869 +vn -0.444831 -0.764651 0.466298 +v -0.956098 1.41659 1.64451 +vn -0.542938 -0.561887 0.6241 +v -0.984037 1.52795 1.70617 +vn -0.57149 -0.443563 0.690399 +v -1.08987 1.55821 1.63164 +vn -0.620036 -0.425783 0.658987 +v -0.829886 1.38017 1.71271 +vn -0.47788 -0.592692 0.648342 +v -0.79336 1.27227 1.62252 +vn -0.421427 -0.71712 0.555103 +v -0.770264 1.29473 1.66728 +vn -0.415192 -0.693195 0.58915 +v -0.717651 1.33333 1.74259 +vn -0.38764 -0.644381 0.659173 +v -0.855574 1.49455 1.78235 +vn -0.50623 -0.464877 0.726375 +v -0.802781 1.40236 1.75105 +vn -0.458225 -0.566733 0.684722 +v -0.741903 1.44676 1.82155 +vn -0.416957 -0.511129 0.751594 +v -0.764653 1.18502 1.51462 +vn -0.367685 -0.807935 0.460488 +v -0.684707 1.19405 1.58812 +vn -0.332005 -0.798597 0.502012 +v -0.637 1.24802 1.6925 +vn -0.31395 -0.743583 0.590355 +v -0.643415 1.16895 1.57262 +vn -0.29726 -0.82857 0.474455 +v -0.314842 1.21614 1.76593 +vn -0.12767 -0.776725 0.616765 +v -0.480745 1.22827 1.7357 +vn -0.212304 -0.764836 0.608237 +v -0.378459 1.15595 1.66472 +vn -0.143735 -0.844004 0.516718 +v -0.536906 1.17096 1.63224 +vn -0.229241 -0.827016 0.513316 +v -0.335653 1.13439 1.63885 +vn -0.119397 -0.867822 0.482317 +v -0.495151 1.14744 1.61028 +vn -0.198255 -0.85327 0.482312 +v -0.453241 1.12561 1.58614 +vn -0.168618 -0.876413 0.451074 +v -0.331651 1.09996 1.57185 +vn -0.107811 -0.901249 0.419675 +v -0.370047 1.08675 1.53155 +vn -0.11792 -0.911732 0.393497 +v -0.604996 1.14416 1.55065 +vn -0.259661 -0.8542 0.450465 +v -0.52513 1.10078 1.50349 +vn -0.193094 -0.895203 0.401654 +v -0.357526 1.32093 1.86741 +vn -0.160233 -0.647702 0.744854 +v -0.396801 1.29573 1.83534 +vn -0.17763 -0.681363 0.710065 +v -0.370176 1.44448 1.95302 +vn -0.175389 -0.494714 0.851173 +v -0.411515 1.41383 1.92507 +vn -0.19554 -0.533115 0.823136 +v -0.490387 1.35828 1.86361 +vn -0.236723 -0.604695 0.760465 +v -0.527633 1.33339 1.83047 +vn -0.257085 -0.637217 0.726541 +v -0.563107 1.31034 1.79598 +vn -0.27599 -0.667945 0.691144 +v -0.545565 1.45448 1.91211 +vn -0.276645 -0.491241 0.825924 +v -0.583118 1.42629 1.88111 +vn -0.299821 -0.525949 0.795918 +v -0.653694 1.37598 1.81439 +vn -0.345853 -0.590129 0.729475 +v -0.219169 1.28292 1.856 +vn -0.0899528 -0.695735 0.712644 +v -0.153386 1.20173 1.77227 +vn -0.0621237 -0.794745 0.603755 +v -0.044339 1.23977 1.82466 +vn -0.0174092 -0.745289 0.666514 +v -0.125895 1.28372 1.8662 +vn -0.0540441 -0.695803 0.716196 +v -0.316701 1.34783 1.89778 +vn -0.141349 -0.612924 0.777396 +v -0.205432 1.426 1.96804 +vn -0.0926926 -0.514821 0.852272 +v -0.172859 1.30846 1.88484 +vn -0.0749357 -0.660527 0.747054 +v -0.127957 1.33824 1.91366 +vn -0.0563708 -0.616538 0.785304 +v -0.051993 1.40503 1.96484 +vn -0.018446 -0.544377 0.838638 +v -0.061601 1.43833 1.98502 +vn -0.02788 -0.496325 0.867689 +v -0.212743 1.14768 1.68556 +vn -0.074237 -0.853376 0.515983 +v -0.29281 1.11445 1.611 +vn -0.0966134 -0.888593 0.448407 +v -0.208023 1.07906 1.54965 +vn -0.0588178 -0.919885 0.387754 +v -0.169759 1.1277 1.6563 +vn -0.0552983 -0.875268 0.480466 +v -0.04304 1.15036 1.70434 +vn -0.0155334 -0.850706 0.525412 +v -0.126835 1.1094 1.62557 +vn -0.0390817 -0.89367 0.44702 +v -0.041952 1.08061 1.56827 +vn -0.0122247 -0.919354 0.393241 +v -1.02126 1.77771 1.78272 +vn -0.596772 -0.187123 0.780288 +v -1.11323 1.67397 1.67211 +vn -0.636538 -0.305399 0.708202 +v -1.00621 1.64919 1.75224 +vn -0.589461 -0.315248 0.743744 +v -1.12889 1.79522 1.69886 +vn -0.644313 -0.180219 0.743224 +v -1.0289 1.90744 1.79724 +vn -0.605732 -0.0572454 0.793607 +v -1.04949 2.04463 1.7799 +vn -0.605381 0.0771867 0.792185 +v -1.13658 1.92005 1.71152 +vn -0.645786 -0.0524287 0.761716 +v -1.15244 2.0453 1.69605 +vn -0.648339 0.077373 0.75741 +v -0.913568 1.88704 1.87568 +vn -0.533657 -0.0712298 0.842696 +v -0.890728 1.76098 1.87026 +vn -0.521801 -0.191416 0.831314 +v -0.857386 1.7928 1.89711 +vn -0.499895 -0.157621 0.851622 +v -0.792049 1.85912 1.94268 +vn -0.450136 -0.10194 0.887122 +v -0.751926 1.89066 1.96491 +vn -0.418078 -0.0648301 0.906095 +v -0.800801 1.89555 1.94157 +vn -0.460046 -0.0603448 0.885842 +v -0.999373 1.94252 1.82085 +vn -0.583557 -0.0197552 0.811832 +v -0.905859 2.03732 1.88047 +vn -0.530143 0.0661658 0.845323 +v -0.793452 1.9303 1.94685 +vn -0.450828 -0.0209506 0.892365 +v -0.864732 2.00376 1.90748 +vn -0.504074 0.0389961 0.86278 +v -0.922533 1.73059 1.84197 +vn -0.543475 -0.223509 0.809122 +v -0.9066 1.59797 1.80417 +vn -0.533806 -0.358913 0.765658 +v -0.876724 1.62455 1.83587 +vn -0.513859 -0.327063 0.793082 +v -0.84506 1.65283 1.86656 +vn -0.492623 -0.294599 0.818862 +v -0.820542 1.75382 1.91015 +vn -0.474607 -0.197 0.857869 +v -0.757773 1.73607 1.93877 +vn -0.423761 -0.21372 0.880199 +v -0.826672 1.52141 1.81769 +vn -0.481952 -0.432448 0.762044 +v -0.761797 1.57512 1.88227 +vn -0.433625 -0.368456 0.82232 +v -0.387899 1.74331 2.0598 +vn -0.186762 -0.193406 0.963179 +v -0.529219 1.73903 2.02564 +vn -0.267784 -0.19833 0.942845 +v -0.579077 1.73481 2.00952 +vn -0.297429 -0.203481 0.932808 +v -0.527345 1.7006 2.01714 +vn -0.266738 -0.240789 0.933205 +v -0.389081 1.66339 2.04046 +vn -0.187299 -0.264452 0.946036 +v -0.442431 1.62502 2.01746 +vn -0.216682 -0.301467 0.928529 +v -0.620079 1.70306 1.9882 +vn -0.325027 -0.242049 0.914204 +v -0.690382 1.63641 1.94057 +vn -0.3789 -0.300093 0.875431 +v -0.576743 1.57855 1.96288 +vn -0.300186 -0.356167 0.884892 +v -0.404501 1.58713 2.01276 +vn -0.193137 -0.339875 0.920425 +v -0.437132 1.55114 1.99125 +vn -0.212377 -0.379151 0.900633 +v -0.506887 1.48474 1.94125 +vn -0.25227 -0.454561 0.854245 +v -0.6742 1.49891 1.88727 +vn -0.366475 -0.445877 0.816633 +v -0.435722 1.78322 2.05716 +vn -0.213111 -0.158524 0.964082 +v -0.529489 1.8625 2.04402 +vn -0.268938 -0.0911218 0.958837 +v -0.390992 1.90875 2.08009 +vn -0.190704 -0.0531795 0.980206 +v -0.438325 1.94843 2.07169 +vn -0.217288 -0.0189554 0.975923 +v -0.530294 2.02581 2.04727 +vn -0.272527 0.0498719 0.960855 +v -0.575024 1.90161 2.03357 +vn -0.29785 -0.0567151 0.952927 +v -0.623968 1.7759 2.00258 +vn -0.327604 -0.158366 0.931448 +v -0.630829 1.74022 1.99334 +vn -0.336512 -0.198955 0.920422 +v -0.706556 1.85328 1.98155 +vn -0.387032 -0.102104 0.916396 +v -0.619501 1.94016 2.02054 +vn -0.327237 -0.0227477 0.944668 +v -0.70454 2.01545 1.98711 +vn -0.387491 0.0456277 0.920744 +v -0.708509 1.89429 1.98419 +vn -0.388185 -0.0614519 0.91953 +v -0.196351 1.74633 2.08751 +vn -0.090897 -0.191079 0.977357 +v -0.245477 1.78714 2.0896 +vn -0.114285 -0.155894 0.98114 +v -0.389804 1.82538 2.07281 +vn -0.188746 -0.12314 0.974275 +v -0.342965 1.86855 2.08589 +vn -0.16443 -0.0873425 0.982514 +v -0.049391 1.75928 2.09885 +vn -0.0241762 -0.180075 0.983356 +v -0.049506 1.80171 2.10571 +vn -0.0246473 -0.144124 0.989253 +v -0.148528 1.87483 2.10922 +vn -0.0704134 -0.0840936 0.993967 +v -0.197856 1.91592 2.108 +vn -0.0934653 -0.0504345 0.994344 +v -0.246892 1.95697 2.10419 +vn -0.117499 -0.0160899 0.992943 +v -0.391296 1.99264 2.08159 +vn -0.192836 0.0170611 0.981083 +v -0.343467 2.03732 2.08878 +vn -0.16854 0.0532172 0.984257 +v -0.049689 1.93068 2.11775 +vn -0.0250176 -0.0403664 0.998872 +v -0.049691 1.97399 2.11863 +vn -0.0255038 -0.00468292 0.999664 +v -0.148596 2.04685 2.11173 +vn -0.0728791 0.0564015 0.995745 +v -0.339989 1.70332 2.05968 +vn -0.160741 -0.228314 0.960226 +v -0.250929 1.61814 2.04879 +vn -0.113399 -0.298616 0.947612 +v -0.327928 1.47683 1.97879 +vn -0.154328 -0.454627 0.87721 +v -0.202619 1.57715 2.03994 +vn -0.0910604 -0.345551 0.933971 +v -0.25904 1.58186 2.03555 +vn -0.12109 -0.341123 0.932187 +v -0.24805 1.54491 2.02235 +vn -0.111834 -0.385633 0.915849 +v -0.147179 1.70602 2.08288 +vn -0.0689082 -0.225595 0.971781 +v -0.048933 1.63937 2.07011 +vn -0.0228816 -0.288776 0.957123 +v -0.14792 1.54449 2.03192 +vn -0.0670394 -0.384801 0.920562 +v -0.148924 1.58206 2.04653 +vn -0.0679963 -0.339783 0.938043 +v -0.049626 1.47482 2.00481 +vn -0.0248453 -0.451051 0.892152 +v -0.048803 1.59761 2.05663 +vn -0.0225715 -0.325955 0.945116 +v -1.00145 2.31128 1.74721 +vn -0.577648 0.314568 0.753239 +v -1.10663 2.29501 1.66825 +vn -0.620644 0.308814 0.720718 +v -1.01821 2.18181 1.77876 +vn -0.594149 0.204572 0.777905 +v -1.12495 2.17015 1.69606 +vn -0.632542 0.200007 0.748257 +v -0.978825 2.43969 1.70117 +vn -0.566182 0.412259 0.713779 +v -0.873797 2.33114 1.82938 +vn -0.5096 0.320497 0.798492 +v -0.90313 2.36001 1.79785 +vn -0.52857 0.344856 0.775686 +v -0.725254 2.35326 1.90427 +vn -0.412994 0.328224 0.849532 +v -0.760115 2.38329 1.87429 +vn -0.439003 0.352783 0.82633 +v -0.824433 2.44 1.81068 +vn -0.483823 0.399894 0.77846 +v -0.854841 2.46758 1.77622 +vn -0.505228 0.425422 0.75084 +v -0.951581 2.56143 1.6426 +vn -0.552228 0.501079 0.666306 +v -0.708465 2.49483 1.84758 +vn -0.410398 0.429676 0.804334 +v -0.741553 2.52143 1.81507 +vn -0.435098 0.451103 0.779228 +v -0.802349 2.57098 1.74722 +vn -0.477998 0.493043 0.726929 +v -0.919909 2.22199 1.83724 +vn -0.535871 0.236044 0.810633 +v -0.991639 2.14687 1.80687 +vn -0.576956 0.172366 0.798381 +v -0.936534 2.0781 1.85661 +vn -0.54537 0.104784 0.83162 +v -0.888617 2.18996 1.86595 +vn -0.516509 0.206385 0.831038 +v -0.842549 2.30115 1.86011 +vn -0.489968 0.295231 0.820226 +v -0.774492 2.23793 1.91812 +vn -0.443298 0.241357 0.86327 +v -0.855427 2.15688 1.89354 +vn -0.496362 0.176584 0.849966 +v -0.783454 2.08787 1.94428 +vn -0.446879 0.113391 0.887379 +v -0.737774 2.20482 1.94483 +vn -0.415928 0.2126 0.884197 +v -0.380023 2.39779 2.00548 +vn -0.201735 0.337343 0.919512 +v -0.559284 2.37657 1.96347 +vn -0.304572 0.334118 0.891965 +v -0.518132 2.34415 1.98831 +vn -0.277735 0.308029 0.909935 +v -0.383744 2.32001 2.03068 +vn -0.200047 0.282299 0.938237 +v -0.431803 2.276 2.03236 +vn -0.224713 0.252325 0.941189 +v -0.688641 2.32216 1.93266 +vn -0.385754 0.302562 0.871579 +v -0.610483 2.25685 1.98423 +vn -0.330588 0.247674 0.910697 +v -0.386827 2.24031 2.05135 +vn -0.198531 0.222498 0.954505 +v -0.56911 2.22268 2.00716 +vn -0.303232 0.218227 0.927592 +v -0.526325 2.18753 2.02803 +vn -0.275664 0.187883 0.942714 +v -0.389171 2.15897 2.06703 +vn -0.196907 0.157654 0.967664 +v -0.436994 2.11433 2.06318 +vn -0.22153 0.122696 0.967404 +v -0.699328 2.17079 1.96963 +vn -0.387253 0.182688 0.903692 +v -0.617648 2.10004 2.01302 +vn -0.329522 0.118498 0.936682 +v -0.423525 2.43081 1.98253 +vn -0.227983 0.362875 0.903519 +v -0.506693 2.49318 1.9314 +vn -0.280819 0.41127 0.867178 +v -0.371028 2.54644 1.9434 +vn -0.206758 0.434689 0.876525 +v -0.412992 2.5764 1.91734 +vn -0.23367 0.457236 0.858099 +v -0.492992 2.63218 1.86059 +vn -0.287303 0.500985 0.816377 +v -0.546195 2.5225 1.90338 +vn -0.307352 0.434344 0.846688 +v -0.598965 2.40787 1.93686 +vn -0.331251 0.359459 0.872389 +v -0.673626 2.46702 1.8788 +vn -0.384452 0.407168 0.828499 +v -0.584203 2.55055 1.87384 +vn -0.333692 0.456814 0.824603 +v -0.655495 2.60278 1.81063 +vn -0.385115 0.499716 0.775868 +v -0.191909 2.41336 2.03046 +vn -0.101686 0.3388 0.935347 +v -0.238193 2.44853 2.01143 +vn -0.127475 0.364126 0.922585 +v -0.37575 2.47336 1.97623 +vn -0.203866 0.387993 0.898832 +v -0.327848 2.51514 1.96781 +vn -0.180117 0.411948 0.893228 +v -0.047686 2.46879 2.01938 +vn -0.0272819 0.371588 0.927997 +v -0.141446 2.53003 1.98779 +vn -0.0795049 0.411498 0.907936 +v -0.187273 2.5634 1.96746 +vn -0.105816 0.433123 0.895102 +v -0.232187 2.59569 1.94527 +vn -0.132908 0.454961 0.880537 +v -0.365944 2.61675 1.90749 +vn -0.210708 0.477937 0.852747 +v -0.318926 2.65605 1.89594 +vn -0.188165 0.497376 0.846883 +v -0.046436 2.61569 1.95208 +vn -0.0287855 0.458897 0.888023 +v -0.137529 2.67178 1.91576 +vn -0.084791 0.49297 0.865905 +v -0.335356 2.36356 2.02655 +vn -0.175621 0.311288 0.933947 +v -0.242966 2.29156 2.06273 +vn -0.124136 0.255419 0.958828 +v -0.340784 2.20354 2.06818 +vn -0.172385 0.191913 0.966154 +v -0.246019 2.12688 2.09493 +vn -0.121086 0.12599 0.984614 +v -0.195472 2.25392 2.07762 +vn -0.0992786 0.225378 0.9692 +v -0.144794 2.37728 2.04741 +vn -0.0764782 0.313404 0.946535 +v -0.048723 2.30779 2.07372 +vn -0.0277472 0.267391 0.963189 +v -0.147275 2.21555 2.09019 +vn -0.0752773 0.195203 0.97787 +v -0.049407 2.14547 2.1073 +vn -0.0265952 0.137923 0.990086 +v -0.048914 2.27025 2.08357 +vn -0.0269947 0.235413 0.97152 +v -0.893145 2.77645 1.48756 +vn -0.529188 0.657708 0.536079 +v -0.921699 2.67427 1.57207 +vn -0.538467 0.584036 0.607417 +v -0.956555 2.82817 1.34335 +vn -0.546783 0.716768 0.432749 +v -0.854341 2.87537 1.39275 +vn -0.537762 0.706777 0.45965 +v -0.778004 2.81989 1.54238 +vn -0.493944 0.654492 0.572415 +v -0.639776 2.86839 1.59648 +vn -0.430701 0.652847 0.623127 +v -0.674954 2.88265 1.55504 +vn -0.458299 0.664921 0.589781 +v -0.750429 2.91155 1.45249 +vn -0.504112 0.697811 0.508853 +v -0.63139 2.98521 1.46938 +vn -0.492071 0.671709 0.553781 +v -0.664654 2.98888 1.43291 +vn -0.522193 0.678922 0.516119 +v -0.726302 2.99653 1.35353 +vn -0.555774 0.697358 0.452556 +v -0.803784 2.71074 1.63477 +vn -0.487084 0.593098 0.64108 +v -0.831363 2.59514 1.71016 +vn -0.497241 0.516042 0.697462 +v -0.697788 2.76743 1.65789 +vn -0.437335 0.614851 0.656274 +v -0.720098 2.64979 1.74271 +vn -0.434541 0.539532 0.721165 +v -0.667482 2.74794 1.69468 +vn -0.413476 0.598911 0.685815 +v -0.338465 2.92546 1.6954 +vn -0.257432 0.626939 0.735307 +v -0.482847 2.88773 1.66873 +vn -0.334548 0.635721 0.695656 +v -0.343953 2.86829 1.74118 +vn -0.243634 0.609386 0.754514 +v -0.388552 2.8328 1.75472 +vn -0.262775 0.601385 0.75451 +v -0.609813 2.84606 1.63857 +vn -0.404585 0.639664 0.65356 +v -0.549478 2.80313 1.71146 +vn -0.353599 0.611749 0.707624 +v -0.349529 2.80933 1.78551 +vn -0.232314 0.58472 0.77726 +v -0.514587 2.7817 1.74591 +vn -0.326952 0.595193 0.734062 +v -0.478099 2.75922 1.77891 +vn -0.299861 0.577709 0.759168 +v -0.355087 2.74806 1.82821 +vn -0.223123 0.554176 0.801938 +v -0.401042 2.71046 1.84044 +vn -0.244302 0.538676 0.806316 +v -0.635629 2.7273 1.73038 +vn -0.389721 0.581588 0.714054 +v -0.567314 2.68239 1.79811 +vn -0.340013 0.542917 0.767875 +v -0.376242 2.94706 1.66217 +vn -0.290074 0.636605 0.714556 +v -0.443887 2.98501 1.59653 +vn -0.344852 0.648316 0.678796 +v -0.310345 3.02642 1.61786 +vn -0.267901 0.634147 0.725318 +v -0.356576 3.10856 1.5258 +vn -0.332309 0.629905 0.701991 +v -0.437257 3.0431 1.54485 +vn -0.368692 0.640557 0.673612 +v -0.478474 3.00441 1.55908 +vn -0.380144 0.650257 0.657766 +v -0.524823 2.96843 1.56795 +vn -0.394192 0.658381 0.641207 +v -0.601298 2.90453 1.585 +vn -0.423735 0.656232 0.624347 +v -0.470862 3.12172 1.44778 +vn -0.445588 0.623274 0.642636 +v -0.513009 3.08535 1.45407 +vn -0.461303 0.640953 0.613497 +v -0.593755 3.01599 1.46562 +vn -0.488769 0.664379 0.565425 +v -0.170505 2.94454 1.72441 +vn -0.140414 0.613476 0.77713 +v -0.211075 2.96874 1.6966 +vn -0.176934 0.622588 0.762285 +v -0.124462 3.03099 1.66268 +vn -0.114948 0.626753 0.770693 +v -0.164451 3.05496 1.63588 +vn -0.155646 0.628752 0.76187 +v -0.203285 3.07828 1.60742 +vn -0.196155 0.630302 0.75116 +v -0.140866 3.15197 1.56087 +vn -0.144906 0.624067 0.767817 +v -0.29947 2.90281 1.72692 +vn -0.2242 0.61586 0.755282 +v -0.218346 2.85419 1.78469 +vn -0.157465 0.58871 0.792859 +v -0.309269 2.78458 1.81475 +vn -0.202303 0.567874 0.797868 +v -0.225434 2.73096 1.86847 +vn -0.142505 0.531257 0.83514 +v -0.176306 2.82811 1.81103 +vn -0.124882 0.573621 0.809545 +v -0.128948 2.91947 1.75041 +vn -0.104976 0.604135 0.789938 +v -0.043607 2.87316 1.7923 +vn -0.0351601 0.585125 0.81018 +v -0.133319 2.80095 1.8356 +vn -0.0934855 0.558762 0.824042 +v -0.045057 2.75044 1.87513 +vn -0.0314636 0.531034 0.846766 +v -0.530334 4.17024 -0.361302 +vn -0.545816 -0.435935 -0.715573 +v -0.56073 4.15023 -0.323972 +vn -0.575408 -0.458023 -0.677585 +v -0.582689 4.18241 -0.325802 +vn -0.60128 -0.420617 -0.67937 +v -0.59414 4.13318 -0.281851 +vn -0.601639 -0.474842 -0.642304 +v -0.636972 4.11757 -0.227351 +vn -0.632642 -0.487085 -0.60209 +v -0.636013 4.19635 -0.285194 +vn -0.633792 -0.408499 -0.656838 +v -0.683465 4.21017 -0.244916 +vn -0.684039 -0.388529 -0.617362 +v -0.473665 4.05396 -0.321367 +vn -0.502154 -0.540621 -0.67496 +v -0.519863 4.0383 -0.271493 +vn -0.53974 -0.554037 -0.633817 +v -0.527459 4.06502 -0.287812 +vn -0.545569 -0.531999 -0.647559 +v -0.561942 4.02311 -0.219345 +vn -0.57201 -0.566949 -0.592767 +v -0.599659 4.008 -0.165594 +vn -0.599601 -0.579651 -0.551799 +v -0.579329 4.07709 -0.251321 +vn -0.586293 -0.522534 -0.619047 +v -0.628967 4.08985 -0.212679 +vn -0.624645 -0.511565 -0.590018 +v -0.731027 4.22567 -0.199777 +vn -0.714095 -0.372689 -0.592597 +v -0.754301 4.20692 -0.157874 +vn -0.735501 -0.392093 -0.552541 +v -0.772763 4.24085 -0.155564 +vn -0.761108 -0.346896 -0.548067 +v -0.778916 4.191 -0.111198 +vn -0.754173 -0.408321 -0.514293 +v -0.809602 4.17654 -0.051508 +vn -0.777139 -0.417863 -0.47058 +v -0.813724 4.2576 -0.106769 +vn -0.789339 -0.3262 -0.520132 +v -0.848649 4.27372 -0.059837 +vn -0.833261 -0.29311 -0.468788 +v -0.676167 4.10343 -0.17164 +vn -0.661686 -0.498622 -0.559954 +v -0.71128 4.08937 -0.114552 +vn -0.687478 -0.509628 -0.517352 +v -0.720716 4.11754 -0.128988 +vn -0.697194 -0.484125 -0.528718 +v -0.741686 4.07503 -0.056818 +vn -0.70948 -0.519594 -0.476088 +v -0.767358 4.06006 0.000861 +vn -0.728335 -0.529295 -0.435172 +v -0.76232 4.13228 -0.084479 +vn -0.731823 -0.466965 -0.496365 +v -0.800928 4.14739 -0.038901 +vn -0.765462 -0.448122 -0.461795 +v -0.472445 4.15832 -0.396054 +vn -0.508547 -0.445228 -0.736989 +v -0.416287 4.14821 -0.425558 +vn -0.447161 -0.456759 -0.769038 +v -0.354666 4.13859 -0.45358 +vn -0.404346 -0.463758 -0.78831 +v -0.29551 4.13084 -0.476248 +vn -0.33306 -0.472181 -0.816159 +v -0.331363 4.1084 -0.446672 +vn -0.376034 -0.496729 -0.782214 +v -0.371661 4.0889 -0.412784 +vn -0.414469 -0.514081 -0.750957 +v -0.424082 4.07038 -0.368351 +vn -0.459812 -0.527181 -0.7146 +v -0.231238 4.12399 -0.496214 +vn -0.278963 -0.477425 -0.833214 +v -0.168329 4.11899 -0.510849 +vn -0.190173 -0.482948 -0.854749 +v -0.092658 4.11517 -0.521978 +vn -0.113825 -0.485668 -0.866701 +v -0.062538 4.08204 -0.506402 +vn -0.0750041 -0.500417 -0.862529 +v -0.124165 4.0628 -0.486074 +vn -0.154909 -0.527521 -0.835299 +v -0.18554 4.04059 -0.457094 +vn -0.226429 -0.548703 -0.80477 +v -0.417987 4.04377 -0.352207 +vn -0.455311 -0.547655 -0.701973 +v -0.360892 4.03477 -0.379587 +vn -0.405098 -0.554347 -0.727045 +v -0.302329 4.02681 -0.403702 +vn -0.350231 -0.559283 -0.751359 +v -0.242858 4.02023 -0.423836 +vn -0.290617 -0.56464 -0.772479 +v -0.297634 4.00113 -0.38618 +vn -0.347713 -0.579309 -0.737222 +v -0.349181 3.98325 -0.344693 +vn -0.39802 -0.59381 -0.699264 +v -0.397047 3.9662 -0.299975 +vn -0.441847 -0.608179 -0.659461 +v -0.182301 4.01467 -0.43999 +vn -0.22621 -0.567492 -0.791696 +v -0.121448 4.00907 -0.450608 +vn -0.157437 -0.570558 -0.806026 +v -0.060498 4.00162 -0.454563 +vn -0.0815281 -0.576336 -0.813136 +v -0.059429 3.97655 -0.436323 +vn -0.0814132 -0.596741 -0.798293 +v -0.117041 3.95899 -0.414061 +vn -0.155609 -0.609671 -0.777231 +v -0.172374 3.93979 -0.384779 +vn -0.2217 -0.624668 -0.748758 +v -0.382024 4.19699 -0.471025 +vn -0.424545 -0.404291 -0.81013 +v -0.4413 4.23632 -0.456793 +vn -0.476849 -0.371308 -0.796709 +v -0.33636 4.16346 -0.47652 +vn -0.381096 -0.436515 -0.814997 +v -0.38108 4.25532 -0.498507 +vn -0.422031 -0.355804 -0.833842 +v -0.440567 4.26501 -0.470163 +vn -0.476715 -0.345901 -0.808143 +v -0.378904 4.31437 -0.522666 +vn -0.422031 -0.302321 -0.854688 +v -0.436064 4.35398 -0.505534 +vn -0.477163 -0.261678 -0.838952 +v -0.257567 4.23969 -0.544179 +vn -0.299886 -0.373469 -0.877832 +v -0.319881 4.24676 -0.52343 +vn -0.362842 -0.366357 -0.856813 +v -0.319209 4.27618 -0.535692 +vn -0.363058 -0.340111 -0.867475 +v -0.128863 4.17234 -0.54684 +vn -0.156442 -0.437788 -0.885363 +v -0.194739 4.20518 -0.547949 +vn -0.231294 -0.405396 -0.884396 +v -0.064269 4.14696 -0.542519 +vn -0.074872 -0.471502 -0.878681 +v -0.129784 4.23203 -0.574084 +vn -0.160018 -0.385964 -0.90853 +v -0.193996 4.23415 -0.561059 +vn -0.231937 -0.381534 -0.894783 +v -0.128743 4.29178 -0.597664 +vn -0.159835 -0.334221 -0.928843 +v -0.191606 4.3243 -0.59554 +vn -0.23169 -0.303475 -0.924242 +v -0.06496 4.23513 -0.584186 +vn -0.0822111 -0.38478 -0.91934 +v -0.06473 4.26492 -0.596096 +vn -0.0824035 -0.358817 -0.929763 +v -0.567662 4.20613 -0.352569 +vn -0.585563 -0.394665 -0.708065 +v -0.608005 4.24302 -0.337435 +vn -0.621854 -0.35634 -0.697366 +v -0.65878 4.28643 -0.311197 +vn -0.665267 -0.315253 -0.676783 +v -0.705896 4.3297 -0.28152 +vn -0.708791 -0.267098 -0.652897 +v -0.658021 4.31489 -0.324657 +vn -0.666712 -0.287398 -0.687675 +v -0.607315 4.30103 -0.365119 +vn -0.623149 -0.303585 -0.720779 +v -0.553967 4.28795 -0.40322 +vn -0.576964 -0.320048 -0.751453 +v -0.761614 4.26409 -0.184268 +vn -0.750451 -0.322019 -0.577172 +v -0.793115 4.30343 -0.16221 +vn -0.783456 -0.275695 -0.556946 +v -0.830845 4.34964 -0.127707 +vn -0.822123 -0.2243 -0.523262 +v -0.863578 4.39519 -0.090799 +vn -0.85953 -0.16434 -0.483942 +v -0.829763 4.37798 -0.14091 +vn -0.82438 -0.195681 -0.531137 +v -0.791993 4.36132 -0.189392 +vn -0.787492 -0.22136 -0.575201 +v -0.75064 4.34514 -0.236534 +vn -0.748869 -0.246823 -0.615039 +v -0.552907 4.31703 -0.41568 +vn -0.577971 -0.2911 -0.762371 +v -0.604067 4.35923 -0.389787 +vn -0.624579 -0.244962 -0.741549 +v -0.6514 4.4023 -0.360937 +vn -0.668414 -0.195895 -0.717529 +v -0.694371 4.44608 -0.329434 +vn -0.70931 -0.144159 -0.689998 +v -0.647405 4.43195 -0.372151 +vn -0.667462 -0.164692 -0.726203 +v -0.597385 4.4187 -0.412331 +vn -0.623638 -0.184114 -0.759722 +v -0.544991 4.40626 -0.449974 +vn -0.577499 -0.201725 -0.791077 +v -0.749054 4.37385 -0.249052 +vn -0.750416 -0.215617 -0.624808 +v -0.787491 4.41862 -0.214255 +vn -0.789402 -0.15977 -0.592721 +v -0.820939 4.46374 -0.17763 +vn -0.825185 -0.101549 -0.55566 +v -0.849009 4.50897 -0.13953 +vn -0.8572 -0.0421744 -0.513254 +v -0.816014 4.49242 -0.189433 +vn -0.823281 -0.0703255 -0.563261 +v -0.77891 4.47638 -0.237838 +vn -0.787139 -0.0971872 -0.60907 +v -0.738431 4.46088 -0.284645 +vn -0.749301 -0.121453 -0.650997 +v -0.525286 3.58836 1.1385 +vn -0.641915 -0.0363534 0.765913 +v -0.763444 3.8499 0.987617 +vn -0.793472 -0.421089 0.439416 +v -0.71886 3.73625 0.967514 +vn -0.80568 -0.358829 0.471298 +v -0.67515 3.82319 1.09216 +vn -0.684449 -0.432125 0.587195 +v -0.694762 3.61832 0.933039 +vn -0.864433 -0.234621 0.444644 +v -0.642764 3.70989 1.05767 +vn -0.721113 -0.320123 0.614424 +v -0.618985 3.59172 1.04206 +vn -0.782428 -0.127406 0.609569 +v -0.775393 3.74196 0.844358 +vn -0.889486 -0.365062 0.274853 +v -0.839053 3.90343 0.87494 +vn -0.866085 -0.415225 0.278361 +v -0.862583 3.89038 0.733224 +vn -0.908107 -0.410187 0.0841983 +v -0.841838 3.85085 0.759138 +vn -0.905185 -0.406381 0.124476 +v -0.799673 3.77782 0.811417 +vn -0.89512 -0.390813 0.214537 +v -0.796995 3.73621 0.702351 +vn -0.925706 -0.376894 0.0319176 +v -0.734766 3.597 0.808408 +vn -0.944436 -0.251733 0.211357 +v -0.804847 3.97127 1.03445 +vn -0.788348 -0.439154 0.430874 +v -0.843873 4.0918 1.07821 +vn -0.818703 -0.365176 0.443138 +v -0.879836 4.02957 0.934252 +vn -0.862852 -0.400573 0.308266 +v -0.930152 4.05732 0.780011 +vn -0.915271 -0.379339 0.135579 +v -0.906181 4.01043 0.80478 +vn -0.903951 -0.391934 0.171056 +v -0.927812 4.16128 0.951071 +vn -0.900949 -0.301454 0.312116 +v -0.937048 4.09364 0.825445 +vn -0.912868 -0.361452 0.1898 +v -0.814953 3.85911 0.439315 +vn -0.846232 -0.47342 -0.244467 +v -0.78266 3.72919 0.568274 +vn -0.904074 -0.389926 -0.174952 +v -0.857574 3.88317 0.590657 +vn -0.897395 -0.430836 -0.0951942 +v -0.735983 3.71633 0.432268 +vn -0.847813 -0.410008 -0.336313 +v -0.725706 3.58967 0.545647 +vn -0.933093 -0.265608 -0.242466 +v -0.746694 3.5946 0.678207 +vn -0.961732 -0.272802 -0.0255093 +v -0.741355 3.83007 0.292824 +vn -0.770885 -0.524365 -0.361633 +v -0.639043 3.80313 0.147183 +vn -0.684794 -0.571216 -0.452514 +v -0.660471 3.70038 0.296663 +vn -0.777292 -0.433059 -0.456373 +v -0.674924 3.58311 0.413345 +vn -0.878832 -0.240391 -0.412149 +v -0.559487 3.68377 0.163642 +vn -0.703686 -0.451735 -0.548417 +v -0.598919 3.57615 0.283384 +vn -0.816369 -0.20511 -0.539881 +v -0.826499 3.94225 0.316389 +vn -0.807382 -0.521565 -0.27587 +v -0.8968 4.00713 0.437585 +vn -0.871846 -0.459636 -0.169174 +v -0.901422 4.0333 0.391905 +vn -0.866322 -0.463058 -0.187249 +v -0.903467 4.08199 0.291497 +vn -0.85301 -0.468647 -0.22966 +v -0.825678 3.96613 0.269449 +vn -0.795665 -0.532046 -0.289559 +v -0.739457 3.85722 0.248469 +vn -0.752275 -0.548668 -0.364754 +v -0.729702 3.90551 0.154957 +vn -0.713201 -0.589912 -0.378614 +v -0.823702 3.99088 0.219096 +vn -0.780896 -0.546122 -0.303235 +v -0.814914 4.00836 0.167733 +vn -0.771695 -0.542279 -0.332294 +v -0.803739 4.02698 0.113654 +vn -0.758316 -0.542609 -0.361292 +v -0.748336 3.934 0.146044 +vn -0.723096 -0.582658 -0.371001 +v -0.88969 3.97872 0.480113 +vn -0.877409 -0.455224 -0.151406 +v -0.882468 3.92994 0.70572 +vn -0.91029 -0.411004 0.0494821 +v -0.917884 4.00583 0.642869 +vn -0.91379 -0.406125 -0.00709344 +v -0.932565 4.04079 0.606439 +vn -0.915329 -0.401431 -0.0320247 +v -0.944698 4.07303 0.566255 +vn -0.916762 -0.395503 -0.0558952 +v -0.933091 4.08066 0.432685 +vn -0.894274 -0.423441 -0.144817 +v -0.960362 4.12896 0.4753 +vn -0.920415 -0.376799 -0.104206 +v -0.952497 4.1024 0.746693 +vn -0.929403 -0.356301 0.0962279 +v -0.984243 4.1734 0.660476 +vn -0.946689 -0.320307 0.0344078 +v -0.92481 4.85995 0.225202 +vn -0.943776 0.279922 -0.175868 +v -0.944018 4.83182 0.307205 +vn -0.961809 0.253362 -0.103593 +v -0.949167 4.79435 0.271623 +vn -0.964629 0.230227 -0.1284 +v -0.930061 4.90173 0.366756 +vn -0.955773 0.285263 -0.0715752 +v -0.957908 4.78856 0.341539 +vn -0.970268 0.228017 -0.0811638 +v -0.95553 4.77665 0.289859 +vn -0.968583 0.221427 -0.113211 +v -0.977737 4.69955 0.345125 +vn -0.976808 0.195718 -0.08684 +v -0.954857 4.8221 0.445802 +vn -0.969164 0.245893 -0.0160758 +v -0.957191 4.80597 0.394019 +vn -0.970777 0.235397 -0.0466893 +v -0.963304 4.78384 0.412612 +vn -0.972492 0.229849 -0.0377901 +v -0.950484 4.84008 0.493505 +vn -0.968392 0.249136 0.0121715 +v -0.972796 4.74393 0.553109 +vn -0.968793 0.245371 0.0351181 +v -0.918562 4.81012 0.132457 +vn -0.938988 0.245684 -0.24071 +v -0.919882 4.76973 0.099892 +vn -0.938797 0.220284 -0.264831 +v -0.91723 4.72865 0.06057 +vn -0.934926 0.192028 -0.298392 +v -0.911589 4.68632 0.020464 +vn -0.928393 0.157892 -0.336388 +v -0.92634 4.70298 0.073492 +vn -0.941564 0.175001 -0.287805 +v -0.937923 4.71981 0.126957 +vn -0.951895 0.188273 -0.241762 +v -0.946033 4.74232 0.182604 +vn -0.959561 0.202876 -0.19515 +v -0.863505 4.7498 -0.06606 +vn -0.889115 0.200349 -0.411503 +v -0.852674 4.70835 -0.105745 +vn -0.877211 0.161729 -0.452045 +v -0.838022 4.66594 -0.14537 +vn -0.860423 0.118264 -0.495667 +v -0.818975 4.6227 -0.184506 +vn -0.838583 0.0689094 -0.540398 +v -0.84764 4.63812 -0.134654 +vn -0.867298 0.0944554 -0.488746 +v -0.872402 4.65388 -0.083711 +vn -0.891657 0.117349 -0.437239 +v -0.893764 4.66997 -0.032008 +vn -0.911789 0.139347 -0.386294 +v -0.954651 4.71199 0.19506 +vn -0.964068 0.187819 -0.187875 +v -0.953817 4.66857 0.154248 +vn -0.962278 0.156599 -0.222479 +v -0.949812 4.62417 0.112569 +vn -0.95795 0.118371 -0.261382 +v -0.941999 4.57896 0.070618 +vn -0.94992 0.0725401 -0.303957 +v -0.95635 4.59731 0.125431 +vn -0.962266 0.0988944 -0.253504 +v -0.967488 4.61564 0.181656 +vn -0.97057 0.122648 -0.207247 +v -0.975687 4.63996 0.24379 +vn -0.97584 0.150607 -0.158284 +v -0.902509 4.64298 -0.020007 +vn -0.918206 0.11728 -0.378343 +v -0.889365 4.59881 -0.060397 +vn -0.90384 0.0693988 -0.422206 +v -0.871731 4.55407 -0.100357 +vn -0.883552 0.0162373 -0.468052 +v -0.878116 4.52594 -0.088473 +vn -0.88766 -0.0122023 -0.460338 +v -0.903042 4.54326 -0.036338 +vn -0.912949 0.0168183 -0.407726 +v -0.924416 4.56097 0.016719 +vn -0.933692 0.0458194 -0.355134 +v -0.899755 4.81871 0.074096 +vn -0.923797 0.252392 -0.287918 +v -0.909331 4.83823 0.126322 +vn -0.933027 0.264945 -0.243443 +v -0.877836 4.86686 0.05023 +vn -0.906937 0.28532 -0.309931 +v -0.876595 4.90157 0.081163 +vn -0.90187 0.320657 -0.289499 +v -0.870978 4.79011 -0.026581 +vn -0.897863 0.232499 -0.37388 +v -0.886787 4.80437 0.023623 +vn -0.91185 0.244155 -0.330027 +v -0.875635 4.82916 0.012243 +vn -0.903664 0.260361 -0.340005 +v -0.876486 4.9367 0.122888 +vn -0.907815 0.334508 -0.252935 +v -0.827625 5.02663 0.081942 +vn -0.873049 0.388651 -0.294508 +v -0.823165 4.89069 -0.065453 +vn -0.862016 0.302196 -0.406946 +v -0.840014 4.90249 -0.018447 +vn -0.876979 0.311613 -0.365793 +v -0.828445 4.92454 -0.026442 +vn -0.863167 0.337923 -0.375167 +v -0.830641 4.76219 -0.125938 +vn -0.86117 0.20312 -0.465971 +v -0.852387 4.77607 -0.076583 +vn -0.880928 0.219427 -0.419306 +v -0.806833 4.81528 -0.143786 +vn -0.843778 0.242557 -0.478753 +v -0.816413 4.8536 -0.104469 +vn -0.854331 0.27434 -0.441425 +v -0.777415 4.73534 -0.222405 +vn -0.810583 0.165229 -0.561831 +v -0.805769 4.74863 -0.174711 +vn -0.837602 0.185567 -0.513797 +v -0.793994 4.77585 -0.183248 +vn -0.829225 0.206576 -0.519339 +v -0.781713 4.86757 -0.158732 +vn -0.825264 0.280779 -0.490003 +v -0.803816 4.87907 -0.112412 +vn -0.844967 0.292086 -0.448014 +v -0.755812 4.91894 -0.17027 +vn -0.805365 0.319702 -0.499177 +v -0.765814 4.95205 -0.130398 +vn -0.810352 0.357678 -0.464108 +v -0.728885 4.84539 -0.249419 +vn -0.776905 0.253595 -0.576288 +v -0.756803 4.85637 -0.204602 +vn -0.80232 0.26834 -0.533176 +v -0.743945 4.88272 -0.20995 +vn -0.792866 0.288334 -0.536868 +v -0.918632 4.84623 0.17501 +vn -0.940344 0.272009 -0.204365 +v -0.643017 3.35552 0.340025 +vn -0.888459 0.269373 -0.371588 +v -0.722208 3.22946 0.41628 +vn -0.838511 0.500659 -0.215034 +v -0.738639 3.21596 0.452203 +vn -0.846548 0.505992 -0.165313 +v -0.720931 3.34941 0.639026 +vn -0.98613 0.148288 -0.0745505 +v -0.750325 3.23156 0.588737 +vn -0.893335 0.435654 -0.110258 +v -0.569441 3.35573 0.191355 +vn -0.799332 0.391225 -0.456083 +v -0.597704 3.25657 0.126262 +vn -0.737648 0.569131 -0.363271 +v -0.64557 3.16024 0.039092 +vn -0.658216 0.691515 -0.297588 +v -0.568706 3.46166 0.246766 +vn -0.833874 0.120985 -0.538532 +v -0.643997 3.46303 0.38114 +vn -0.905242 0.017319 -0.424544 +v -0.502287 3.57008 0.157823 +vn -0.752749 -0.164624 -0.637391 +v -0.69633 3.4655 0.519875 +vn -0.961787 -0.0622619 -0.266625 +v -0.720929 3.46837 0.660291 +vn -0.993109 -0.0998443 -0.0613593 +v -0.681917 3.35762 0.941203 +vn -0.932601 0.185118 0.309816 +v -0.622048 3.35595 1.07758 +vn -0.832047 0.284923 0.475938 +v -0.753426 3.15008 0.99991 +vn -0.784561 0.572784 0.23745 +v -0.651879 3.24212 1.11554 +vn -0.800155 0.439913 0.407712 +v -0.713198 3.37708 0.796275 +vn -0.987029 0.0811673 0.138509 +v -0.751411 3.23397 0.761339 +vn -0.914644 0.400651 0.0539016 +v -0.7547 3.22003 0.80162 +vn -0.900002 0.426713 0.0889573 +v -0.680234 3.48108 0.919309 +vn -0.926691 -0.0372277 0.373976 +v -0.717655 3.48416 0.783083 +vn -0.982991 -0.116341 0.142107 +v -0.611391 3.4731 1.05019 +vn -0.826947 0.0974288 0.553775 +v -0.756653 2.6518 -1.73058 +vn -0.859841 0.370664 -0.351114 +v -0.777191 2.64745 -1.68344 +vn -0.862034 0.387119 -0.327164 +v -0.81997 2.64864 -1.55618 +vn -0.861335 0.434085 -0.263953 +v -0.737948 2.7611 -1.64211 +vn -0.865984 0.424241 -0.264747 +v -0.842915 2.53596 -1.64135 +vn -0.859398 0.378087 -0.344216 +v -0.897585 2.53998 -1.48329 +vn -0.857667 0.436299 -0.272122 +v -0.766778 2.77128 -1.51051 +vn -0.852976 0.488003 -0.185165 +v -0.766158 2.53367 -1.81336 +vn -0.847816 0.31307 -0.428014 +v -0.779964 2.39811 -1.87071 +vn -0.81834 0.250087 -0.51747 +v -0.85719 2.42574 -1.71236 +vn -0.849215 0.329489 -0.412639 +v -0.874587 2.30885 -1.75973 +vn -0.83427 0.276832 -0.476819 +v -0.734726 2.65557 -1.77857 +vn -0.856214 0.354037 -0.376239 +v -0.686495 2.66098 -1.87631 +vn -0.844707 0.315968 -0.432011 +v -0.659411 2.66297 -1.9257 +vn -0.835348 0.292599 -0.46538 +v -0.687379 2.62691 -1.89847 +vn -0.837561 0.300689 -0.456156 +v -0.633471 2.80341 -1.87315 +vn -0.860426 0.340107 -0.379465 +v -0.606316 2.81162 -1.92522 +vn -0.855636 0.31318 -0.412075 +v -0.57756 2.83014 -1.97028 +vn -0.849631 0.290088 -0.440427 +v -0.549089 2.83381 -2.02034 +vn -0.833973 0.265326 -0.48383 +v -0.578938 2.79088 -1.99213 +vn -0.842538 0.273084 -0.464279 +v -0.602836 2.73876 -1.97973 +vn -0.831172 0.273737 -0.483964 +v -0.631233 2.70169 -1.95234 +vn -0.833885 0.285904 -0.472117 +v -0.743658 2.52757 -1.86025 +vn -0.836757 0.293669 -0.462166 +v -0.692887 2.51728 -1.95024 +vn -0.806555 0.244595 -0.538185 +v -0.664484 2.50807 -1.99417 +vn -0.778825 0.209337 -0.591278 +v -0.695931 2.48202 -1.9608 +vn -0.799129 0.214706 -0.56151 +v -0.629679 2.6649 -1.97573 +vn -0.819115 0.266881 -0.507765 +v -0.595704 2.66336 -2.02805 +vn -0.796698 0.233321 -0.557524 +v -0.559294 2.66924 -2.07549 +vn -0.770803 0.191177 -0.607712 +v -0.522415 2.65904 -2.12058 +vn -0.703886 0.144684 -0.695422 +v -0.562822 2.61683 -2.08696 +vn -0.740252 0.176722 -0.648688 +v -0.600333 2.58093 -2.05294 +vn -0.761175 0.200128 -0.616897 +v -0.631028 2.54296 -2.02634 +vn -0.777524 0.18678 -0.600474 +v -0.65813 2.79463 -1.82303 +vn -0.863945 0.360437 -0.351686 +v -0.683442 2.75648 -1.80063 +vn -0.862189 0.36313 -0.353224 +v -0.681767 2.78561 -1.77284 +vn -0.864687 0.38076 -0.327626 +v -0.741229 2.81972 -1.4956 +vn -0.845658 0.513842 -0.14432 +v -0.716247 2.84676 -1.5464 +vn -0.851429 0.499687 -0.159317 +v -0.650235 2.90238 -1.70191 +vn -0.868756 0.435881 -0.235099 +v -0.675647 2.8629 -1.68233 +vn -0.866889 0.433944 -0.245349 +v -0.673425 2.88415 -1.64932 +vn -0.86329 0.457616 -0.21288 +v -0.607485 2.87588 -1.86556 +vn -0.869388 0.353518 -0.345238 +v -0.632837 2.83462 -1.84494 +vn -0.866294 0.357477 -0.34892 +v -0.604408 2.93405 -1.80517 +vn -0.875654 0.391686 -0.282512 +v -0.627291 2.91902 -1.75412 +vn -0.872148 0.413949 -0.260774 +v -0.557866 2.95998 -1.90633 +vn -0.875253 0.346722 -0.337217 +v -0.582597 2.91906 -1.88502 +vn -0.873083 0.350862 -0.33856 +v -0.581447 2.94864 -1.85489 +vn -0.876577 0.369846 -0.30794 +v -0.59887 2.98499 -1.74076 +vn -0.873639 0.438067 -0.211783 +v -0.624768 2.94328 -1.72169 +vn -0.871316 0.434746 -0.227605 +v -0.587964 3.03022 -1.67229 +vn -0.856062 0.504695 -0.111538 +v -0.606791 3.00966 -1.61922 +vn -0.840677 0.536262 -0.0753954 +v -0.54735 3.07186 -1.77721 +vn -0.8813 0.437912 -0.177604 +v -0.573194 3.02819 -1.75946 +vn -0.877243 0.436774 -0.19918 +v -0.567937 3.05147 -1.72543 +vn -0.869824 0.469594 -0.151285 +v -0.383715 3.33114 -1.9923 +vn -0.889733 0.360032 -0.280627 +v -0.453444 3.24399 -1.84685 +vn -0.896401 0.424123 -0.128785 +v -0.487107 3.12915 -1.91726 +vn -0.893628 0.356756 -0.272312 +v -0.506974 3.10927 -1.87595 +vn -0.892755 0.380521 -0.24123 +v -0.527584 3.09088 -1.82669 +vn -0.889499 0.406314 -0.209049 +v -0.522713 3.11585 -1.79444 +vn -0.88712 0.432468 -0.161212 +v -0.498566 3.15926 -1.81121 +vn -0.892273 0.427996 -0.143763 +v -0.476039 3.20215 -1.82763 +vn -0.897003 0.421802 -0.132167 +v -0.406583 3.32819 -1.75019 +vn -0.817772 0.539151 0.201405 +v -0.46842 3.22479 -1.79848 +vn -0.889842 0.450845 -0.0701412 +v -0.490308 3.18786 -1.69772 +vn -0.841292 0.536747 0.0642681 +v -0.468559 3.21291 -1.66795 +vn -0.772701 0.603369 0.197174 +v -0.4196 3.19985 -2.03107 +vn -0.873837 0.31765 -0.368114 +v -0.443917 3.19736 -1.96835 +vn -0.891418 0.344487 -0.294454 +v -0.410305 3.157 -2.08272 +vn -0.845085 0.284832 -0.45244 +v -0.389756 3.20667 -2.08955 +vn -0.845823 0.299898 -0.441187 +v -0.339478 3.18045 -2.17424 +vn -0.701119 0.225098 -0.676582 +v -0.452972 3.05086 -2.06841 +vn -0.843449 0.272015 -0.463251 +v -0.431306 3.10427 -2.07642 +vn -0.845277 0.279299 -0.45552 +v -0.424117 3.08284 -2.10138 +vn -0.825356 0.258882 -0.501764 +v -0.509216 3.0557 -1.93703 +vn -0.884376 0.339694 -0.320136 +v -0.487659 3.10319 -1.94657 +vn -0.887936 0.341467 -0.30817 +v -0.507831 2.99995 -1.99156 +vn -0.868427 0.305815 -0.390271 +v -0.481239 3.02319 -2.03179 +vn -0.859632 0.28789 -0.42208 +v -0.533767 3.0095 -1.91886 +vn -0.88134 0.344796 -0.32304 +v -0.533504 2.9804 -1.94851 +vn -0.873813 0.327647 -0.359304 +v -0.499261 2.94356 -2.0468 +vn -0.840129 0.265602 -0.472905 +v -0.475714 2.99731 -2.05856 +vn -0.842338 0.270877 -0.465931 +v -0.484449 2.88252 -2.09913 +vn -0.789854 0.216775 -0.573706 +v -0.449115 2.91253 -2.13504 +vn -0.754008 0.197057 -0.62661 +v -0.523983 2.89026 -2.03308 +vn -0.837895 0.267633 -0.475714 +v -0.517892 2.85847 -2.06011 +vn -0.818155 0.245709 -0.519855 +v -0.293454 3.39349 -2.13307 +vn -0.789634 0.306693 -0.531429 +v -0.307201 3.51761 -1.96634 +vn -0.876706 0.446649 -0.17858 +v -0.700094 5.31428 0.431139 +vn -0.694874 0.718282 0.0349482 +v -0.815116 2.13523 -1.90081 +vn -0.742951 0.0717841 -0.665486 +v -0.892767 2.19426 -1.78589 +vn -0.812872 0.208275 -0.54393 +v -0.797642 2.26439 -1.89674 +vn -0.783625 0.169074 -0.597785 +v -0.828689 2.01286 -1.89004 +vn -0.702246 -0.0349287 -0.711077 +v -0.836203 1.89559 -1.86876 +vn -0.665461 -0.13773 -0.733616 +v -0.717259 2.05051 -1.99285 +vn -0.622414 -0.0808789 -0.778498 +v -0.702401 2.19168 -2.01117 +vn -0.668261 0.018088 -0.743707 +v -0.59074 2.08585 -2.08482 +vn -0.497489 -0.128709 -0.857869 +v -0.72565 1.91864 -1.96486 +vn -0.586559 -0.172367 -0.791353 +v -0.599359 1.94098 -2.05134 +vn -0.467407 -0.206927 -0.859483 +v -0.683205 2.34565 -2.01498 +vn -0.722581 0.11885 -0.680993 +v -0.575377 2.24373 -2.11005 +vn -0.540931 -0.0404962 -0.840092 +v -0.60809 2.47853 -2.06904 +vn -0.71279 0.121926 -0.690698 +v -0.551325 2.42017 -2.1259 +vn -0.604152 0.0419948 -0.795762 +v -0.29568 2.30345 -2.23237 +vn -0.226603 -0.128815 -0.965431 +v -0.328149 2.34391 -2.22901 +vn -0.268102 -0.105546 -0.957591 +v -0.389047 2.42748 -2.21578 +vn -0.362716 -0.0510667 -0.9305 +v -0.27916 2.48852 -2.25515 +vn -0.247394 -0.0707645 -0.966327 +v -0.436809 2.28356 -2.18507 +vn -0.383097 -0.0985659 -0.918434 +v -0.423694 2.42131 -2.20105 +vn -0.407335 -0.0383551 -0.912473 +v -0.307687 2.53715 -2.25017 +vn -0.293721 -0.0449806 -0.954832 +v -0.273582 2.54074 -2.26009 +vn -0.25108 -0.0539805 -0.96646 +v -0.334345 2.58583 -2.24277 +vn -0.349409 -0.0198583 -0.93676 +v -0.358312 2.63734 -2.23362 +vn -0.405272 0.00653237 -0.914173 +v -0.267563 2.59258 -2.26398 +vn -0.25689 -0.0396197 -0.965628 +v -0.260901 2.6462 -2.26781 +vn -0.259238 -0.0272697 -0.965428 +v -0.417763 2.4691 -2.20518 +vn -0.422135 -0.0207293 -0.906296 +v -0.444582 2.51685 -2.19195 +vn -0.487096 0.0178221 -0.873166 +v -0.410306 2.52348 -2.2097 +vn -0.434439 -0.00344144 -0.900695 +v -0.494492 2.61668 -2.15215 +vn -0.623756 0.0856378 -0.776914 +v -0.47962 2.67544 -2.15693 +vn -0.635657 0.103699 -0.764975 +v -0.403571 2.5791 -2.21244 +vn -0.456296 0.0137387 -0.889722 +v -0.391009 2.63406 -2.21823 +vn -0.456453 0.0218391 -0.889479 +v -0.306397 2.13395 -2.20165 +vn -0.210834 -0.191937 -0.958493 +v -0.341259 2.17072 -2.2004 +vn -0.248928 -0.171655 -0.953189 +v -0.365992 2.29624 -2.21225 +vn -0.301977 -0.117972 -0.945988 +v -0.312281 1.97501 -2.1637 +vn -0.201951 -0.245863 -0.948033 +v -0.348956 2.01066 -2.16432 +vn -0.235144 -0.230911 -0.944133 +v -0.452658 2.11408 -2.15454 +vn -0.349334 -0.167473 -0.92191 +v -0.460434 1.96015 -2.11785 +vn -0.329512 -0.231151 -0.915418 +v -0.261968 2.2636 -2.2338 +vn -0.188491 -0.14987 -0.970572 +v -0.191148 2.18495 -2.23137 +vn -0.123217 -0.186058 -0.974782 +v -0.148261 2.31604 -2.25835 +vn -0.10002 -0.14412 -0.984493 +v -0.112401 2.27467 -2.25505 +vn -0.0705358 -0.160194 -0.984562 +v -0.154241 2.14591 -2.22771 +vn -0.0951094 -0.201256 -0.97491 +v -0.27048 2.09704 -2.20112 +vn -0.176984 -0.209499 -0.961658 +v -0.195935 2.02237 -2.19504 +vn -0.118973 -0.238033 -0.963943 +v -0.116502 2.10723 -2.22259 +vn -0.0680072 -0.21513 -0.974215 +v -0.157564 1.98454 -2.18967 +vn -0.0929952 -0.249709 -0.963845 +v -0.24847 2.4454 -2.2587 +vn -0.204206 -0.0891306 -0.974862 +v -0.222335 2.31073 -2.24787 +vn -0.160143 -0.138604 -0.977314 +v -0.182988 2.35832 -2.26014 +vn -0.131015 -0.12693 -0.983221 +v -0.25354 2.70157 -2.27081 +vn -0.264565 -0.0141422 -0.964264 +v -0.228235 2.64881 -2.27579 +vn -0.217547 -0.0341176 -0.975453 +v -0.200511 2.59808 -2.27904 +vn -0.177486 -0.0518186 -0.982758 +v -0.170719 2.54911 -2.28082 +vn -0.138852 -0.0698257 -0.987848 +v -0.139239 2.49968 -2.28068 +vn -0.105745 -0.0890369 -0.990399 +v -0.106008 2.45575 -2.27946 +vn -0.0738388 -0.102618 -0.991976 +v -0.136296 2.55112 -2.28528 +vn -0.106244 -0.0726866 -0.99168 +v -0.133194 2.60232 -2.28886 +vn -0.107964 -0.0584124 -0.992437 +v -0.129818 2.65497 -2.29211 +vn -0.107582 -0.0457653 -0.993142 +v -0.126176 2.70951 -2.29454 +vn -0.108663 -0.0326566 -0.993542 +v -0.096922 2.65694 -2.29515 +vn -0.0751992 -0.0473476 -0.996044 +v -0.064675 2.60602 -2.29433 +vn -0.048599 -0.0593214 -0.997055 +v -0.036405 2.56332 -2.2926 +vn -0.0231951 -0.0733148 -0.997039 +v -1.01625 4.41485 0.399494 +vn -0.993001 -0.025117 -0.115405 +v -1.02031 4.40446 0.442418 +vn -0.996172 -0.0252221 -0.0836945 +v -1.02247 4.45087 0.472229 +vn -0.997609 0.0284946 -0.0629552 +v -1.02269 4.38739 0.487826 +vn -0.996701 -0.0566973 -0.0580683 +v -1.02395 4.3693 0.542861 +vn -0.997043 -0.0722924 -0.0260617 +v -1.02404 4.46919 0.52169 +vn -0.997933 0.0579855 -0.0276915 +v -1.00184 4.29034 0.401314 +vn -0.971489 -0.200114 -0.127136 +v -1.00431 4.27156 0.457495 +vn -0.971931 -0.215631 -0.0940882 +v -1.01055 4.3056 0.450979 +vn -0.980592 -0.172118 -0.0938927 +v -1.00378 4.25056 0.512005 +vn -0.969663 -0.236436 -0.0620661 +v -1.00108 4.23011 0.564267 +vn -0.963624 -0.265768 -0.0282277 +v -1.01663 4.32035 0.500506 +vn -0.987494 -0.145492 -0.0607186 +v -1.02095 4.33486 0.549711 +vn -0.992593 -0.118458 -0.0269672 +v -1.0232 4.48561 0.571993 +vn -0.996542 0.0826607 0.00844959 +v -1.02366 4.46659 0.622691 +vn -0.99731 0.065545 0.0328075 +v -1.01758 4.51171 0.659854 +vn -0.990285 0.123599 0.0637068 +v -1.01913 4.42599 0.722415 +vn -0.994663 0.0238755 0.100372 +v -1.00621 4.53702 0.742208 +vn -0.97938 0.156031 0.128329 +v -1.02279 4.34936 0.599774 +vn -0.995777 -0.0913021 0.00961359 +v -1.01902 4.32308 0.653149 +vn -0.993198 -0.111102 0.0348314 +v -1.00417 4.27638 0.755868 +vn -0.976129 -0.182163 0.118277 +v -1.01382 4.40268 0.768499 +vn -0.989849 0.00111801 0.142116 +v -1.00964 4.40412 0.352432 +vn -0.987932 -0.0342189 -0.151058 +v -0.988008 4.37855 0.247386 +vn -0.973285 -0.0886622 -0.211789 +v -0.973632 4.3616 0.196748 +vn -0.956138 -0.127786 -0.263572 +v -0.981813 4.34194 0.238865 +vn -0.962804 -0.143876 -0.228711 +v -0.988948 4.32436 0.285134 +vn -0.966034 -0.167636 -0.196662 +v -0.996833 4.30745 0.343913 +vn -0.969392 -0.184135 -0.162398 +v -0.955148 4.3433 0.143008 +vn -0.943079 -0.157436 -0.292942 +v -0.934572 4.32618 0.092962 +vn -0.916562 -0.198514 -0.347139 +v -0.909209 4.30806 0.040129 +vn -0.897147 -0.227299 -0.378765 +v -0.881819 4.29129 -0.00871 +vn -0.859789 -0.266629 -0.435514 +v -0.896659 4.27265 0.034491 +vn -0.875312 -0.281777 -0.392977 +v -0.911277 4.25654 0.082118 +vn -0.886264 -0.298483 -0.35418 +v -0.928822 4.24159 0.142611 +vn -0.899053 -0.307412 -0.311771 +v -0.991158 4.27483 0.351335 +vn -0.960174 -0.228331 -0.161027 +v -0.977627 4.259 0.301472 +vn -0.94628 -0.256597 -0.196755 +v -0.961743 4.24301 0.251539 +vn -0.929093 -0.287215 -0.23301 +v -0.94274 4.22691 0.202013 +vn -0.909411 -0.315834 -0.270594 +v -0.953258 4.21105 0.260433 +vn -0.916926 -0.325108 -0.231412 +v -0.960125 4.19359 0.317326 +vn -0.921457 -0.335345 -0.196117 +v -0.96372 4.17432 0.372367 +vn -0.923254 -0.348563 -0.161572 +v -0.921049 4.21076 0.15258 +vn -0.886244 -0.345809 -0.308199 +v -0.895984 4.19468 0.103817 +vn -0.860269 -0.373243 -0.347313 +v -0.867849 4.17868 0.055427 +vn -0.83077 -0.400889 -0.386147 +v -0.83608 4.16293 0.00798 +vn -0.798983 -0.425296 -0.425147 +v -0.858098 4.14872 0.067281 +vn -0.817867 -0.432149 -0.379923 +v -0.875427 4.13353 0.125769 +vn -0.832467 -0.438835 -0.338263 +v -0.888498 4.11707 0.182987 +vn -0.843249 -0.446724 -0.298948 +v -0.991925 4.44335 0.250439 +vn -0.978658 -0.0174511 -0.204752 +v -1.00009 4.48611 0.294758 +vn -0.985024 0.032556 -0.169315 +v -0.98364 4.40309 0.220431 +vn -0.970104 -0.0645527 -0.233945 +v -0.986888 4.50248 0.228344 +vn -0.978172 0.0334814 -0.205082 +v -0.997005 4.51539 0.284413 +vn -0.983892 0.0600509 -0.168376 +v -0.978725 4.55992 0.206362 +vn -0.975276 0.0850243 -0.203981 +v -0.982603 4.60472 0.254433 +vn -0.977072 0.135843 -0.163944 +v -0.959527 4.46733 0.11896 +vn -0.957443 -0.0306607 -0.28699 +v -0.97467 4.48576 0.173127 +vn -0.970031 0.00137076 -0.242976 +v -0.971288 4.51421 0.161758 +vn -0.969128 0.0298014 -0.244749 +v -0.921585 4.3725 0.038009 +vn -0.914822 -0.151148 -0.374506 +v -0.943006 4.42043 0.077619 +vn -0.938981 -0.0936299 -0.330982 +v -0.90222 4.33155 0.011483 +vn -0.890651 -0.203918 -0.406398 +v -0.919077 4.43065 0.012378 +vn -0.918135 -0.0987906 -0.383756 +v -0.941149 4.44885 0.065206 +vn -0.940241 -0.0659982 -0.334053 +v -0.913026 4.48723 -0.012039 +vn -0.917942 -0.039783 -0.394715 +v -0.929932 4.53325 0.028983 +vn -0.936832 0.0192993 -0.349246 +v -0.893355 4.41272 -0.039827 +vn -0.891285 -0.13374 -0.433273 +v -0.891031 4.44114 -0.052097 +vn -0.892076 -0.102214 -0.440174 +v -1.02126 4.50152 0.515186 +vn -0.995132 0.0946277 -0.0275213 +v -1.01741 4.51436 0.458308 +vn -0.9931 0.099969 -0.0613007 +v -1.01205 4.52185 0.400278 +vn -0.990495 0.0971536 -0.0973677 +v -1.00628 4.59774 0.603554 +vn -0.979634 0.197655 0.035365 +v -1.00787 4.55209 0.392024 +vn -0.987607 0.124782 -0.0951914 +v -1.00836 4.57602 0.443946 +vn -0.986147 0.155256 -0.0583853 +v -1.00716 4.59595 0.496516 +vn -0.982888 0.182476 -0.0251649 +v -1.00415 4.61324 0.548691 +vn -0.979681 0.20047 0.00610402 +v -1.00098 4.62623 0.489902 +vn -0.97939 0.200601 -0.0235519 +v -0.996412 4.63645 0.426498 +vn -0.979901 0.191782 -0.0548938 +v -0.99135 4.63999 0.366823 +vn -0.978686 0.183539 -0.0921284 +v -0.999725 4.62923 0.599188 +vn -0.974646 0.220841 0.0359784 +v -0.993248 4.64472 0.650266 +vn -0.969568 0.234587 0.070046 +v -0.978088 4.66945 0.738469 +vn -0.958023 0.252778 0.135264 +v -0.978256 4.68941 0.690436 +vn -0.962304 0.254431 0.096107 +v -0.975202 4.72637 0.598955 +vn -0.964869 0.256813 0.0554589 +v -0.829218 1.67345 -1.80428 +vn -0.610023 -0.327486 -0.721543 +v -0.836201 1.78219 -1.8401 +vn -0.635143 -0.233454 -0.736269 +v -0.923931 1.67241 -1.71806 +vn -0.657048 -0.314692 -0.685023 +v -0.816571 1.57057 -1.7606 +vn -0.587802 -0.419789 -0.691568 +v -0.709647 1.55812 -1.83674 +vn -0.519289 -0.435268 -0.735446 +v -0.720846 1.67149 -1.88748 +vn -0.538356 -0.344164 -0.769236 +v -0.586997 1.54739 -1.90677 +vn -0.419393 -0.451455 -0.78759 +v -0.71393 1.45847 -1.76633 +vn -0.513599 -0.525182 -0.678528 +v -0.581489 1.4283 -1.83078 +vn -0.408754 -0.554931 -0.724549 +v -0.726631 1.79214 -1.92981 +vn -0.559705 -0.256727 -0.787922 +v -0.596532 1.67077 -1.96343 +vn -0.432393 -0.360233 -0.826601 +v -0.601034 1.80257 -2.01113 +vn -0.447326 -0.279518 -0.84957 +v -0.311797 1.67323 -2.06597 +vn -0.196481 -0.370919 -0.907642 +v -0.350341 1.7086 -2.0711 +vn -0.223853 -0.351104 -0.909184 +v -0.425839 1.77846 -2.07565 +vn -0.285764 -0.31332 -0.905632 +v -0.313867 1.82097 -2.11895 +vn -0.197915 -0.300098 -0.933151 +v -0.459317 1.67495 -2.025 +vn -0.319017 -0.366395 -0.874061 +v -0.462469 1.81614 -2.07596 +vn -0.325928 -0.29154 -0.89932 +v -0.351771 1.85678 -2.12155 +vn -0.227765 -0.282969 -0.931693 +v -0.306774 1.53506 -2.00281 +vn -0.195463 -0.460833 -0.865695 +v -0.345442 1.56913 -2.01109 +vn -0.221977 -0.436279 -0.872002 +v -0.386561 1.67237 -2.0471 +vn -0.25192 -0.370829 -0.89388 +v -0.421807 1.6376 -2.02163 +vn -0.280997 -0.390682 -0.876589 +v -0.299501 1.40969 -1.92752 +vn -0.191975 -0.569624 -0.799171 +v -0.337851 1.44147 -1.93961 +vn -0.218465 -0.540049 -0.812785 +v -0.414127 1.50671 -1.95741 +vn -0.276494 -0.484589 -0.829894 +v -0.451988 1.54289 -1.9645 +vn -0.313688 -0.456184 -0.832764 +v -0.439624 1.42094 -1.89207 +vn -0.301216 -0.567278 -0.766462 +v -0.272891 1.63779 -2.05895 +vn -0.169889 -0.39076 -0.904679 +v -0.194503 1.56737 -2.03926 +vn -0.119411 -0.434677 -0.892635 +v -0.157709 1.67503 -2.09092 +vn -0.0939346 -0.368918 -0.924703 +v -0.118186 1.63907 -2.0797 +vn -0.0688825 -0.388225 -0.918987 +v -0.155263 1.53284 -2.02665 +vn -0.0949034 -0.459053 -0.883326 +v -0.267944 1.50133 -1.99251 +vn -0.169338 -0.485824 -0.857496 +v -0.190263 1.43566 -1.96595 +vn -0.119056 -0.541032 -0.832532 +v -0.116143 1.49927 -2.01235 +vn -0.0697162 -0.484008 -0.872282 +v -0.151629 1.40418 -1.94975 +vn -0.0943838 -0.571005 -0.815503 +v -0.275376 1.78472 -2.11458 +vn -0.170211 -0.315832 -0.933423 +v -0.235375 1.67412 -2.08054 +vn -0.144201 -0.370127 -0.917721 +v -0.197166 1.71155 -2.10054 +vn -0.118568 -0.350051 -0.929196 +v -0.274773 1.93869 -2.16138 +vn -0.171888 -0.259114 -0.950429 +v -0.197795 1.86446 -2.1518 +vn -0.118135 -0.285784 -0.950985 +v -0.158599 1.82689 -2.14458 +vn -0.0930673 -0.300117 -0.949352 +v -0.119113 1.78953 -2.13586 +vn -0.0678894 -0.314591 -0.946797 +v -0.118644 1.94664 -2.18289 +vn -0.0673656 -0.260621 -0.963088 +v -0.777625 1.38913 -1.65138 +vn -0.539947 -0.600034 -0.590269 +v -0.746714 1.23159 -1.47481 +vn -0.486446 -0.749647 -0.448776 +v -0.896645 1.3326 -1.45819 +vn -0.558332 -0.671832 -0.486732 +v -0.644944 1.20038 -1.52404 +vn -0.419448 -0.782859 -0.459561 +v -0.637133 1.26865 -1.63339 +vn -0.436843 -0.71706 -0.543134 +v -0.531427 1.16863 -1.56197 +vn -0.330862 -0.820527 -0.466117 +v -0.674194 1.36036 -1.70968 +vn -0.476161 -0.623029 -0.620568 +v -0.553978 1.31635 -1.74697 +vn -0.377153 -0.66647 -0.643096 +v -0.52665 1.23154 -1.663 +vn -0.342591 -0.757384 -0.555878 +v -0.282504 1.20652 -1.73493 +vn -0.167215 -0.78455 -0.597093 +v -0.428602 1.31327 -1.80529 +vn -0.279664 -0.671107 -0.686589 +v -0.287397 1.29969 -1.83896 +vn -0.181708 -0.691932 -0.698722 +v -0.416497 1.2215 -1.70662 +vn -0.25678 -0.768286 -0.586345 +v -0.328419 1.32843 -1.85489 +vn -0.212164 -0.65503 -0.725205 +v -0.276284 1.12941 -1.61769 +vn -0.146841 -0.867714 -0.474879 +v -0.40776 1.14497 -1.59368 +vn -0.232303 -0.849625 -0.47347 +v -0.139631 1.12094 -1.63315 +vn -0.0725763 -0.877574 -0.473916 +v -0.141265 1.19897 -1.75439 +vn -0.0885186 -0.796748 -0.597794 +v -0.26116 1.37875 -1.91332 +vn -0.165499 -0.599415 -0.783143 +v -0.184934 1.31987 -1.87877 +vn -0.114858 -0.659496 -0.742881 +v -0.147232 1.29225 -1.8586 +vn -0.090249 -0.688971 -0.719148 +v -0.109899 1.26616 -1.83679 +vn -0.0652456 -0.717484 -0.693512 +v -0.113262 1.37408 -1.93181 +vn -0.0689549 -0.600944 -0.796311 +v -0.345517 3.7519 -0.114254 +vn -0.467437 -0.617685 -0.632431 +v -0.372745 3.73248 -0.074375 +vn -0.509185 -0.590022 -0.626582 +v -0.426079 3.76262 -0.058507 +vn -0.533793 -0.611832 -0.583718 +v -0.437127 3.66875 0.037634 +vn -0.621659 -0.458793 -0.634861 +v -0.50204 3.77488 0.004418 +vn -0.589089 -0.603141 -0.537769 +v -0.298765 3.6568 -0.069327 +vn -0.502759 -0.45134 -0.737242 +v -0.520009 3.75397 0.047781 +vn -0.618952 -0.573965 -0.536155 +v -0.174302 3.7364 -0.196439 +vn -0.279818 -0.622956 -0.730498 +v -0.210146 3.71707 -0.16485 +vn -0.343547 -0.593917 -0.727488 +v -0.142682 3.64196 -0.143397 +vn -0.305135 -0.377851 -0.87414 +v -0.315838 3.77267 -0.155947 +vn -0.420806 -0.649987 -0.632802 +v -0.280615 3.78915 -0.194594 +vn -0.379412 -0.653712 -0.654757 +v -0.242513 3.80757 -0.23334 +vn -0.328139 -0.664766 -0.671127 +v -0.395628 3.84922 -0.179953 +vn -0.463402 -0.655328 -0.596493 +v -0.359038 3.86658 -0.22555 +vn -0.424658 -0.658928 -0.62087 +v -0.348321 3.84227 -0.206959 +vn -0.422843 -0.660923 -0.619987 +v -0.318255 3.88403 -0.269628 +vn -0.382811 -0.654841 -0.651643 +v -0.273446 3.90184 -0.311358 +vn -0.334663 -0.650056 -0.682223 +v -0.299893 3.83612 -0.231284 +vn -0.379128 -0.662581 -0.645948 +v -0.250623 3.83072 -0.252454 +vn -0.329371 -0.667268 -0.668033 +v -0.135037 3.75561 -0.226585 +vn -0.214597 -0.647608 -0.73113 +v -0.047703 3.79199 -0.277383 +vn -0.079988 -0.689419 -0.719933 +v -0.200562 3.82625 -0.270411 +vn -0.274508 -0.669273 -0.690448 +v -0.154817 3.84529 -0.304746 +vn -0.215433 -0.671434 -0.70906 +v -0.149968 3.82248 -0.284546 +vn -0.214771 -0.674073 -0.706752 +v -0.105772 3.86379 -0.334622 +vn -0.151181 -0.667059 -0.729505 +v -0.054042 3.88046 -0.357972 +vn -0.0795967 -0.663717 -0.743736 +v -0.0492 3.81236 -0.296126 +vn -0.0789085 -0.676832 -0.731896 +v -0.482383 3.79685 -0.041788 +vn -0.555603 -0.632865 -0.539247 +v -0.456451 3.81348 -0.086897 +vn -0.529663 -0.639781 -0.5569 +v -0.428051 3.8316 -0.133456 +vn -0.49725 -0.650867 -0.573685 +v -0.626845 3.82704 0.097888 +vn -0.657136 -0.603324 -0.451854 +v -0.610887 3.84523 0.051098 +vn -0.637943 -0.613686 -0.465208 +v -0.593011 3.86465 0.00173 +vn -0.615082 -0.626675 -0.47849 +v -0.441773 3.85678 -0.150313 +vn -0.499055 -0.652596 -0.570143 +v -0.486467 3.865 -0.118521 +vn -0.533064 -0.645701 -0.54673 +v -0.529739 3.87373 -0.084599 +vn -0.563116 -0.641503 -0.520937 +v -0.57123 3.88297 -0.049059 +vn -0.592884 -0.632831 -0.498009 +v -0.545263 3.90036 -0.10053 +vn -0.567753 -0.637803 -0.520446 +v -0.514873 3.9171 -0.152117 +vn -0.542218 -0.634991 -0.55026 +v -0.480082 3.93344 -0.203018 +vn -0.512458 -0.631286 -0.582121 +v -0.610979 3.8926 -0.011915 +vn -0.619569 -0.626672 -0.472669 +v -0.648617 3.90259 0.02632 +vn -0.647001 -0.61569 -0.449795 +v -0.684254 3.91286 0.065657 +vn -0.671937 -0.607097 -0.424186 +v -0.717449 3.92336 0.105554 +vn -0.698366 -0.593834 -0.399557 +v -0.702922 3.94238 0.053241 +vn -0.680155 -0.600755 -0.420098 +v -0.684058 3.96012 -0.00073 +vn -0.66308 -0.600334 -0.44713 +v -0.66074 3.97681 -0.055622 +vn -0.643536 -0.598793 -0.476768 +v -0.32498 5.10806 -0.475289 +vn -0.421593 0.518414 -0.74398 +v -0.372087 5.0874 -0.460664 +vn -0.474844 0.479282 -0.738114 +v -0.479927 5.01949 -0.422896 +vn -0.572892 0.404955 -0.712605 +v -0.467384 5.12784 -0.360765 +vn -0.548483 0.519851 -0.654921 +v -0.331169 5.01543 -0.526155 +vn -0.443305 0.402615 -0.800863 +v -0.446592 4.96302 -0.476799 +vn -0.550999 0.342074 -0.761174 +v -0.411004 4.93287 -0.513522 +vn -0.518998 0.297724 -0.80125 +v -0.510124 5.10405 -0.34186 +vn -0.590944 0.486164 -0.643762 +v -0.619066 5.05554 -0.264659 +vn -0.68346 0.434906 -0.586293 +v -0.569882 4.95368 -0.378898 +vn -0.649047 0.337441 -0.681815 +v -0.584946 5.04048 -0.313361 +vn -0.655491 0.425621 -0.623842 +v -0.609967 5.02132 -0.298886 +vn -0.684097 0.398707 -0.610773 +v -0.165966 5.09957 -0.550409 +vn -0.244427 0.522865 -0.816619 +v -0.214544 5.07662 -0.547839 +vn -0.310397 0.477543 -0.821953 +v -0.135704 5.02018 -0.601113 +vn -0.209951 0.401403 -0.891513 +v -0.182952 4.99514 -0.598928 +vn -0.273692 0.366046 -0.88944 +v -0.230926 4.97014 -0.592273 +vn -0.333421 0.331096 -0.882726 +v -0.327022 4.92472 -0.565473 +vn -0.438893 0.290464 -0.850296 +v -0.047365 4.95439 -0.640698 +vn -0.0785987 0.310578 -0.947293 +v -0.162989 4.87539 -0.642416 +vn -0.246222 0.219692 -0.943986 +v -0.159805 5.19332 -0.483587 +vn -0.228377 0.62843 -0.743586 +v -0.153204 5.2758 -0.404919 +vn -0.203014 0.730662 -0.651857 +v -0.45526 5.16617 -0.338882 +vn -0.539574 0.557563 -0.63086 +v -0.54175 4.66555 -0.477151 +vn -0.603434 0.0449395 -0.796146 +v -0.49357 4.65611 -0.512279 +vn -0.561019 0.0264363 -0.827381 +v -0.558937 4.60332 -0.465397 +vn -0.610184 -0.010479 -0.792191 +v -0.516758 4.56145 -0.494541 +vn -0.5689 -0.0571648 -0.820418 +v -0.631418 4.68657 -0.399821 +vn -0.680467 0.0837555 -0.727976 +v -0.587827 4.67574 -0.439724 +vn -0.64297 0.0643576 -0.763183 +v -0.597195 4.64511 -0.433745 +vn -0.6472 0.0369761 -0.761423 +v -0.574309 4.54114 -0.450453 +vn -0.615947 -0.0665929 -0.784968 +v -0.523662 4.52999 -0.487089 +vn -0.571149 -0.0854361 -0.816388 +v -0.587298 4.47944 -0.432659 +vn -0.620561 -0.124241 -0.774253 +v -0.540643 4.43678 -0.460184 +vn -0.576351 -0.171602 -0.798982 +v -0.668214 4.56579 -0.369744 +vn -0.698283 -0.0255055 -0.715367 +v -0.622673 4.55308 -0.411366 +vn -0.6581 -0.0461961 -0.751512 +v -0.629921 4.52253 -0.402422 +vn -0.661116 -0.0749195 -0.746533 +v -0.710541 4.70998 -0.314297 +vn -0.749067 0.124052 -0.650776 +v -0.672447 4.69801 -0.358062 +vn -0.715658 0.104103 -0.690649 +v -0.731587 4.6517 -0.298692 +vn -0.761487 0.0730444 -0.644051 +v -0.702134 4.60892 -0.33508 +vn -0.731611 0.0245941 -0.681279 +v -0.74567 4.72246 -0.269118 +vn -0.780523 0.145058 -0.608064 +v -0.756674 4.69391 -0.261049 +vn -0.787576 0.120621 -0.604297 +v -0.750398 4.59316 -0.280461 +vn -0.772326 0.0196551 -0.634922 +v -0.710966 4.57916 -0.326124 +vn -0.736291 -0.00305811 -0.676658 +v -0.76637 4.53462 -0.260041 +vn -0.781127 -0.0368818 -0.623282 +v -0.732791 4.49026 -0.295702 +vn -0.746883 -0.0902812 -0.658798 +v -0.786595 4.6077 -0.233257 +vn -0.806372 0.0443747 -0.589742 +v -0.795145 4.57885 -0.222875 +vn -0.811591 0.0170382 -0.583977 +v -0.398005 4.60723 -0.569524 +vn -0.468207 -0.0366826 -0.882857 +v -0.349194 4.56726 -0.591032 +vn -0.416076 -0.0804128 -0.905767 +v -0.297157 4.52778 -0.608756 +vn -0.358888 -0.122053 -0.925366 +v -0.242093 4.4891 -0.622225 +vn -0.296843 -0.161512 -0.941168 +v -0.301335 4.49506 -0.602402 +vn -0.359572 -0.149448 -0.921072 +v -0.359295 4.50224 -0.578588 +vn -0.418112 -0.135565 -0.898223 +v -0.4159 4.51047 -0.551399 +vn -0.472488 -0.120071 -0.87312 +v -0.173667 4.58438 -0.653705 +vn -0.229415 -0.0895781 -0.969198 +v -0.117563 4.55015 -0.661166 +vn -0.159144 -0.123475 -0.979503 +v -0.059551 4.52123 -0.664363 +vn -0.0823847 -0.150488 -0.985173 +v -0.06047 4.48779 -0.658782 +vn -0.0821746 -0.177614 -0.980663 +v -0.121232 4.48345 -0.650274 +vn -0.159208 -0.177257 -0.971202 +v -0.181954 4.48457 -0.638261 +vn -0.230097 -0.171471 -0.957942 +v -0.420995 4.47853 -0.543631 +vn -0.473792 -0.147869 -0.868134 +v -0.367843 4.43806 -0.562877 +vn -0.419884 -0.190574 -0.887344 +v -0.311657 4.39861 -0.578185 +vn -0.361557 -0.230595 -0.903384 +v -0.252744 4.36054 -0.589128 +vn -0.298742 -0.268703 -0.915725 +v -0.314324 4.36721 -0.568673 +vn -0.362087 -0.258304 -0.895641 +v -0.374505 4.37529 -0.544153 +vn -0.421288 -0.246331 -0.872833 +v -0.433278 4.38447 -0.516139 +vn -0.476549 -0.232733 -0.847783 +v -0.184342 4.45174 -0.631261 +vn -0.230454 -0.197654 -0.952798 +v -0.124392 4.41776 -0.635913 +vn -0.159372 -0.22979 -0.960102 +v -0.062807 4.3894 -0.636602 +vn -0.0823451 -0.255324 -0.963343 +v -0.063446 4.35737 -0.62767 +vn -0.0822021 -0.281767 -0.955955 +v -0.126954 4.3537 -0.618305 +vn -0.1596 -0.282063 -0.946028 +v -0.190225 4.35536 -0.605679 +vn -0.231277 -0.277123 -0.932584 +v -0.337953 4.63256 -0.59994 +vn -0.413743 -0.0241581 -0.910073 +v -0.391445 4.63955 -0.573906 +vn -0.466482 -0.00840685 -0.884491 +v -0.325906 4.69758 -0.605057 +vn -0.410969 0.0342112 -0.911007 +v -0.370485 4.73578 -0.581007 +vn -0.460463 0.0792175 -0.884137 +v -0.227348 4.6215 -0.641751 +vn -0.294873 -0.0510713 -0.954171 +v -0.28321 4.62654 -0.622778 +vn -0.356528 -0.0386423 -0.933485 +v -0.278157 4.65942 -0.625473 +vn -0.355618 -0.0095182 -0.934583 +v -0.313388 4.76176 -0.60615 +vn -0.407437 0.0955003 -0.908226 +v -0.363308 4.7674 -0.581449 +vn -0.458053 0.109819 -0.882115 +v -0.300864 4.82624 -0.602681 +vn -0.403204 0.160484 -0.900928 +v -0.339566 4.85935 -0.577273 +vn -0.448378 0.207848 -0.869342 +v -0.210468 4.75291 -0.64583 +vn -0.292002 0.0697335 -0.953872 +v -0.262493 4.75697 -0.6278 +vn -0.352311 0.0818459 -0.932297 +v -0.25674 4.78883 -0.626545 +vn -0.351067 0.11367 -0.929425 +v -0.11356 4.61723 -0.668359 +vn -0.159092 -0.0673041 -0.984967 +v -0.170665 4.61777 -0.657105 +vn -0.229136 -0.0616528 -0.97144 +v -0.109312 4.68406 -0.67163 +vn -0.159019 -0.00768373 -0.987246 +v -0.161153 4.71732 -0.661018 +vn -0.228106 0.029207 -0.973198 +v -0.056559 4.62204 -0.675858 +vn -0.0823086 -0.0674749 -0.99432 +v -0.055491 4.65563 -0.677641 +vn -0.0825489 -0.0373723 -0.995886 +v -0.104882 4.75001 -0.670777 +vn -0.158619 0.055157 -0.985798 +v -0.15793 4.75004 -0.660352 +vn -0.22779 0.0604843 -0.97183 +v -0.134932 4.84501 -0.655183 +vn -0.208926 0.16107 -0.964576 +v -0.052242 4.75509 -0.677114 +vn -0.0823938 0.0566555 -0.994988 +v -0.050805 4.78749 -0.674774 +vn -0.0816562 0.090556 -0.992538 +v -0.485132 4.68754 -0.516353 +vn -0.557947 0.0546389 -0.828076 +v -0.523271 4.72737 -0.485398 +vn -0.5957 0.100566 -0.796886 +v -0.557782 4.76675 -0.452111 +vn -0.628693 0.146013 -0.763823 +v -0.588697 4.80542 -0.416689 +vn -0.657714 0.189978 -0.728918 +v -0.547436 4.79664 -0.454425 +vn -0.623311 0.173659 -0.762447 +v -0.504066 4.78835 -0.489796 +vn -0.586789 0.157173 -0.79434 +v -0.458803 4.78074 -0.523067 +vn -0.547268 0.140967 -0.825001 +v -0.661621 4.72749 -0.364124 +vn -0.70962 0.129886 -0.692509 +v -0.687859 4.76767 -0.326869 +vn -0.735322 0.173624 -0.6551 +v -0.710239 4.80703 -0.288567 +vn -0.757421 0.215384 -0.616379 +v -0.697959 4.8348 -0.293427 +vn -0.749107 0.238567 -0.618001 +v -0.664139 4.82454 -0.335972 +vn -0.720356 0.222415 -0.656977 +v -0.627669 4.81478 -0.377287 +vn -0.689812 0.206578 -0.693891 +v -0.449817 4.8112 -0.52316 +vn -0.542742 0.170975 -0.822313 +v -0.484589 4.84805 -0.49006 +vn -0.575985 0.215886 -0.788438 +v -0.516217 4.88416 -0.454737 +vn -0.604361 0.258383 -0.753649 +v -0.54469 4.91935 -0.417453 +vn -0.628951 0.298585 -0.717821 +v -0.506002 4.91251 -0.452701 +vn -0.597333 0.286908 -0.748917 +v -0.464782 4.90643 -0.486139 +vn -0.562984 0.275504 -0.779196 +v -0.419618 4.90235 -0.518646 +vn -0.524841 0.264274 -0.809136 +v -0.61605 4.8433 -0.379664 +vn -0.682539 0.232039 -0.693036 +v -0.639984 4.88025 -0.3412 +vn -0.704076 0.271226 -0.656288 +v -0.660559 4.91628 -0.301844 +vn -0.722312 0.307605 -0.61939 +v -0.677919 4.95132 -0.261759 +vn -0.737566 0.342445 -0.582004 +v -0.648185 4.9428 -0.302596 +vn -0.712119 0.332429 -0.618366 +v -0.581429 4.92681 -0.38063 +vn -0.658455 0.309821 -0.685892 +v -0.297999 5.39625 -0.159791 +vn -0.31725 0.835937 -0.447841 +v -0.153937 5.45965 -0.115511 +vn -0.17374 0.891135 -0.419157 +v -0.152323 5.4083 -0.216105 +vn -0.176188 0.857377 -0.483594 +v -0.303317 5.44444 -0.056075 +vn -0.316757 0.868607 -0.381033 +v -0.43099 5.37237 -0.088143 +vn -0.434581 0.804281 -0.405304 +v -0.443234 5.41682 0.02559 +vn -0.434894 0.836995 -0.332123 +v -0.566991 5.37265 0.107332 +vn -0.556 0.783346 -0.27791 +v -0.292707 5.33998 -0.257623 +vn -0.324883 0.786527 -0.525192 +v -0.404608 5.26582 -0.278184 +vn -0.454145 0.680373 -0.575191 +v -0.524124 5.28479 -0.134629 +vn -0.555002 0.694354 -0.458088 +v -0.151194 5.34726 -0.314312 +vn -0.184837 0.80658 -0.561484 +v -0.712341 5.19834 0.03604 +vn -0.757367 0.559118 -0.337316 +v -0.774087 5.11454 0.055071 +vn -0.824954 0.465194 -0.321009 +v -0.743679 5.22684 0.180839 +vn -0.780108 0.585553 -0.22036 +v -0.804876 5.14518 0.210298 +vn -0.848706 0.489786 -0.199519 +v -0.717083 5.08371 -0.100956 +vn -0.774102 0.453264 -0.441947 +v -0.651162 5.17181 -0.112613 +vn -0.701423 0.547356 -0.456517 +v -0.638442 5.08284 -0.219577 +vn -0.698115 0.465237 -0.544234 +v -0.650775 5.05999 -0.222267 +vn -0.715548 0.431643 -0.549249 +v -0.775228 5.02134 -0.053236 +vn -0.828101 0.391911 -0.400818 +v -0.711541 5.05073 -0.141699 +vn -0.772416 0.419578 -0.476788 +v -0.693095 4.98334 -0.221391 +vn -0.745835 0.383056 -0.544975 +v -0.705041 4.96023 -0.220286 +vn -0.762511 0.351252 -0.543322 +v -0.771024 4.98824 -0.091668 +vn -0.821718 0.371032 -0.432568 +v -0.666794 5.30642 0.156218 +vn -0.682115 0.690644 -0.240268 +v -0.604358 5.3869 0.249768 +vn -0.609975 0.777265 -0.15424 +v -0.576561 5.40483 0.238284 +vn -0.56229 0.807235 -0.179449 +v -0.223692 3.11185 -2.26331 +vn -0.35384 0.125689 -0.926823 +v -0.249216 3.05328 -2.25987 +vn -0.377885 0.0943869 -0.921029 +v -0.257906 3.10681 -2.24979 +vn -0.415581 0.135898 -0.899347 +v -0.190276 3.1014 -2.2756 +vn -0.268668 0.0883537 -0.959172 +v -0.228399 2.8768 -2.27721 +vn -0.266899 0.0223374 -0.963465 +v -0.23871 2.81913 -2.27513 +vn -0.271931 0.0120926 -0.962241 +v -0.245593 2.75877 -2.27368 +vn -0.264466 -0.00233969 -0.964392 +v -0.276024 2.75671 -2.26447 +vn -0.311198 0.00555219 -0.950329 +v -0.298143 2.81291 -2.2554 +vn -0.36814 0.0312221 -0.929246 +v -0.309219 2.86637 -2.24872 +vn -0.406638 0.0505675 -0.912189 +v -0.310702 3.11262 -2.21818 +vn -0.576411 0.179991 -0.797091 +v -0.338917 3.06426 -2.20712 +vn -0.610692 0.163985 -0.774703 +v -0.335606 3.12445 -2.19511 +vn -0.641972 0.209828 -0.737458 +v -0.360987 3.12538 -2.17029 +vn -0.72672 0.226205 -0.648621 +v -0.331378 2.86264 -2.23823 +vn -0.457118 0.0539328 -0.887769 +v -0.353068 2.81313 -2.22977 +vn -0.483259 0.0614082 -0.873321 +v -0.360979 2.74811 -2.2293 +vn -0.455689 0.034953 -0.889452 +v -0.382362 2.69228 -2.2204 +vn -0.472478 0.0426904 -0.880308 +v -0.390418 2.75755 -2.21221 +vn -0.528998 0.0631751 -0.846269 +v -0.406709 2.81702 -2.19478 +vn -0.600544 0.10368 -0.792841 +v -0.409956 2.87927 -2.18306 +vn -0.646032 0.136081 -0.751082 +v -0.163658 3.11479 -2.28062 +vn -0.199722 0.0989366 -0.974845 +v -0.151593 3.05701 -2.28736 +vn -0.177346 0.0644277 -0.982037 +v -0.20141 3.0464 -2.27686 +vn -0.271298 0.0750416 -0.959566 +v -0.065102 3.10735 -2.29412 +vn -0.0544256 0.0735819 -0.995803 +v -0.097007 3.10898 -2.29163 +vn -0.106179 0.0754687 -0.991479 +v -0.048511 3.05335 -2.29834 +vn -0.0437326 0.0569222 -0.99742 +v -0.09873 3.05237 -2.29497 +vn -0.102516 0.0565886 -0.99312 +v -0.200117 2.87809 -2.28423 +vn -0.223195 0.0164931 -0.974634 +v -0.178004 2.82044 -2.28911 +vn -0.182662 -0.00111464 -0.983175 +v -0.153288 2.76415 -2.29262 +vn -0.142149 -0.0181477 -0.989679 +v -0.085069 2.8835 -2.30082 +vn -0.0729546 0.00499597 -0.997323 +v -0.11404 2.88184 -2.29832 +vn -0.105639 0.00627286 -0.994385 +v -0.057251 2.82658 -2.30232 +vn -0.0480596 -0.00794323 -0.998813 +v -0.029723 2.78473 -2.30276 +vn -0.0225994 -0.019531 -0.999554 +v -0.118225 2.82332 -2.29771 +vn -0.10796 -0.0069973 -0.994131 +v -0.12229 2.7656 -2.29659 +vn -0.107175 -0.0203933 -0.994031 +v -0.147524 3.23247 -2.27165 +vn -0.202111 0.109059 -0.973271 +v -0.127284 3.28799 -2.26814 +vn -0.185453 0.150457 -0.971066 +v -0.117417 3.43745 -2.2385 +vn -0.203344 0.249464 -0.946794 +v -0.061474 3.24132 -2.28189 +vn -0.0509474 0.107152 -0.992937 +v -0.049756 3.45088 -2.24416 +vn -0.0593977 0.255054 -0.965101 +v -0.188559 3.33063 -2.24269 +vn -0.384877 0.21654 -0.897207 +v -0.17147 3.28853 -2.25741 +vn -0.286532 0.166883 -0.943424 +v -0.300788 3.2284 -2.19708 +vn -0.656304 0.193073 -0.729375 +v -1.41062 2.57796 0.806361 +vn -0.840467 0.527187 0.125255 +v -1.38832 2.57245 0.952098 +vn -0.839469 0.515581 0.171663 +v -1.42927 2.57806 0.650838 +vn -0.838302 0.539965 0.0754116 +v -1.46227 2.48124 0.835465 +vn -0.873188 0.465387 0.144765 +v -1.43581 2.47725 0.984192 +vn -0.869471 0.455749 0.19056 +v -1.48461 2.48081 0.676286 +vn -0.874179 0.475801 0.0970802 +v -1.34071 2.69402 0.727858 +vn -0.792887 0.602819 0.0891041 +v -1.36263 2.56523 1.08121 +vn -0.832531 0.507675 0.221717 +v -1.40617 2.47166 1.11588 +vn -0.860674 0.448621 0.240791 +v -1.51121 2.27168 1.02903 +vn -0.93405 0.28175 0.219469 +v -1.56661 2.14969 0.901608 +vn -0.969379 0.155551 0.19002 +v -1.52808 2.16308 1.06838 +vn -0.956231 0.173009 0.235987 +v -1.54373 2.2697 0.87656 +vn -0.94338 0.281601 0.175316 +v -1.58506 2.17938 0.764113 +vn -0.971602 0.185307 0.147144 +v -1.54571 2.04631 1.05025 +vn -0.972355 0.0475176 0.228622 +v -1.5795 2.11795 0.856032 +vn -0.977605 0.118591 0.173854 +v -1.59676 2.05409 0.782164 +vn -0.988127 0.0403664 0.148239 +v -1.57466 2.02107 0.918315 +vn -0.982525 0.0130902 0.185669 +v -1.47764 2.37687 1.00977 +vn -0.902216 0.378378 0.206971 +v -1.50762 2.37842 0.858851 +vn -0.908781 0.38468 0.161673 +v -1.55684 2.29533 0.750782 +vn -0.939914 0.312187 0.138209 +v -1.53205 2.37845 0.699133 +vn -0.910874 0.395377 0.118261 +v -1.44463 2.37377 1.14318 +vn -0.891 0.373786 0.257687 +v -1.47572 2.27213 1.16345 +vn -0.920117 0.282807 0.270933 +v -1.51031 2.05648 1.18337 +vn -0.957719 0.0656783 0.28011 +v -1.49127 2.16751 1.19904 +vn -0.939881 0.180676 0.289794 +v -1.48302 1.4885 0.885728 +vn -0.944935 -0.297561 0.136218 +v -1.41562 2.0259 -1.03157 +vn -0.891013 0.271159 -0.3641 +v -1.47758 2.03282 -0.857866 +vn -0.902706 0.283528 -0.323625 +v -1.39499 2.09755 -1.01603 +vn -0.857847 0.38437 -0.341113 +v -1.45333 2.10866 -0.842537 +vn -0.857858 0.410156 -0.3096 +v -1.45698 1.97628 -0.954193 +vn -0.931918 0.153523 -0.328571 +v -1.46072 1.89727 -0.963118 +vn -0.94524 -0.00983626 -0.326227 +v -1.51548 1.98612 -0.775962 +vn -0.949557 0.153164 -0.273645 +v -1.50628 1.88579 -0.828968 +vn -0.954607 -0.0386308 -0.295354 +v -1.52041 1.90047 -0.78235 +vn -0.964247 -0.0115002 -0.264757 +v -1.59273 2.04812 -0.408733 +vn -0.970627 0.179474 -0.160227 +v -1.56031 2.01324 -0.59404 +vn -0.963165 0.163864 -0.213218 +v -1.58553 1.97047 -0.50038 +vn -0.979394 0.0646807 -0.191322 +v -1.58611 1.94293 -0.501589 +vn -0.981862 0.00150795 -0.189593 +v -1.56708 1.92002 -0.59881 +vn -0.981128 -0.00941403 -0.193131 +v -1.56227 2.0985 -0.493655 +vn -0.922191 0.305374 -0.237299 +v -1.52912 2.18481 -0.481706 +vn -0.860093 0.441165 -0.256152 +v -1.52642 2.05948 -0.677116 +vn -0.911983 0.298168 -0.281751 +v -1.49823 2.13933 -0.661548 +vn -0.858623 0.427073 -0.283506 +v -1.58468 2.14862 -0.310577 +vn -0.928785 0.31724 -0.191615 +v -1.61381 2.19016 0.003607 +vn -0.959035 0.272314 -0.0780786 +v -1.54816 2.23886 -0.301942 +vn -0.869504 0.443977 -0.216442 +v -1.57729 2.29122 0.006228 +vn -0.909011 0.40436 -0.100957 +v -1.52577 2.3347 -0.167605 +vn -0.839845 0.509644 -0.18688 +v -1.6022 2.08468 -0.311153 +vn -0.965275 0.203028 -0.164393 +v -1.61344 1.98632 -0.318218 +vn -0.990867 0.0346102 -0.130328 +v -1.6134 2.01095 -0.309907 +vn -0.988219 0.0774603 -0.131993 +v -1.62349 1.94783 -0.226337 +vn -0.995043 -0.0449754 -0.0886894 +v -1.63045 2.09843 -0.039443 +vn -0.987282 0.144715 -0.0658156 +v -1.63114 2.02343 -0.132559 +vn -0.995753 0.0508123 -0.0767676 +v -1.63708 1.98206 -0.038476 +vn -0.998674 -0.0266821 -0.0440268 +v -1.63547 2.07892 0.007084 +vn -0.993405 0.104351 -0.0475131 +v -1.60655 2.24396 0.366988 +vn -0.960201 0.277614 0.0307457 +v -1.61395 2.22185 0.187889 +vn -0.961792 0.273054 -0.0199245 +v -1.6202 2.20008 0.234191 +vn -0.971388 0.237488 -0.00234811 +v -1.62089 2.18601 0.370709 +vn -0.977949 0.205447 0.0375183 +v -1.6288 2.15193 0.327416 +vn -0.985797 0.165495 0.0285426 +v -1.622 2.17152 0.05226 +vn -0.97122 0.232033 -0.053785 +v -1.63333 2.13012 0.145091 +vn -0.987763 0.15494 -0.0178122 +v -1.631 2.12588 0.374112 +vn -0.990759 0.128802 0.0424954 +v -1.63701 2.10675 0.19195 +vn -0.993111 0.117149 -0.00273992 +v -1.63927 2.08182 0.238914 +vn -0.996738 0.0799005 0.0113595 +v -1.63913 2.0574 0.053982 +vn -0.997335 0.0657405 -0.0316319 +v -1.64211 2.00871 0.148711 +vn -0.999945 -0.00947521 -0.00450822 +v -1.60045 2.26726 0.320772 +vn -0.950219 0.311259 0.0142027 +v -1.58464 2.3096 0.228835 +vn -0.926615 0.375233 -0.0241701 +v -1.56314 2.36142 0.367787 +vn -0.912215 0.409499 0.0131864 +v -1.55504 2.3794 0.314824 +vn -0.900702 0.434385 -0.00679491 +v -1.52309 2.42748 0.177054 +vn -0.859796 0.505729 -0.0706289 +v -1.57384 2.33076 0.183161 +vn -0.911978 0.407009 -0.0513808 +v -1.60648 2.24194 0.141872 +vn -0.949979 0.309766 -0.0398202 +v -1.52703 2.38706 0.00543 +vn -0.850915 0.508818 -0.130565 +v -1.58603 2.27875 0.540168 +vn -0.950176 0.302031 0.077085 +v -1.58804 2.3005 0.36389 +vn -0.938316 0.345044 0.022526 +v -1.5735 2.33459 0.411415 +vn -0.92727 0.373102 0.0310835 +v -1.54935 2.34875 0.659542 +vn -0.923453 0.368554 0.106783 +v -1.54559 2.38302 0.547048 +vn -0.910659 0.40748 0.0682622 +v -1.51941 2.44516 0.475476 +vn -0.882459 0.469037 0.0356534 +v -1.50454 2.47374 0.343316 +vn -0.860279 0.509436 -0.0198675 +v -1.50111 2.47503 0.514567 +vn -0.870651 0.489654 0.046956 +v -1.61128 2.21965 0.4133 +vn -0.968571 0.244237 0.0471083 +v -1.61465 2.15808 0.548408 +vn -0.982208 0.164703 0.0902261 +v -1.63172 2.09887 0.42049 +vn -0.994218 0.0910757 0.0568866 +v -1.58489 2.23565 0.673496 +vn -0.961272 0.249034 0.118065 +v -1.62011 2.05154 0.599165 +vn -0.994456 0.0317677 0.100243 +v -1.60582 2.11474 0.68462 +vn -0.986207 0.108637 0.124871 +v -1.40919 2.33756 -0.536614 +vn -0.751245 0.606604 -0.260119 +v -1.46288 2.25815 -0.552794 +vn -0.799937 0.542662 -0.256162 +v -1.36839 2.42534 -0.441779 +vn -0.700407 0.654511 -0.284684 +v -1.30846 2.48859 -0.432932 +vn -0.645466 0.705424 -0.292833 +v -1.35365 2.37166 -0.609488 +vn -0.719572 0.639364 -0.270979 +v -1.29728 2.43515 -0.597033 +vn -0.66588 0.695609 -0.269689 +v -1.37437 2.48664 -0.279342 +vn -0.695857 0.663428 -0.275037 +v -1.37892 2.5441 -0.119018 +vn -0.709213 0.661517 -0.243746 +v -1.31391 2.6092 -0.12005 +vn -0.650073 0.709024 -0.273293 +v -1.46725 2.42238 -0.163303 +vn -0.782095 0.58538 -0.213677 +v -1.46655 2.47717 0.003324 +vn -0.796422 0.583271 -0.159711 +v -1.44313 2.56715 0.327889 +vn -0.815841 0.576226 -0.0486397 +v -1.462 2.52011 0.16843 +vn -0.810901 0.576721 -0.0991645 +v -1.37672 2.59755 0.038925 +vn -0.728768 0.658355 -0.188324 +v -1.4439 2.56979 0.491355 +vn -0.832939 0.553006 0.0199473 +v -1.29083 2.30985 -0.949967 +vn -0.768193 0.584335 -0.261595 +v -1.32846 2.3315 -0.782275 +vn -0.744258 0.616717 -0.256398 +v -1.27899 2.39428 -0.763865 +vn -0.691051 0.680551 -0.243513 +v -1.34153 2.27123 -0.882197 +vn -0.789723 0.557474 -0.256046 +v -1.3821 2.19844 -0.90475 +vn -0.821191 0.497799 -0.279 +v -1.38014 2.29825 -0.707733 +vn -0.768784 0.587403 -0.252842 +v -1.42755 2.22181 -0.72922 +vn -0.808458 0.52526 -0.265514 +v -1.06557 2.72008 -0.234891 +vn -0.549199 0.771514 -0.321165 +v -1.40878 1.73467 -1.04264 +vn -0.907126 -0.233639 -0.350051 +v -1.45521 1.68497 -0.863724 +vn -0.912492 -0.295924 -0.282466 +v -1.46014 1.71501 -0.877322 +vn -0.917151 -0.266555 -0.296282 +v -1.47821 1.74785 -0.848571 +vn -0.92872 -0.237024 -0.28513 +v -1.4213 1.81869 -1.05433 +vn -0.919868 -0.134731 -0.368361 +v -1.47522 1.78155 -0.882556 +vn -0.929983 -0.19512 -0.311544 +v -1.48243 1.81183 -0.878652 +vn -0.934748 -0.166408 -0.313933 +v -1.38603 1.64773 -1.03348 +vn -0.893416 -0.304584 -0.330208 +v -1.35764 1.55834 -1.01962 +vn -0.8778 -0.358033 -0.318245 +v -1.43515 1.62479 -0.861026 +vn -0.902506 -0.328343 -0.278699 +v -1.42441 1.58894 -0.851779 +vn -0.898278 -0.345988 -0.270902 +v -1.40305 1.53328 -0.849056 +vn -0.889861 -0.36902 -0.268275 +v -1.41687 1.56588 -0.846774 +vn -0.895589 -0.35569 -0.267216 +v -1.35288 1.63406 -1.10978 +vn -0.89038 -0.305623 -0.337371 +v -1.3306 1.20755 -0.540511 +vn -0.797528 -0.569348 -0.199478 +v -1.41499 1.3039 -0.381001 +vn -0.910103 -0.387836 -0.145932 +v -1.44351 1.37687 -0.386596 +vn -0.922224 -0.357941 -0.146222 +v -1.38767 1.31895 -0.556989 +vn -0.897268 -0.395597 -0.195994 +v -1.41588 1.39058 -0.565579 +vn -0.908284 -0.371638 -0.19211 +v -1.45633 1.37599 -0.296638 +vn -0.926196 -0.355692 -0.125075 +v -1.4801 1.38722 -0.115572 +vn -0.934898 -0.34602 -0.0789647 +v -1.44073 1.62411 1.24863 +vn -0.889984 -0.284696 0.356197 +v -1.2494 1.72762 -1.39296 +vn -0.846343 -0.194473 -0.495867 +v -1.23683 1.65397 -1.37834 +vn -0.82693 -0.289782 -0.481886 +v -1.52978 1.80104 1.05236 +vn -0.967853 -0.147503 0.203725 +v -1.55279 1.7772 0.907214 +vn -0.970891 -0.178181 0.160069 +v -1.5091 1.68233 1.04466 +vn -0.959193 -0.210735 0.188522 +v -1.56019 1.72744 0.788871 +vn -0.968086 -0.216206 0.126746 +v -1.5266 1.65342 0.903369 +vn -0.960908 -0.235945 0.144861 +v -1.57136 1.90304 0.905476 +vn -0.979296 -0.09646 0.177976 +v -1.54332 1.92431 1.05374 +vn -0.973558 -0.0645834 0.219122 +v -1.59043 1.87528 0.762853 +vn -0.982967 -0.128058 0.131824 +v -1.58124 1.93412 0.86498 +vn -0.9834 -0.0748307 0.165301 +v -1.60281 2.01413 0.745512 +vn -0.990241 -0.00670428 0.139201 +v -1.50271 1.82282 1.17923 +vn -0.958001 -0.121673 0.259673 +v -1.51137 1.94026 1.1842 +vn -0.961476 -0.0383498 0.2722 +v -1.4871 1.70913 1.16754 +vn -0.949426 -0.191409 0.248903 +v -1.3701 1.44589 -0.835282 +vn -0.880576 -0.390305 -0.268791 +v -0.396543 5.48944 0.177743 +vn -0.396894 0.887882 -0.232682 +v -0.430629 5.47603 0.187377 +vn -0.426174 0.876257 -0.224831 +v -0.258802 5.51365 0.084987 +vn -0.28411 0.909695 -0.30288 +v -0.546486 5.42937 0.490906 +vn -0.572299 0.812196 0.113193 +v -0.924369 4.82209 0.784864 +vn -0.929337 0.294043 0.22332 +v -0.972984 4.57457 0.875637 +vn -0.943748 0.189431 0.271026 +v -0.944899 4.48669 0.983783 +vn -0.882643 0.119145 0.454692 +v -0.987973 4.46371 0.880988 +vn -0.958491 0.0788586 0.274001 +v -0.96834 4.33979 0.941784 +vn -0.937624 -0.0727308 0.339957 +v -1.00585 4.38511 0.815951 +vn -0.981323 -0.0231698 0.190966 +v -0.938015 4.69347 0.889462 +vn -0.909987 0.283538 0.302538 +v -0.294456 3.93581 1.41021 +vn -0.203816 -0.638339 0.742282 +v -0.826594 1.10423 -1.11006 +vn -0.383351 -0.865499 -0.322419 +v -1.03316 1.00729 -0.390916 +vn -0.224048 -0.970839 -0.0852925 +v -1.05502 1.00126 -0.21209 +vn -0.210848 -0.976731 -0.0392294 +v -0.640748 0.960279 -0.350536 +vn -0.00181997 -0.999997 -0.00182084 +v -0.648151 0.960153 -0.249901 +vn 0.000529957 -0.999999 -0.000915498 +v -0.662131 0.960029 0.003646 +vn 0.00184236 -0.999998 2.69824e-05 +v -0.636436 0.960385 -0.402505 +vn -0.00471406 -0.999985 -0.00289155 +v -0.627878 0.96075 -0.499691 +vn -0.00991422 -0.999911 -0.00891231 +v -0.618337 0.962035 -0.597594 +vn -0.0202059 -0.999515 -0.0236875 +v -0.5027 0.960178 -0.154386 +vn 1.28706e-05 -1 5.93434e-07 +v -0.504919 0.960178 -0.102191 +vn 6.46395e-05 -1 -1.6274e-06 +v -0.507073 0.960178 -0.049953 +vn 2.55376e-05 -1 9.6448e-07 +v -0.508853 0.960178 0.002316 +vn 9.17791e-05 -1 -7.52281e-07 +v -1.05927 1.0141 0.491224 +vn -0.236574 -0.968569 0.0768533 +v -1.05553 1.03097 0.661709 +vn -0.274573 -0.953946 0.120814 +v -0.659777 0.961513 0.789288 +vn -0.0287938 -0.999561 0.00696418 +v -0.677486 0.960064 0.154908 +vn 0.00138758 -0.999998 0.00140895 +v -0.668722 0.960034 0.104879 +vn 0.00125162 -0.999999 0.000701742 +v -0.664501 0.960023 0.054383 +vn 0.00266141 -0.999996 0.000222965 +v -0.515366 0.96018 0.415116 +vn -0.0002298 -1 4.56619e-06 +v -0.350021 0.960178 0.42333 +vn 0 -1 0 +v -0.344301 0.960186 0.824976 +vn -6.4805e-05 -1 0.000955713 +v -0.50728 0.960194 0.80979 +vn -0.00100355 -0.999999 0.00128958 +v -0.17726 0.960178 0.428725 +vn 0 -1 0 +v -0.174144 0.960185 0.834571 +vn -3.69078e-05 -1 0.000766431 +v -0.090031 0.960178 0.105655 +vn 0 -1 0 +v -0.328864 1.06948 1.50134 +vn -0.0966493 -0.924782 0.368017 +v -0.485486 1.08139 1.47664 +vn -0.164683 -0.910582 0.379105 +v -0.166109 1.06338 1.51648 +vn -0.0437653 -0.93129 0.361639 +v -0.846162 3.06664 0.926009 +vn -0.669685 0.727747 0.148007 +v -0.780033 3.13353 0.947759 +vn -0.76682 0.613309 0.189312 +v -0.859352 3.08106 0.751062 +vn -0.685675 0.726493 0.0453655 +v -0.799317 3.14889 0.760667 +vn -0.7975 0.601749 0.043498 +v -0.765873 2.78562 -1.47384 +vn -0.846794 0.509501 -0.152804 +v -0.708635 2.86943 -1.5078 +vn -0.836608 0.536196 -0.11217 +v -0.651507 2.95087 -1.54438 +vn -0.828661 0.556237 -0.0626165 +v -0.560975 3.0779 -1.60243 +vn -0.80718 0.589785 0.0247559 +v -0.591584 3.0355 -1.5783 +vn -0.815018 0.579427 -0.00318672 +v -0.529393 3.12289 -1.61935 +vn -0.797124 0.598908 0.0768298 +v -0.814577 2.96801 -0.102444 +vn -0.596123 0.761318 -0.255015 +v -0.705261 3.0455 -0.128186 +vn -0.600188 0.753631 -0.267982 +v -0.604345 3.11583 -0.153852 +vn -0.586548 0.751719 -0.301463 +v -0.959637 2.85734 -0.095499 +vn -0.59042 0.758657 -0.275397 +v -0.955058 2.93765 0.145523 +vn -0.569519 0.794128 -0.212152 +v -0.940563 2.89816 -0.020271 +vn -0.583532 0.771105 -0.25473 +v -0.695894 3.16757 0.181062 +vn -0.710406 0.656039 -0.254825 +v -0.663876 3.16219 0.085838 +vn -0.675123 0.681763 -0.281793 +v -0.629483 3.15383 -0.010888 +vn -0.64009 0.707098 -0.300495 +v -0.581425 3.15018 -0.114989 +vn -0.598809 0.734632 -0.318974 +v -0.863459 3.05906 0.3884 +vn -0.650213 0.747328 -0.136835 +v -0.881541 3.06377 0.569153 +vn -0.663841 0.745831 -0.0552411 +v -0.797559 3.12075 0.385566 +vn -0.723711 0.67009 -0.16499 +v -0.79793 3.15152 0.577288 +vn -0.780197 0.62021 -0.0814441 +v -0.93349 3.00559 0.396489 +vn -0.58929 0.798289 -0.124388 +v -0.94644 3.01308 0.575861 +vn -0.58424 0.810763 -0.036428 +v -0.969536 2.99548 0.545828 +vn -0.563681 0.824673 -0.04668 +v -0.520916 3.15578 -0.206871 +vn -0.547459 0.763945 -0.34158 +v -1.51843 1.45923 0.205911 +vn -0.947888 -0.318599 -0.00202753 +v -1.64129 1.98185 0.196405 +vn -0.998943 -0.0453893 0.00722449 +v -1.63778 1.95848 0.009117 +vn -0.997605 -0.061815 -0.031037 +v -1.62077 1.8756 0.455107 +vn -0.987454 -0.142662 0.0676897 +v -1.47795 1.34645 0.335915 +vn -0.935072 -0.353548 0.0253852 +v -1.47566 1.33881 0.156557 +vn -0.933922 -0.357308 -0.0110093 +v -1.50683 1.42598 0.164587 +vn -0.945683 -0.324871 -0.011924 +v -1.47409 1.35513 0.508656 +vn -0.934413 -0.351064 0.0602274 +v -1.50085 1.54092 -0.42475 +vn -0.924965 -0.352973 -0.14089 +v -1.44252 1.51251 -0.669221 +vn -0.905266 -0.36725 -0.213591 +v -1.6259 1.92725 -0.179129 +vn -0.994018 -0.0819396 -0.0722141 +v -0.686566 1.35376 1.77904 +vn -0.368236 -0.618474 0.694184 +v -0.708883 1.47182 1.85517 +vn -0.392666 -0.479701 0.784666 +v -0.117854 1.3107 1.8917 +vn -0.0491977 -0.656613 0.752622 +v -0.744812 2.05207 1.96683 +vn -0.417703 0.0800735 0.905048 +v -0.726787 1.60488 1.91241 +vn -0.406728 -0.335483 0.84972 +v -0.390691 2.07629 2.07723 +vn -0.19499 0.0881249 0.976838 +v -0.574624 2.06336 2.03135 +vn -0.301104 0.0844254 0.949847 +v -0.197569 2.08714 2.10463 +vn -0.0965422 0.0910183 0.991159 +v -0.049525 2.10305 2.11253 +vn -0.0260931 0.101639 0.994479 +v -0.688661 2.62694 1.77719 +vn -0.409966 0.520098 0.749284 +v -0.360597 2.68401 1.86895 +vn -0.216043 0.518035 0.827626 +v -0.530894 2.65799 1.83003 +vn -0.313807 0.522243 0.792961 +v -0.181956 2.70199 1.89298 +vn -0.11313 0.511882 0.851574 +v -0.491545 3.95935 -0.220616 +vn -0.519364 -0.615075 -0.593248 +v -0.540434 3.96981 -0.186131 +vn -0.556333 -0.606901 -0.567595 +v -0.587681 3.98093 -0.149467 +vn -0.590322 -0.600193 -0.539711 +v -0.632582 3.99268 -0.110817 +vn -0.623454 -0.589557 -0.513543 +v -0.675461 4.00494 -0.070503 +vn -0.654447 -0.580196 -0.484843 +v -0.715575 4.01766 -0.028764 +vn -0.685288 -0.566512 -0.457652 +v -0.75336 4.03076 0.014123 +vn -0.714586 -0.553915 -0.427253 +v -0.787957 4.04413 0.057869 +vn -0.744726 -0.536183 -0.397356 +v -0.44074 3.94972 -0.252549 +vn -0.480003 -0.619992 -0.620651 +v -0.388596 3.94088 -0.281778 +vn -0.436674 -0.626504 -0.645606 +v -0.334963 3.93303 -0.307898 +vn -0.389937 -0.629937 -0.671661 +v -0.280361 3.92613 -0.330799 +vn -0.338093 -0.635078 -0.694528 +v -0.224703 3.92041 -0.350032 +vn -0.281349 -0.637599 -0.717155 +v -0.168416 3.91559 -0.365363 +vn -0.219746 -0.641704 -0.734797 +v -0.111808 3.9106 -0.375272 +vn -0.153427 -0.643984 -0.749496 +v -0.055557 3.90385 -0.378427 +vn -0.0798837 -0.649375 -0.756261 +v -0.498361 4.276 -0.438136 +vn -0.528597 -0.332727 -0.780947 +v -0.490092 4.39489 -0.484566 +vn -0.528578 -0.218044 -0.820404 +v -0.43278 3.90067 1.33054 +vn -0.337224 -0.569967 0.749278 +v -0.578098 3.93447 1.26995 +vn -0.504938 -0.547175 0.66756 +v -0.949797 4.10907 0.788613 +vn -0.926233 -0.348804 0.14293 +v -0.991693 4.24973 0.804322 +vn -0.95932 -0.221934 0.174498 +v -0.951018 4.13979 0.378209 +vn -0.907898 -0.386129 -0.163173 +v -0.917852 4.11278 0.284831 +vn -0.871442 -0.432788 -0.230833 +v -0.897255 4.09901 0.238519 +vn -0.850708 -0.454283 -0.264429 +v -0.874414 4.08525 0.192663 +vn -0.826638 -0.4777 -0.297442 +v -0.848399 4.07143 0.147186 +vn -0.801405 -0.497724 -0.331694 +v -0.819862 4.05773 0.102268 +vn -0.773172 -0.519427 -0.363869 +v -0.964127 4.15335 0.427003 +vn -0.92402 -0.361152 -0.125528 +v -0.9828 4.1778 0.519372 +vn -0.944643 -0.321239 -0.0667472 +v -0.993245 4.1998 0.61222 +vn -0.957841 -0.287218 -0.00680404 +v -0.995919 4.21076 0.662618 +vn -0.961335 -0.273077 0.035547 +v -0.996018 4.22239 0.712575 +vn -0.96339 -0.255215 0.0821216 +v -0.952965 4.75628 0.238071 +vn -0.965333 0.211046 -0.153597 +v -0.982769 4.65435 0.310362 +vn -0.977834 0.17228 -0.118998 +v -0.984229 4.68051 0.378224 +vn -0.977156 0.200282 -0.0710843 +v -0.979557 4.72102 0.497583 +vn -0.971786 0.235865 0.00060344 +v -0.965565 4.75954 0.609919 +vn -0.963779 0.257708 0.0686736 +v -0.941892 4.80125 0.723739 +vn -0.950608 0.273812 0.146189 +v -0.753636 3.20142 0.491526 +vn -0.850235 0.511717 -0.123476 +v -0.744421 3.2298 0.842104 +vn -0.896647 0.414619 0.155292 +v -0.768338 3.20387 0.674006 +vn -0.893869 0.447872 0.02021 +v -0.709324 2.71833 -1.77649 +vn -0.86115 0.365713 -0.353093 +v -0.53085 2.71796 -2.09593 +vn -0.761149 0.186715 -0.621119 +v -0.699791 2.82537 -1.66301 +vn -0.86642 0.432454 -0.2496 +v -0.464575 3.15126 -1.95972 +vn -0.887902 0.343621 -0.305868 +v -0.394032 3.11834 -2.13041 +vn -0.794743 0.25202 -0.55215 +v -0.376984 3.07583 -2.16864 +vn -0.721428 0.209911 -0.659908 +v -0.439911 2.87046 -2.15654 +vn -0.711938 0.152138 -0.685564 +v -0.494086 2.72883 -2.13452 +vn -0.702578 0.152403 -0.695095 +v -0.3244 3.48993 -1.94926 +vn -0.884915 0.437745 -0.159076 +v -0.600214 5.40031 0.335303 +vn -0.611665 0.790073 -0.0406291 +v -0.535594 2.53019 -2.12936 +vn -0.628429 0.0957598 -0.771951 +v -0.547131 2.47813 -2.12538 +vn -0.630859 0.0560263 -0.773872 +v -0.530083 2.59076 -2.12564 +vn -0.659753 0.115588 -0.74254 +v -0.473382 2.56488 -2.172 +vn -0.556489 0.0582995 -0.828807 +v -1.00471 4.52606 0.340777 +vn -0.987614 0.0861791 -0.131115 +v -0.898752 1.53639 -1.66284 +vn -0.61848 -0.457683 -0.638755 +v -0.370021 4.9001 -0.549724 +vn -0.482475 0.25548 -0.837823 +v -0.312436 4.8901 -0.583182 +vn -0.418854 0.236265 -0.876778 +v -0.212727 4.87725 -0.6274 +vn -0.304089 0.223845 -0.925972 +v -0.115409 4.87242 -0.653899 +vn -0.176682 0.213209 -0.960898 +v -0.418732 5.17418 -0.361596 +vn -0.500758 0.567442 -0.653644 +v -0.470704 4.51977 -0.520701 +vn -0.523506 -0.103503 -0.845712 +v -0.443359 4.64741 -0.544466 +vn -0.515579 0.00850963 -0.8568 +v -0.411798 4.7737 -0.553538 +vn -0.504548 0.125374 -0.854232 +v -0.90378 4.8392 0.835614 +vn -0.902117 0.311668 0.29841 +v -0.842498 5.118 0.34587 +vn -0.879455 0.468459 -0.0842889 +v -0.290008 3.08803 -2.23607 +vn -0.494522 0.128616 -0.859596 +v -0.303727 3.02088 -2.23765 +vn -0.481828 0.120562 -0.867932 +v -0.313432 2.96311 -2.23913 +vn -0.470035 0.0799589 -0.879018 +v -0.319478 2.9083 -2.24085 +vn -0.454736 0.0782943 -0.887178 +v -0.128865 3.11637 -2.28663 +vn -0.157862 0.0934537 -0.983029 +v -0.037041 3.14249 -2.29248 +vn -0.0371439 0.0887384 -0.995362 +v -0.108228 3.34087 -2.26226 +vn -0.161213 0.19767 -0.966921 +v -0.031108 3.36536 -2.2643 +vn -0.0386231 0.199111 -0.979216 +v -0.231603 3.22442 -2.24479 +vn -0.418594 0.125879 -0.899407 +v -1.57147 2.26578 0.712572 +vn -0.951042 0.281125 0.128408 +v -1.59623 2.14739 0.724735 +vn -0.979737 0.146964 0.136077 +v -1.48893 1.49198 0.850123 +vn -0.947476 -0.295258 0.122931 +v -1.35663 1.95636 -1.20601 +vn -0.894888 0.144265 -0.422331 +v -1.44156 2.05106 -0.941816 +vn -0.898203 0.303884 -0.317625 +v -1.49781 2.06537 -0.764068 +vn -0.908157 0.314648 -0.276131 +v -1.41619 2.12455 -0.924908 +vn -0.856963 0.418996 -0.300096 +v -1.46837 2.14305 -0.747583 +vn -0.856244 0.438797 -0.272587 +v -1.42622 1.95163 -1.04465 +vn -0.917203 0.12974 -0.376704 +v -1.42573 1.87538 -1.05535 +vn -0.924691 -0.0242146 -0.379947 +v -1.49044 1.95462 -0.868647 +vn -0.936365 0.123613 -0.328542 +v -1.49021 1.86929 -0.875881 +vn -0.943959 -0.054771 -0.325487 +v -1.48995 1.83598 -0.867525 +vn -0.944874 -0.121198 -0.304179 +v -1.58109 2.00826 -0.50278 +vn -0.966943 0.137854 -0.214516 +v -1.54328 1.97052 -0.687296 +vn -0.954732 0.122351 -0.271139 +v -1.58433 1.90512 -0.505874 +vn -0.981046 -0.0513264 -0.186855 +v -1.54413 1.88104 -0.690504 +vn -0.966295 -0.0551193 -0.251467 +v -1.56934 2.13957 -0.400964 +vn -0.923549 0.33492 -0.186777 +v -1.53234 2.22659 -0.389928 +vn -0.861013 0.45878 -0.219494 +v -1.54143 2.09284 -0.582655 +vn -0.917469 0.323968 -0.230858 +v -1.50801 2.17615 -0.568636 +vn -0.856204 0.45382 -0.246906 +v -1.60833 2.04562 -0.316853 +vn -0.976211 0.148729 -0.157771 +v -1.55932 2.36716 0.420093 +vn -0.911222 0.410945 0.0282458 +v -1.42841 2.35093 -0.453316 +vn -0.749314 0.601167 -0.277718 +v -1.4084 2.29828 -0.626154 +vn -0.762857 0.584639 -0.276126 +v -1.48363 2.26916 -0.467305 +vn -0.80124 0.534837 -0.268259 +v -1.45786 2.21945 -0.644405 +vn -0.8069 0.519411 -0.281291 +v -1.36065 2.46823 -0.358729 +vn -0.689862 0.671391 -0.270786 +v -1.35119 2.40999 -0.522518 +vn -0.703401 0.660676 -0.262171 +v -1.29391 2.47059 -0.511993 +vn -0.647888 0.71436 -0.264444 +v -1.36273 2.53112 -0.198259 +vn -0.693177 0.673442 -0.256867 +v -1.35715 2.59428 -0.041237 +vn -0.709607 0.671099 -0.214672 +v -1.29973 2.59218 -0.196661 +vn -0.636056 0.719796 -0.278076 +v -1.29617 2.33938 -0.861394 +vn -0.752502 0.616156 -0.232579 +v -1.32778 2.36813 -0.691221 +vn -0.72741 0.642234 -0.241682 +v -1.27431 2.42801 -0.678648 +vn -0.672965 0.702762 -0.230745 +v -1.33097 2.24154 -0.972958 +vn -0.800986 0.52537 -0.287068 +v -1.36629 2.16954 -0.996038 +vn -0.828304 0.463745 -0.314408 +v -1.37321 2.26526 -0.80084 +vn -0.78099 0.561823 -0.272783 +v -1.41897 2.18421 -0.824007 +vn -0.817486 0.496764 -0.291448 +v -1.14333 2.68567 -0.221205 +vn -0.383215 0.852787 -0.354825 +v -0.994324 2.68375 -0.486373 +vn -0.653272 0.718013 -0.240194 +v -0.986528 2.64076 -0.656015 +vn -0.689149 0.701901 -0.180023 +v -1.42824 1.69632 -0.957829 +vn -0.913756 -0.273473 -0.300438 +v -1.40137 1.60626 -0.946055 +vn -0.896764 -0.333472 -0.290879 +v -1.37438 1.52716 -0.932845 +vn -0.883976 -0.369688 -0.286213 +v -1.41199 1.49186 -0.756797 +vn -0.895254 -0.375768 -0.239414 +v -1.41132 1.33338 -0.471454 +vn -0.907618 -0.381711 -0.174715 +v -1.44142 1.41143 -0.477777 +vn -0.917315 -0.361588 -0.166697 +v -1.37956 1.349 -0.647391 +vn -0.888461 -0.398997 -0.226801 +v -1.40879 1.42422 -0.65804 +vn -0.900299 -0.377709 -0.216328 +v -1.44901 1.32814 -0.20487 +vn -0.923687 -0.370134 -0.0990065 +v -1.4663 1.33278 -0.024774 +vn -0.930376 -0.362567 -0.0542787 +v -1.47913 1.40853 -0.208309 +vn -0.934418 -0.342496 -0.0977756 +v -1.49748 1.41804 -0.02494 +vn -0.941141 -0.333831 -0.0530147 +v -1.3836 1.41678 -0.744344 +vn -0.890662 -0.383985 -0.243467 +v -0.311884 5.52685 0.189025 +vn -0.329727 0.913352 -0.238891 +v -0.333314 5.49421 0.104572 +vn -0.341013 0.894661 -0.288604 +v -0.420377 5.50313 0.293655 +vn -0.431449 0.8904 -0.145048 +v -0.462914 5.46573 0.211198 +vn -0.451944 0.868357 -0.20421 +v -0.19041 5.51128 0.025809 +vn -0.209912 0.915784 -0.342457 +v -0.039142 5.51781 -0.013904 +vn -0.0457122 0.928149 -0.36939 +v -0.574319 5.41957 0.349938 +vn -0.564294 0.825387 -0.0175784 +v -0.92776 4.84205 0.738269 +vn -0.946271 0.274242 0.171357 +v -0.815962 4.09336 1.12747 +vn -0.79328 -0.3606 0.490586 +v -0.709744 4.03063 1.22438 +vn -0.673006 -0.459144 0.57987 +v -0.584706 3.98014 1.30321 +vn -0.511371 -0.553886 0.657047 +v -0.253002 3.32442 -2.20838 +vn -0.600288 0.268992 -0.753191 +v -0.557078 5.01022 1.17102 +vn -0.489959 0.566006 0.663006 +v 0 1.52851 2.0306 +vn 5.52605e-19 -0.392641 0.919692 +v 0.049135 1.51906 2.02579 +vn 0.0228144 -0.407174 0.913066 +v 0 2.36116 2.05857 +vn -1.36157e-06 0.300715 0.953714 +v 0.083659 3.29235 -2.2737 +vn 0.100599 0.145725 -0.984197 +v 0.467165 2.79778 -2.14541 +vn 0.697749 0.167857 -0.696398 +v -0.083659 3.29235 -2.2737 +vn -0.100597 0.145727 -0.984197 +v -0.467165 2.79778 -2.14541 +vn -0.697751 0.167858 -0.696396 +v -0.622086 4.99482 -0.301562 +vn -0.693241 0.377392 -0.613997 +v 0 1.60567 2.05995 +vn -4.33696e-06 -0.318619 0.947883 +v 0.914536 4.0154 0.766034 +vn 0.912936 -0.389907 0.120499 +v -0.220069 1.31217 1.88291 +vn -0.0930954 -0.655681 0.749277 +v -0.914536 4.0154 0.766034 +vn -0.912937 -0.389904 0.120504 +v 1.02768 2.64117 -0.523041 +vn 0.656257 0.717974 -0.232034 +v 1.56437 2.13584 0.921768 +vn 0.972602 0.126772 0.194868 +v 1.52579 2.43596 0.347629 +vn 0.87216 0.489033 -0.0135319 +v 0.889208 3.04043 0.40902 +vn 0.623464 0.771919 -0.124232 +v 1.34002 2.16417 1.49914 +vn 0.743732 0.193667 0.639809 +v 1.41818 1.92733 1.41729 +vn 0.872091 -0.0347347 0.488109 +v 1.60315 1.77145 0.424372 +vn 0.975966 -0.212273 0.0492981 +v 1.60558 2.24518 0.380422 +vn 0.959256 0.279124 0.0437814 +v 1.52981 2.42891 0.363454 +vn 0.877264 0.479987 0.00460316 +v 1.09641 2.60847 1.46613 +vn 0.595669 0.545773 0.58933 +v 1.62451 1.85308 0.299101 +vn 0.982794 -0.182278 0.0298291 +v 1.30808 2.3804 1.43118 +vn 0.686268 0.406111 0.603415 +v 1.07343 2.62077 1.47773 +vn 0.585927 0.568488 0.577504 +v 1.37602 1.88375 1.47526 +vn 0.790244 -0.117421 0.601438 +v 1.07489 2.74313 -0.164252 +vn 0.512194 0.795938 -0.322708 +v 1.60261 2.00918 0.745332 +vn 0.989017 -0.0450715 0.140761 +v 1.31355 1.90578 1.54896 +vn 0.708025 -0.0753166 0.70216 +v 0.638181 2.90156 1.56112 +vn 0.442468 0.663865 0.602914 +v 0.717745 2.78221 1.62947 +vn 0.448516 0.624193 0.639701 +v 0.656023 2.90598 1.5432 +vn 0.456125 0.668268 0.58768 +v 1.33549 2.22855 1.48133 +vn 0.717633 0.27683 0.639037 +v 1.08197 2.75673 -0.118781 +vn 0.493044 0.806441 -0.326437 +v 1.3402 2.15347 1.50182 +vn 0.743228 0.171038 0.646806 +v 0.93383 2.96037 1.07014 +vn 0.566535 0.793853 0.220987 +v 1.46263 2.51549 0.149349 +vn 0.807548 0.578825 -0.11326 +v 1.61058 1.94631 0.659339 +vn 0.989125 -0.0859297 0.119362 +v 1.60786 1.80821 0.473319 +vn 0.980929 -0.182924 0.0657039 +v 1.34037 2.13629 1.50608 +vn 0.733146 0.168518 0.658862 +v 1.1669 2.62078 -0.350262 +vn 0.413446 0.845274 -0.338488 +v 0.701478 3.46594 0.542375 +vn 0.972224 -0.0772523 -0.220934 +v 1.04826 2.68977 -0.343621 +vn 0.601337 0.743891 -0.291581 +v 1.58505 1.67892 0.302055 +vn 0.96547 -0.259305 0.0250708 +v 0.802406 3.12552 0.872585 +vn 0.769898 0.62127 0.145878 +v 1.50044 2.47391 0.25836 +vn 0.850938 0.522651 -0.0523563 +v 0.879589 3.02785 0.96801 +vn 0.65063 0.732013 0.202084 +v 1.35501 1.8645 1.49685 +vn 0.759106 -0.129711 0.637913 +v 0.900785 3.03154 0.408479 +vn 0.593638 0.794681 -0.126792 +v 0.754114 3.22252 0.794437 +vn 0.912297 0.404269 0.0654299 +v 1.49338 2.0294 1.24195 +vn 0.950022 0.0457262 0.308816 +v 0.700098 3.31132 0.473498 +vn 0.931309 0.246242 -0.268382 +v 1.30185 1.81826 1.5442 +vn 0.693196 -0.197129 0.693267 +v 0.759542 3.21033 0.803884 +vn 0.884322 0.459869 0.0805934 +v 1.6072 1.76409 0.272515 +vn 0.974581 -0.222756 0.023928 +v 1.39532 2.56396 -0.003716 +vn 0.73882 0.643205 -0.201077 +v 1.23876 2.53067 1.39263 +vn 0.630786 0.526802 0.569726 +v 1.20551 2.61848 -0.303413 +vn 0.480002 0.809259 -0.338671 +v 1.39258 1.89991 1.45532 +vn 0.822826 -0.114131 0.556715 +v 0.755852 3.21821 0.797669 +vn 0.897333 0.437182 0.0605427 +v 0.71666 3.52684 0.573799 +vn 0.960207 -0.179596 -0.213888 +v 0.759418 3.17686 0.431357 +vn 0.811686 0.547044 -0.204716 +v 0.771856 3.18 0.826684 +vn 0.871323 0.464244 0.158978 +v 1.25682 2.61185 -0.235418 +vn 0.583486 0.749353 -0.313071 +v 1.39714 1.90453 1.44931 +vn 0.829958 -0.0751942 0.552734 +v 1.01856 2.64926 1.50462 +vn 0.574108 0.58809 0.569693 +v 1.5334 2.10711 1.07951 +vn 0.963544 0.113142 0.242451 +v 0.700835 3.30697 0.471792 +vn 0.915431 0.312081 -0.25415 +v 1.0291 2.64381 1.49947 +vn 0.58033 0.587252 0.564228 +v 1.09487 2.62168 -0.432236 +vn 0.431704 0.848026 -0.307383 +v 1.53798 2.11807 1.05483 +vn 0.96213 0.141644 0.232902 +v 1.62505 1.85631 0.300033 +vn 0.986586 -0.160065 0.0320412 +v 0.8348 3.08967 0.414863 +vn 0.657783 0.73949 -0.143095 +v 0.939405 3.00278 0.407074 +vn 0.593063 0.796171 -0.119945 +v 1.63741 2.06175 0.351025 +vn 0.998594 0.0381037 0.0368453 +v 1.09286 2.6104 1.46794 +vn 0.595824 0.546538 0.588464 +v 1.05975 2.62789 -0.481458 +vn 0.621965 0.736943 -0.264715 +v 1.36827 1.87656 1.48349 +vn 0.76638 -0.124677 0.630172 +v 1.61095 1.84983 0.529055 +vn 0.982888 -0.165895 0.0800629 +v 0.888633 2.71156 1.56326 +vn 0.525006 0.605724 0.597885 +v 0.826244 3.09019 0.90471 +vn 0.715775 0.679697 0.160247 +v 1.08577 2.76314 -0.097799 +vn 0.462824 0.823567 -0.327921 +v 1.1745 2.56656 1.42655 +vn 0.600946 0.537519 0.591555 +v 1.61157 1.78428 0.278714 +vn 0.976787 -0.213401 0.0186119 +v 0.937264 2.68916 1.5422 +vn 0.546137 0.600765 0.583795 +v 1.02323 2.94561 0.406348 +vn 0.533739 0.835848 -0.128379 +v 1.53488 2.41879 0.386177 +vn 0.890613 0.454626 0.011105 +v 1.00482 2.95776 0.406328 +vn 0.546485 0.82812 -0.124787 +v 1.61094 1.93667 0.646265 +vn 0.988844 -0.108847 0.101684 +v 0.914521 2.69994 1.55234 +vn 0.535007 0.603875 0.59085 +v 1.09889 2.78628 -0.021453 +vn 0.410083 0.854514 -0.318808 +v 0.719794 3.44921 0.657835 +vn 0.996592 -0.0506932 -0.0650677 +v 1.06434 2.6267 -0.474417 +vn 0.586078 0.761394 -0.277112 +v 0.956344 2.99008 0.406418 +vn 0.577013 0.80807 -0.118655 +v 1.03969 2.63396 -0.513628 +vn 0.633546 0.73143 -0.252248 +v 1.03144 2.63986 -0.51726 +vn 0.633554 0.73139 -0.252343 +v 1.54332 2.13179 1.02325 +vn 0.965584 0.138335 0.220254 +v 0.970668 2.98025 0.406266 +vn 0.553494 0.824012 -0.121035 +v 1.56147 2.36392 0.390606 +vn 0.9109 0.412075 0.0213252 +v 0.587628 2.82616 1.67034 +vn 0.394546 0.629161 0.669694 +v 0.611483 2.89496 1.58804 +vn 0.426744 0.652964 0.625722 +v 1.58387 1.66979 0.242459 +vn 0.962861 -0.269776 0.0109006 +v 1.22269 2.54001 1.40146 +vn 0.614431 0.531601 0.582988 +v 1.59449 2.04717 0.797784 +vn 0.986918 0.0322415 0.157964 +v 1.38815 2.5675 -0.017407 +vn 0.725347 0.655628 -0.209818 +v 0.727956 2.77837 1.62587 +vn 0.466178 0.613697 0.637223 +v 0.967577 2.67474 1.52863 +vn 0.552838 0.598799 0.579491 +v 0.876427 3.05158 0.410208 +vn 0.652791 0.745875 -0.132418 +v 1.63458 1.93295 0.320906 +vn 0.993906 -0.10241 0.0407753 +v 1.60783 2.23739 0.379509 +vn 0.965729 0.257007 0.0362639 +v 0.90155 2.9562 1.15417 +vn 0.567263 0.776054 0.275595 +v 0.709678 3.49866 0.55927 +vn 0.967448 -0.128612 -0.217952 +v 1.43602 2.53776 0.083844 +vn 0.791159 0.596346 -0.135786 +v 0.703576 2.91724 1.48856 +vn 0.484609 0.689715 0.538003 +v 1.59919 1.74811 0.393423 +vn 0.974097 -0.22157 0.0451789 +v 1.40791 1.91577 1.4342 +vn 0.847906 -0.0426505 0.528428 +v 1.07981 2.91044 0.407373 +vn 0.483312 0.866221 -0.126769 +v 0.732131 3.29165 0.74603 +vn 0.962072 0.264576 0.0664612 +v 0.721672 3.49131 0.637301 +vn 0.983136 -0.144334 -0.112301 +v 1.59426 1.72104 0.357588 +vn 0.969641 -0.242011 0.0350326 +v 1.58139 1.66327 0.281446 +vn 0.96348 -0.267003 0.0203874 +v 1.46547 1.98669 1.3213 +vn 0.924777 -0.00277794 0.3805 +v 0.879371 2.95289 1.20592 +vn 0.563833 0.761824 0.318929 +v 1.08967 2.61212 1.46957 +vn 0.592472 0.548428 0.590087 +v 1.63639 2.07769 0.354238 +vn 0.996357 0.073132 0.0438721 +v 1.34492 1.85539 1.50681 +vn 0.740723 -0.133343 0.658444 +v 0.821282 3.10265 0.416644 +vn 0.72454 0.669667 -0.163056 +v 1.32337 2.31371 1.45479 +vn 0.707739 0.344472 0.616801 +v 0.725066 3.52819 0.620343 +vn 0.975879 -0.190865 -0.10598 +v 0.785849 3.15356 0.848468 +vn 0.798381 0.584245 0.14576 +v 1.33697 2.21581 1.48514 +vn 0.718253 0.249197 0.649626 +v 0.721099 3.35774 0.705601 +vn 0.993539 0.112278 -0.0165418 +v 1.01571 2.95056 0.406335 +vn 0.546417 0.828118 -0.125097 +v 1.6089 1.82255 0.492516 +vn 0.982149 -0.172673 0.0746186 +v 1.61407 1.79625 0.282352 +vn 0.979573 -0.199496 0.0252511 +v 1.60178 1.74004 0.265047 +vn 0.971153 -0.237353 0.0229202 +v 1.55232 2.15633 0.965837 +vn 0.966284 0.164711 0.197902 +v 1.19328 2.55634 1.4169 +vn 0.598554 0.536976 0.594466 +v 0.765132 3.16913 0.429612 +vn 0.743649 0.644824 -0.1766 +v 1.33517 2.59086 -0.114139 +vn 0.683778 0.682851 -0.257221 +v 1.5487 2.146 0.990292 +vn 0.968753 0.134734 0.20824 +v 1.07305 2.91423 0.407069 +vn 0.515129 0.847503 -0.127983 +v 1.63871 2.00421 0.338534 +vn 0.99932 -0.0176629 0.0323542 +v 1.09412 2.90263 0.40862 +vn 0.485426 0.864245 -0.132068 +v 0.775555 3.17187 0.833032 +vn 0.834524 0.533845 0.136305 +v 1.31476 2.35329 1.44101 +vn 0.704266 0.370737 0.605444 +v 0.719424 3.4681 0.647911 +vn 0.98835 -0.0959774 -0.118119 +v 1.60762 1.97697 0.701145 +vn 0.989416 -0.0575528 0.133203 +v 1.2932 1.81118 1.55061 +vn 0.685011 -0.202348 0.699868 +v 0.922119 3.01577 0.407757 +vn 0.589881 0.79768 -0.125485 +v 1.15188 2.62132 -0.36792 +vn 0.40331 0.850349 -0.338005 +v 1.08201 2.62331 -0.449222 +vn 0.531316 0.796229 -0.289348 +v 0.7793 2.75812 1.60694 +vn 0.47316 0.613408 0.632337 +v 1.59709 1.73518 0.376278 +vn 0.972114 -0.230829 0.0413825 +v 1.63258 2.1158 0.3614 +vn 0.993843 0.10229 0.0425666 +v 0.982322 2.6675 1.52181 +vn 0.563917 0.592773 0.574994 +v 1.58981 1.69918 0.328719 +vn 0.967365 -0.251625 0.0298285 +v 0.73218 3.56247 0.606896 +vn 0.960977 -0.231459 -0.151491 +v 1.10285 2.6212 -0.422545 +vn 0.408954 0.856586 -0.31467 +v 0.731433 2.92368 1.45447 +vn 0.499679 0.699245 0.511251 +v 1.49006 2.48685 0.225996 +vn 0.837297 0.5422 -0.0703758 +v 1.60156 2.01525 0.753685 +vn 0.98844 -0.00302783 0.151583 +v 1.47769 2.00416 1.29018 +vn 0.936769 0.00301901 0.349934 +v 1.09123 2.77345 -0.063428 +vn 0.430486 0.840936 -0.327885 +v 1.11017 2.88235 0.335326 +vn 0.422977 0.889847 -0.171061 +v 0.889849 2.95455 1.18277 +vn 0.56818 0.768405 0.294491 +v 1.09822 2.899 0.399327 +vn 0.454248 0.881011 -0.132202 +v 1.63148 2.12482 0.36302 +vn 0.9915 0.126325 0.0311388 +v 0.797052 2.9379 1.36125 +vn 0.533961 0.717456 0.447374 +v 1.27416 2.60834 -0.210399 +vn 0.602439 0.741207 -0.296107 +v 1.08939 2.90526 0.407889 +vn 0.486979 0.863629 -0.130373 +v 1.32169 1.94102 1.54437 +vn 0.711117 -0.0470859 0.701496 +v 0.814905 3.10739 0.889224 +vn 0.752708 0.641626 0.147469 +v 1.33848 2.19132 1.49181 +vn 0.731328 0.218492 0.646081 +v 0.768945 3.18852 0.8206 +vn 0.882027 0.447976 0.1461 +v 0.715413 3.25957 0.455075 +vn 0.89688 0.36705 -0.246741 +v 1.3547 2.58338 -0.080305 +vn 0.697883 0.673774 -0.242876 +v 0.873476 3.03564 0.960423 +vn 0.659465 0.730736 0.176439 +v 0.807065 2.93998 1.34581 +vn 0.551078 0.723199 0.416288 +v 0.694094 3.40373 0.512662 +vn 0.972557 0.0916191 -0.213868 +v 0.813916 2.94126 1.33342 +vn 0.559205 0.730056 0.392819 +v 0.761648 3.17351 0.430531 +vn 0.776357 0.605863 -0.173782 +v 1.31138 2.36793 1.43582 +vn 0.688952 0.392047 0.609627 +v 1.33769 2.05424 1.52468 +vn 0.735755 0.0781485 0.672724 +v 1.47027 2.50817 0.16963 +vn 0.822701 0.56098 -0.0919999 +v 1.2002 2.55255 1.41331 +vn 0.603239 0.534989 0.591515 +v 0.858062 2.94942 1.25164 +vn 0.578313 0.746313 0.329501 +v 0.580706 2.82831 1.67234 +vn 0.3737 0.632835 0.678136 +v 1.58643 2.3026 0.386166 +vn 0.938031 0.34471 0.0356799 +v 1.38989 1.89726 1.45863 +vn 0.810962 -0.118509 0.572971 +v 0.850914 2.9482 1.26625 +vn 0.569325 0.741596 0.354831 +v 1.58794 1.68475 0.247366 +vn 0.966299 -0.257146 0.011897 +v 0.77143 2.93252 1.40006 +vn 0.522937 0.710906 0.470265 +v 1.03992 2.93533 0.406696 +vn 0.530725 0.838536 -0.123245 +v 1.18136 2.5628 1.423 +vn 0.598426 0.537942 0.593722 +v 1.612 1.87368 0.561094 +vn 0.986675 -0.13865 0.085133 +v 1.48281 2.01201 1.2756 +vn 0.94513 0.0222792 0.325933 +v 1.16738 2.57046 1.43024 +vn 0.594575 0.542281 0.593644 +v 0.72853 3.30775 0.73565 +vn 0.975054 0.208712 0.0755541 +v 1.60223 2.01183 0.748969 +vn 0.988914 -0.0317745 0.145049 +v 0.866013 2.95067 1.23402 +vn 0.573217 0.753487 0.321992 +v 1.34055 2.10792 1.51305 +vn 0.733552 0.138117 0.665451 +v 1.331 2.26571 1.47013 +vn 0.72116 0.292735 0.627881 +v 1.63053 2.13143 0.364154 +vn 0.987494 0.152836 0.0386803 +v 1.57031 2.12065 0.900418 +vn 0.974604 0.11635 0.191337 +v 0.816641 3.10808 0.417688 +vn 0.732358 0.656755 -0.17979 +v 1.092 2.62189 -0.435777 +vn 0.475123 0.8269 -0.300823 +v 1.29647 1.84448 1.55554 +vn 0.684831 -0.142776 0.714578 +v 1.21553 2.54401 1.40525 +vn 0.608396 0.533755 0.587333 +v 1.61074 1.94362 0.65568 +vn 0.988297 -0.1057 0.109983 +v 0.836244 2.73452 1.58482 +vn 0.499653 0.609943 0.615074 +v 1.03813 2.66469 -0.430155 +vn 0.627056 0.732055 -0.266264 +v 0.734374 3.21946 0.442878 +vn 0.838866 0.509252 -0.192268 +v 1.07011 2.62555 -0.466112 +vn 0.555807 0.781784 -0.282654 +v 1.57193 1.62756 0.234597 +vn 0.95965 -0.280998 0.010542 +v 0.694156 3.40946 0.515217 +vn 0.975321 0.0335312 -0.218233 +v 0.883961 3.02271 0.973214 +vn 0.615775 0.76307 0.196328 +v 0.745193 3.24625 0.777014 +vn 0.918544 0.391036 0.0580369 +v 1.30841 1.88415 1.55172 +vn 0.704806 -0.109249 0.700937 +v 1.14983 2.57975 1.439 +vn 0.589094 0.547194 0.594598 +v 1.2071 2.54872 1.40969 +vn 0.606919 0.534069 0.588574 +v 0.755557 3.18389 0.433341 +vn 0.824834 0.527811 -0.202643 +v 1.32621 1.96586 1.54054 +vn 0.715864 -0.0180377 0.698007 +v 0.501498 2.85071 1.693 +vn 0.336974 0.629044 0.700537 +v 0.494581 2.86444 1.684 +vn 0.336957 0.629048 0.700542 +v 1.62212 1.84018 0.295291 +vn 0.98148 -0.189366 0.0289522 +v 1.58371 2.08454 0.849756 +vn 0.982904 0.0718593 0.169517 +v 0.515792 2.84666 1.68927 +vn 0.358339 0.631758 0.687368 +v 1.59119 2.2895 0.385003 +vn 0.945123 0.325457 0.0286377 +v 1.39846 2.56216 0.002683 +vn 0.755379 0.630441 -0.178739 +v 0.827845 3.09598 0.415615 +vn 0.659034 0.738021 -0.144908 +v 1.61211 1.89581 0.590951 +vn 0.989316 -0.112943 0.0921786 +v 0.920833 2.98453 1.01444 +vn 0.576503 0.79424 0.191902 +v 1.58885 2.06675 0.825007 +vn 0.984624 0.0521101 0.166736 +v 1.33959 2.08872 1.51724 +vn 0.736444 0.106329 0.668091 +v 1.59525 1.71376 0.256663 +vn 0.968657 -0.247817 0.0170104 +v 1.22664 2.61666 -0.276881 +vn 0.530919 0.783484 -0.32292 +v 1.34894 1.85899 1.50294 +vn 0.751863 -0.130161 0.646344 +v 1.57703 1.64683 0.259883 +vn 0.961478 -0.274467 0.0150994 +v 1.57693 1.64508 0.234274 +vn 0.961479 -0.274463 0.0150901 +v 1.10398 2.89431 0.386773 +vn 0.44123 0.887132 -0.135328 +v 1.13834 2.58588 1.44479 +vn 0.592554 0.546152 0.592113 +v 1.57797 2.10152 0.873496 +vn 0.977576 0.103797 0.183227 +v 1.29096 1.82662 1.55719 +vn 0.682274 -0.172567 0.710438 +v 1.30736 2.59915 -0.158538 +vn 0.641746 0.714965 -0.277465 +v 1.55389 2.3798 0.391334 +vn 0.900442 0.434738 0.0144151 +v 1.0331 2.64711 -0.492676 +vn 0.630275 0.732403 -0.257565 +v 1.02848 2.64056 -0.522759 +vn 0.636083 0.732002 -0.244072 +v 0.719984 3.24885 0.451671 +vn 0.848403 0.484905 -0.212318 +v 0.824803 3.09878 0.415968 +vn 0.690359 0.708323 -0.147254 +v 0.719548 3.38218 0.692137 +vn 0.998487 0.0534013 -0.0131077 +v 1.25032 2.52378 1.38611 +vn 0.63767 0.523115 0.565445 +v 0.739116 3.26214 0.765289 +vn 0.940531 0.333677 0.0637278 +v 0.898544 3.00761 0.989519 +vn 0.589667 0.783069 0.197726 +v 1.56832 2.34801 0.389593 +vn 0.922427 0.385742 0.0181811 +v 0.717823 3.41197 0.675816 +vn 0.9999 -0.00449972 -0.0133767 +v 1.0522 2.9274 0.406784 +vn 0.526714 0.842187 -0.115296 +v 1.05954 2.92299 0.406987 +vn 0.526965 0.840964 -0.122828 +v 0.752875 2.92843 1.4254 +vn 0.507267 0.710167 0.488203 +v 1.60646 1.79671 0.457989 +vn 0.97864 -0.197835 0.055895 +v 0.856677 2.72595 1.57679 +vn 0.511915 0.60841 0.606449 +v 1.62576 1.86147 0.301467 +vn 0.98951 -0.141832 0.0274529 +v 0.794346 2.75224 1.60143 +vn 0.486505 0.611777 0.623733 +v 0.716839 3.25508 0.453508 +vn 0.872523 0.430992 -0.230108 +v 1.33467 2.02543 1.5302 +vn 0.735804 0.0505833 0.675303 +v 0.699464 3.45109 0.535212 +vn 0.975196 -0.0223043 -0.220218 +v 1.32631 2.29642 1.4604 +vn 0.709588 0.316246 0.629662 +v 1.3638 2.57957 -0.063994 +vn 0.713274 0.664977 -0.221461 +v 0.834666 2.94526 1.2972 +vn 0.559536 0.735322 0.38239 +v 1.3034 1.86728 1.55337 +vn 0.696266 -0.141248 0.703749 +v 1.21744 2.6177 -0.288829 +vn 0.494489 0.801608 -0.336014 +v 1.05435 2.70405 -0.294658 +vn 0.590126 0.749977 -0.298807 +v 0.725839 3.33188 0.721667 +vn 0.985936 0.163877 0.032795 +v 0.67398 2.91029 1.52336 +vn 0.473006 0.682453 0.557246 +v 1.58085 2.31736 0.387397 +vn 0.931026 0.364183 0.0237042 +v 0.930385 2.97548 1.02469 +vn 0.56489 0.79966 0.203575 +v 1.2315 2.53494 1.39667 +vn 0.624042 0.529309 0.574807 +v 1.63256 1.91251 0.315535 +vn 0.991724 -0.123928 0.0335432 +v 1.43217 2.5406 0.074996 +vn 0.77375 0.613231 -0.15893 +v 1.29123 2.60417 -0.184625 +vn 0.631573 0.724589 -0.275838 +v 1.24266 2.61427 -0.25513 +vn 0.564827 0.759564 -0.322541 +v 1.52482 2.08853 1.12003 +vn 0.963278 0.0866783 0.25413 +v 1.6025 2.2553 0.381546 +vn 0.953671 0.299152 0.031929 +v 0.723701 3.54615 0.584417 +vn 0.952334 -0.22621 -0.204669 +v 1.32231 2.59525 -0.135558 +vn 0.654973 0.702713 -0.277858 +v 1.05693 2.70944 -0.276466 +vn 0.577151 0.755789 -0.309322 +v 0.924282 2.95937 1.0982 +vn 0.567674 0.785026 0.247953 +v 1.04151 2.67389 -0.398113 +vn 0.614644 0.736134 -0.283407 +v 1.29892 1.81587 1.54634 +vn 0.684119 -0.204465 0.700125 +v 1.5121 2.45794 0.297043 +vn 0.861851 0.506145 -0.0320967 +v 1.63858 2.0194 0.341914 +vn 0.999393 0.0106416 0.0331748 +v 1.18071 2.62058 -0.334501 +vn 0.445205 0.829072 -0.338278 +v 1.14257 2.62133 -0.378341 +vn 0.371741 0.861752 -0.345243 +v 1.28484 1.80987 1.55834 +vn 0.681763 -0.200802 0.703475 +v 1.28776 1.80674 1.55461 +vn 0.681775 -0.200814 0.703461 +v 1.53954 2.40912 0.392573 +vn 0.898332 0.439201 0.0101156 +v 0.731307 3.56808 0.596472 +vn 0.954575 -0.221515 -0.199293 +v 0.733257 3.56981 0.603887 +vn 0.954575 -0.221523 -0.199285 +v 1.03615 2.63508 -0.519415 +vn 0.632842 0.733936 -0.246675 +v 0.478714 2.86011 1.69481 +vn 0.314953 0.626263 0.713162 +v 0.481212 2.85568 1.6976 +vn 0.314955 0.626258 0.713165 +v 0.9396 2.96604 1.03497 +vn 0.566411 0.793908 0.221105 +v 0.94174 2.9612 1.0469 +vn 0.566386 0.793931 0.221089 +v 1.26684 2.50887 1.38 +vn 0.696861 0.481287 0.53174 diff --git a/examples/signed-heat-demo/data/ducky-star.txt b/examples/signed-heat-demo/data/ducky-star.txt new file mode 100644 index 000000000..79817d4a9 --- /dev/null +++ b/examples/signed-heat-demo/data/ducky-star.txt @@ -0,0 +1,2 @@ +signed_curve 1 +l 5929 3613 17877 17950 17868 17820 17813 6610 18072 18058 17829 18074 17998 18033 17882 18085 17881 17863 17879 18000 17938 17993 17856 17945 3566 3268 18079 17937 17827 18078 17844 18057 18023 18067 17850 17956 18066 18031 18071 17926 17963 18054 17891 17842 18016 18065 17899 17823 17971 17947 17832 18076 17801 17807 17873 18082 18032 17885 18041 18061 17975 18015 18069 17806 17896 3092 17990 17954 17941 17911 17861 18077 17929 5825 17895 18064 18048 17858 17809 18012 17921 17870 17841 17922 18022 17978 17888 18026 18001 18025 17907 17830 17943 17906 17940 17901 17805 18046 17825 17920 17865 17982 18018 17875 17996 17824 17934 17814 17986 17948 17890 18020 18013 18029 17991 17800 17923 17927 17883 17857 17853 18068 15332 17837 17983 17949 17908 1084 17804 17902 17851 17845 17976 17812 17864 17834 18024 17912 3684 17839 18075 17935 18081 18080 18030 17994 18056 18005 17815 17958 18009 3703 18051 17970 18021 17988 17826 17821 17803 17960 17917 17819 17989 18053 17914 17932 17969 17810 964 965 18090 1209 18038 17843 18063 17889 17995 18007 17972 17924 17981 17869 17984 18006 18028 17808 17862 17910 17811 17855 17852 17942 17893 17871 17876 17866 18047 17997 18049 17939 17892 17817 14433 17886 17974 18014 18010 18087 18086 18011 1595 17887 17816 17818 18060 17900 17946 18045 17979 17955 17965 17967 18055 17977 17973 17987 17909 17952 17897 18073 17822 18089 18088 18062 18019 18040 18003 17833 17964 15522 17867 17959 17831 17916 17931 17849 17961 17840 17846 17836 18004 18039 17904 17985 18059 17918 18037 18042 17878 17933 17905 17915 17944 18084 18083 18070 17847 17898 17828 18052 18002 17966 1866 17838 17854 17962 18050 18035 17999 18008 17848 17968 17925 17992 17913 18036 18017 17859 17894 17802 17835 17936 17860 17880 17884 17874 17919 17872 17980 18043 18044 17928 17903 17957 17930 17953 18027 3636 17951 5933 5930 5929 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/dustbin.txt b/examples/signed-heat-demo/data/dustbin.txt new file mode 100644 index 000000000..8647ba2e3 --- /dev/null +++ b/examples/signed-heat-demo/data/dustbin.txt @@ -0,0 +1,804 @@ +signed_curve +e 87329 0.495155 +e 87330 0.752982 +e 87325 0.224126 +e 87323 0.271442 +e 278179 0.651476 +e 43578 0.516146 +e 43579 0.620896 +e 43587 0.33163 +e 43588 0.874506 +e 43590 0.108718 +e 43592 0.434594 +e 43605 0.888083 +e 43606 0.178243 +e 43608 0.655438 +e 43609 0.450998 +e 219306 0.513342 +e 219299 0.410624 +e 219298 0.59179 +signed_curve +e 219271 0.802837 +e 278173 0.213824 +e 43550 0.339424 +e 43548 0.385283 +e 43547 0.459975 +e 43540 0.709958 +e 43541 0.600687 +e 278172 0.105913 +e 43533 0.251361 +e 43535 0.735519 +e 87094 0.756427 +e 87098 0.25839 +e 87096 0.827359 +e 87129 0.184306 +e 87127 0.86461 +e 87132 0.140588 +e 87130 0.879302 +e 280615 0.875524 +e 260983 0.119004 +signed_curve +e 280619 0.123756 +e 87194 0.141379 +e 39451 0.132707 +e 39450 0.384143 +e 39457 0.854455 +e 39455 0.403591 +e 39483 0.244406 +e 39482 0.521657 +e 39615 0.454681 +e 39617 0.631102 +e 39610 0.16569 +e 39609 0.714994 +e 39601 0.69468 +signed_curve +e 83504 0.976022 +e 83503 0.713094 +e 83511 0.535524 +e 83512 0.3341 +signed_curve +e 83574 0.0212188 +e 83575 0.332409 +e 83543 0.537668 +e 83545 0.703453 +e 83541 0.0628114 +e 35660 0.039864 +e 35659 0.81553 +e 35654 0.790858 +e 35652 0.391134 +e 35686 0.428581 +e 35684 0.878198 +e 35689 0.0942785 +e 35688 0.54643 +e 277584 0.292944 +e 211954 0.585825 +e 211956 0.539193 +signed_curve +e 212100 0.495618 +e 35819 0.634205 +signed_curve +e 35812 0.946993 +e 35810 0.368868 +e 35809 0.48892 +e 35801 0.730283 +signed_curve +e 79795 0.898716 +e 79794 0.781019 +e 79802 0.394753 +e 79803 0.437219 +e 79805 0.847639 +e 79806 0.117658 +e 79813 0.453847 +e 79812 0.757501 +e 253843 0.589654 +e 294909 0.624817 +e 253835 0.683765 +e 253836 0.928191 +e 253872 0.685426 +e 253873 0.377085 +e 253875 0.585079 +e 280210 0.243375 +e 79869 0.465726 +e 79870 0.117471 +e 79865 0.850328 +e 79867 0.435413 +e 79834 0.396862 +e 79836 0.779967 +e 79841 0.89051 +e 31851 0.977169 +e 31849 0.03637 +e 31854 0.718964 +e 31852 0.522232 +e 31886 0.337892 +e 31885 0.0227735 +signed_curve +e 277304 0.557525 +e 208434 0.211859 +signed_curve +e 208580 0.180373 +e 32019 0.391991 +e 32018 0.264854 +e 32016 0.872282 +e 32017 0.142322 +e 32010 0.283572 +e 32009 0.608816 +e 32001 0.662497 +e 32000 0.124955 +e 277313 0.079836 +e 76075 0.608679 +e 76074 0.852925 +e 76082 0.263856 +e 76083 0.533834 +e 76085 0.698746 +e 76086 0.233105 +signed_curve +e 294789 0.298619 +e 250235 0.397122 +e 250236 0.744775 +e 250272 0.399777 +e 250273 0.710195 +e 250276 0.133328 +signed_curve +e 76150 0.2321 +e 76145 0.701609 +e 76147 0.531871 +e 76114 0.265944 +e 76116 0.851844 +e 76121 0.604884 +e 28051 0.918299 +e 28049 0.129716 +e 28054 0.651386 +e 28052 0.644105 +e 28086 0.253019 +e 28085 0.260594 +e 28092 0.732782 +e 28090 0.60904 +e 277024 0.811507 +e 205061 0.568665 +e 28219 0.173984 +e 28218 0.693149 +e 28216 0.655583 +e 28217 0.380311 +e 28210 0.203391 +e 28209 0.720737 +e 28201 0.598648 +e 28200 0.211355 +e 277033 0.135414 +e 72355 0.331171 +e 72354 0.920596 +e 72362 0.141806 +e 72363 0.6245 +e 72365 0.560305 +e 72366 0.340886 +signed_curve +e 279872 0.853817 +e 72428 0.831898 +e 72430 0.340398 +e 72425 0.563274 +e 72427 0.622575 +e 72394 0.143867 +e 72396 0.919491 +e 72401 0.331379 +e 24251 0.862837 +e 24249 0.217062 +e 24254 0.587742 +e 24252 0.757638 +e 24286 0.173122 +e 24285 0.48995 +e 24292 0.501818 +e 24291 0.10228 +e 24416 0.451511 +e 24417 0.608627 +e 24410 0.127702 +e 24409 0.825476 +e 24401 0.538353 +e 24400 0.292415 +e 276754 0.187865 +signed_curve +e 68642 0.0277268 +e 68643 0.709812 +e 68645 0.431224 +e 68646 0.442086 +e 68654 0.69956 +e 68655 0.254614 +e 243150 0.13384 +signed_curve +e 243186 0.131704 +e 279675 0.748458 +e 68708 0.702168 +e 68710 0.439647 +e 68705 0.434305 +e 68707 0.707804 +signed_curve +e 68681 0.0693506 +e 20451 0.810491 +e 20449 0.298983 +e 20454 0.527692 +e 20452 0.863737 +e 20486 0.0978063 +e 20485 0.710101 +e 20492 0.285442 +e 20491 0.493253 +e 20616 0.256942 +e 20617 0.827694 +e 20610 0.0559401 +e 20609 0.923677 +e 20601 0.481417 +e 20600 0.368674 +e 276474 0.237445 +e 64904 0.952832 +e 64905 0.0390578 +e 64924 0.783441 +e 64923 0.790201 +e 64925 0.310543 +e 64926 0.537447 +e 64934 0.578182 +e 64935 0.357702 +signed_curve +e 279475 0.640813 +e 64988 0.580897 +e 64990 0.53676 +e 64985 0.313722 +e 64987 0.788123 +e 64954 0.0728739 +e 64956 0.91998 +e 64952 0.259465 +e 16660 0.31152 +e 16658 0.539383 +e 16669 0.717032 +e 16667 0.217515 +e 16666 0.571244 +e 16664 0.38909 +e 16703 0.663967 +e 16704 0.183884 +e 16693 0.73357 +e 16695 0.721161 +e 64637 0.44006 +e 64638 0.538735 +e 64640 0.602923 +e 64641 0.342639 +e 64649 0.792735 +e 64650 0.187548 +signed_curve +e 294326 0.271978 +e 239444 0.709302 +e 64761 0.708516 +e 64760 0.343201 +e 279462 0.645885 +e 64751 0.605496 +e 64753 0.502949 +e 64724 0.369036 +e 64726 0.741724 +e 64715 0.178284 +e 64717 0.899649 +e 20413 0.213 +e 20414 0.649916 +e 20416 0.57388 +e 20417 0.30217 +signed_curve +e 20301 0.691988 +e 20300 0.864705 +e 276450 0.844261 +signed_curve +e 197708 0.758046 +e 276448 0.210998 +signed_curve +e 20275 0.79544 +e 20274 0.395868 +e 20272 0.482222 +e 20271 0.664091 +e 20304 0.64845 +e 20305 0.118021 +e 68205 0.80955 +e 68206 0.404686 +e 24166 0.323027 +e 24167 0.909195 +e 24169 0.0747059 +e 24171 0.628927 +e 24177 0.775978 +e 24175 0.331363 +e 24185 0.480224 +e 24183 0.717537 +e 276735 0.782022 +e 201310 0.839884 +e 201311 0.0784963 +e 201302 0.848121 +e 201300 0.478998 +e 201299 0.621227 +signed_curve +e 201243 0.844408 +e 292674 0.815172 +e 201268 0.247621 +e 201269 0.543262 +e 201276 0.68705 +e 24134 0.801407 +e 24135 0.550786 +e 24128 0.0905437 +e 24127 0.891496 +e 24125 0.346585 +e 24124 0.581095 +e 24116 0.617219 +e 24115 0.279866 +e 276733 0.208974 +e 71879 0.895553 +e 71880 0.0988186 +e 71899 0.26972 +signed_curve +e 71948 0.150933 +e 71943 0.844987 +e 71945 0.284728 +e 71935 0.668346 +e 27956 0.54735 +e 27954 0.677506 +e 27959 0.252352 +e 27958 0.407447 +e 27988 0.563567 +e 27987 0.310679 +e 27930 0.113848 +e 27932 0.95274 +signed_curve +e 27916 0.524107 +e 27915 0.237368 +e 277013 0.133095 +e 75610 0.487686 +e 75609 0.849105 +e 75617 0.302672 +e 75618 0.464527 +e 75620 0.804345 +e 75621 0.152691 +signed_curve +e 75686 0.646616 +e 75688 0.438933 +e 75677 0.276683 +e 75679 0.855218 +e 75650 0.201601 +e 75651 0.260247 +e 75647 0.695472 +e 31765 0.513375 +e 31763 0.559945 +e 31774 0.405197 +e 31772 0.685244 +e 31777 0.315322 +e 31775 0.786509 +e 31785 0.206422 +signed_curve +e 208340 0.760323 +e 208339 0.329524 +signed_curve +e 208301 0.313266 +e 208302 0.571657 +e 208304 0.500719 +e 31749 0.590062 +e 31748 0.32975 +e 277293 0.725774 +e 31739 0.770118 +e 31741 0.129939 +e 31712 0.894933 +e 31713 0.654818 +signed_curve +e 79645 0.295167 +e 79644 0.582964 +e 35600 0.665056 +e 35598 0.237746 +e 35609 0.570632 +signed_curve +e 35599 0.458833 +e 79366 0.20228 +e 79365 0.663987 +e 31705 0.791688 +e 31703 0.102268 +e 31708 0.658127 +e 31707 0.559659 +e 31709 0.954751 +signed_curve +e 31727 0.137084 +e 31732 0.181753 +e 31730 0.568146 +e 31787 0.564852 +e 31788 0.201933 +e 31760 0.536898 +e 31762 0.807951 +e 31755 0.517997 +e 31756 0.101529 +e 75655 0.111132 +e 75665 0.872435 +e 75663 0.140256 +signed_curve +e 249927 0.422915 +e 249928 0.639953 +e 75765 0.326239 +e 75763 0.29847 +e 75762 0.718157 +e 75754 0.294078 +e 75753 0.713477 +e 75751 0.327558 +e 75750 0.703473 +e 31468 0.384845 +e 31467 0.545342 +e 71971 0.542182 +e 71969 0.3956 +e 71980 0.733371 +e 71978 0.247624 +e 72007 0.855955 +e 72005 0.13524 +e 279852 0.0157999 +e 72013 0.870594 +e 72012 0.832458 +e 246311 0.773169 +e 294636 0.40695 +e 246303 0.520679 +e 246305 0.348243 +e 246300 0.712989 +signed_curve +e 246360 0.464571 +e 246361 0.65354 +signed_curve +e 72046 0.734597 +e 72043 0.967328 +signed_curve +e 72033 0.311822 +e 72031 0.645755 +e 72030 0.490838 +e 27668 0.36416 +e 27667 0.711103 +e 68251 0.23463 +e 68249 0.887882 +e 68260 0.122819 +e 68258 0.958292 +e 68287 0.0401863 +e 68286 0.340141 +signed_curve +e 68196 0.195902 +e 68195 0.820493 +e 68163 0.198076 +e 68162 0.825236 +e 68160 0.213564 +e 68159 0.791536 +e 276453 0.255468 +e 20315 0.310986 +e 20316 0.637165 +e 20324 0.491207 +e 20325 0.461218 +e 20327 0.667966 +e 20328 0.299987 +e 20336 0.811563 +e 20337 0.16922 +signed_curve +e 197753 0.392161 +e 292514 0.0887046 +signed_curve +e 197799 0.656737 +e 276454 0.277157 +signed_curve +e 20409 0.290905 +e 20398 0.699049 +e 20400 0.553663 +e 64764 0.0988073 +e 64763 0.853498 +e 64773 0.367755 +e 64771 0.245908 +e 64769 0.53196 +e 64768 0.0717255 +e 64783 0.94377 +e 64784 0.0446022 +e 64778 0.769228 +e 64776 0.088451 +e 16458 0.611877 +e 16457 0.859453 +e 60997 0.0773399 +e 60996 0.813053 +e 60963 0.43121 +e 60964 0.887933 +e 60966 0.0764684 +e 60968 0.745053 +e 60974 0.411739 +e 60973 0.139036 +e 60991 0.654729 +e 60990 0.582758 +e 60992 0.116497 +e 60994 0.844532 +e 60983 0.506937 +e 60985 0.101585 +e 60958 0.955026 +e 60959 0.0679902 +e 60918 0.432292 +e 60917 0.402881 +e 12895 0.850823 +e 12893 0.221265 +e 12904 0.767408 +e 12902 0.290812 +e 275906 0.367321 +e 12929 0.608445 +e 12930 0.439621 +e 12938 0.557937 +e 12939 0.46616 +e 190880 0.465246 +e 190878 0.523295 +signed_curve +e 13027 0.291539 +e 12995 0.736878 +e 12994 0.274455 +e 12992 0.758545 +e 12991 0.178734 +e 275912 0.1556 +e 57478 0.402553 +e 57477 0.790793 +e 57518 0.009296 +e 57517 0.985049 +e 57515 0.230011 +e 57516 0.420964 +e 57512 0.362985 +e 9060 0.197899 +e 9059 0.30247 +e 9054 0.895277 +e 9052 0.241449 +e 9086 0.447082 +signed_curve +e 9091 0.435581 +e 9216 0.179351 +e 9215 0.632628 +e 9207 0.737368 +e 9206 0.154555 +e 9204 0.846069 +e 9203 0.27149 +e 53796 0.729223 +signed_curve +e 9047 0.834916 +e 9048 0.161817 +e 57522 0.838192 +e 57523 0.188062 +e 57525 0.811941 +e 57526 0.200781 +e 57534 0.213265 +e 57538 0.786731 +e 57536 0.224202 +signed_curve +e 294014 0.231237 +e 232580 0.768182 +e 57507 0.776113 +e 57506 0.224196 +e 57498 0.786907 +e 57497 0.213265 +e 279072 0.799199 +e 57470 0.811808 +e 57472 0.188196 +e 57461 0.837645 +e 57463 0.162361 +e 12847 0.830887 +e 12848 0.166035 +e 61242 0.833973 +e 61243 0.193128 +e 61245 0.806876 +e 61246 0.206314 +e 61254 0.793696 +e 61255 0.219275 +e 61257 0.230658 +signed_curve +e 294174 0.238439 +e 236100 0.761403 +e 61227 0.769778 +e 61226 0.230656 +e 61218 0.780834 +e 61217 0.219283 +e 279272 0.793662 +e 61190 0.806736 +e 61192 0.193269 +e 61181 0.833396 +e 61183 0.166605 +e 16647 0.826655 +e 16648 0.170475 +e 64962 0.829531 +e 64963 0.198476 +e 64965 0.80153 +e 64966 0.212165 +e 64974 0.787841 +e 64975 0.225644 +e 64977 0.237504 +e 279473 0.237033 +e 239676 0.754207 +signed_curve +e 294334 0.244558 +e 239620 0.754203 +e 64947 0.763358 +signed_curve +e 64937 0.7878 +e 64939 0.212197 +e 64910 0.801381 +e 64912 0.198626 +e 64901 0.828926 +e 64903 0.171084 +e 20447 0.82221 +e 20448 0.175167 +e 68682 0.82484 +e 68683 0.20413 +e 68685 0.795874 +e 68686 0.218375 +e 68694 0.781637 +signed_curve +e 294494 0.252378 +e 243140 0.746544 +e 68667 0.756168 +signed_curve +e 68657 0.781592 +e 68659 0.218404 +e 68630 0.795716 +e 68632 0.20429 +e 68621 0.824204 +e 68623 0.175809 +e 24247 0.817542 +e 24248 0.180126 +e 72402 0.819889 +e 72403 0.210118 +e 72405 0.789886 +e 72406 0.224948 +e 72414 0.775057 +e 72415 0.239578 +e 72417 0.252532 +signed_curve +e 294651 0.261144 +e 246665 0.738383 +e 72387 0.748434 +e 72386 0.252531 +e 279870 0.760613 +e 72377 0.775009 +e 72379 0.224985 +e 72350 0.78972 +e 72352 0.210287 +e 72341 0.819217 +e 72343 0.180799 +e 28047 0.812629 +e 28048 0.185368 +e 76122 0.81465 +e 76123 0.216478 +e 76125 0.783533 +e 76126 0.231959 +e 76134 0.768059 +e 76135 0.247231 +e 76137 0.260814 +e 250288 0.739905 +signed_curve +e 250230 0.260813 +e 76107 0.740017 +e 76106 0.260809 +e 280047 0.753051 +e 76097 0.768007 +e 76099 0.231986 +e 76070 0.783355 +e 76072 0.216654 +e 76061 0.813936 +e 76063 0.186079 +e 31847 0.807447 +e 31848 0.190919 +e 79842 0.809099 +e 79843 0.223236 +e 79845 0.776781 +e 79846 0.239423 +e 79854 0.760606 +e 79855 0.255413 +e 79857 0.269665 +e 253888 0.731436 +signed_curve +e 253830 0.269661 +e 79827 0.730635 +e 79826 0.26966 +e 280207 0.744964 +e 79817 0.760549 +e 79819 0.239442 +e 79790 0.776591 +e 79792 0.223419 +e 79781 0.80834 +e 79783 0.191674 +signed_curve +e 79782 0.785588 +e 79749 0.242233 +e 79751 0.481377 +e 79747 0.496023 +e 79748 0.813549 +e 79739 0.0838447 +e 35945 0.176345 +e 35943 0.426207 +e 35948 0.258523 +e 35946 0.59296 +e 35979 0.150666 +e 35980 0.610081 +e 79982 0.489818 +e 79983 0.545588 +e 79985 0.511788 +e 79986 0.494474 +e 79994 0.521255 +e 79995 0.500037 +e 79997 0.499089 +e 79998 0.529391 +e 254023 0.541309 +signed_curve +e 253953 0.226895 +e 253954 0.769347 +e 253962 0.232454 +e 253963 0.756413 +e 253965 0.740114 +e 280214 0.258245 +e 79964 0.279204 +e 79966 0.727543 +e 79955 0.283077 +e 79957 0.733809 +e 79930 0.253803 +e 79932 0.782106 +e 79922 0.249446 +e 79924 0.812385 +e 36136 0.67787 +e 36137 0.213604 +e 36178 0.636348 +e 36177 0.420789 +e 36176 0.349749 +e 36174 0.44692 +e 36172 0.0919127 +e 36171 0.973023 +e 36182 0.0523339 +e 36180 0.437834 +e 36185 0.860017 +e 36183 0.0556916 +e 80155 0.738801 +e 80154 0.956826 +e 36313 0.0221528 +e 36312 0.95124 +e 83766 0.901714 +e 83764 0.0215297 +e 83769 0.94502 +e 83767 0.139833 +e 83777 0.198443 +e 83776 0.702272 +e 83783 0.427314 +e 83781 0.410323 +e 83820 0.541411 +e 83821 0.343153 +e 83811 0.227389 +e 83813 0.966375 +e 40126 0.0391343 +e 40128 0.604446 +e 40134 0.935418 +e 40132 0.0774997 +e 40137 0.866146 +e 40135 0.149836 +e 40145 0.838104 +e 40143 0.162086 +signed_curve +e 40096 0.450434 +e 40088 0.551474 +e 40087 0.447368 +e 40085 0.606126 +e 40084 0.362526 +e 40076 0.721352 +e 40075 0.234148 +e 277908 0.195365 +e 87415 0.845955 +e 87416 0.160026 +e 87418 0.186106 +e 280635 0.158464 +e 87450 0.886173 +e 87451 0.120442 +signed_curve +e 261296 0.203602 +e 295159 0.13155 +e 261300 0.270341 +e 261302 0.674392 +e 261268 0.431908 +signed_curve +e 87536 0.522675 +e 87528 0.458407 +e 87527 0.578754 +e 87525 0.43385 +e 87524 0.600819 +e 87516 0.450652 +e 87515 0.580087 +e 278195 0.426242 +e 43756 0.392827 +e 43757 0.747676 +e 43760 0.0702045 +e 43790 0.964855 +e 43788 0.0556013 +e 278198 0.322727 +e 43797 0.60868 +e 43798 0.463794 +e 219480 0.471879 +e 219478 0.510413 +e 219477 0.438269 diff --git a/examples/signed-heat-demo/data/fish-unsigned.txt b/examples/signed-heat-demo/data/fish-unsigned.txt new file mode 100644 index 000000000..1de45c54c --- /dev/null +++ b/examples/signed-heat-demo/data/fish-unsigned.txt @@ -0,0 +1,34 @@ +unsigned_curve +v 1541 +v 1529 +v 2424 +v 7459 +v 7432 +v 7434 +v 12793 +v 12794 +v 12795 +v 12799 +v 16740 +v 16741 +v 12832 +v 12831 +v 10255 +v 10257 +v 10253 +v 10254 +unsigned_curve +v 599 +v 13971 +v 13970 +v 16484 +v 9058 +v 9056 +v 9051 +v 9052 +v 16423 +v 16417 +v 16418 +v 16415 +unsigned_point +v 6423 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/hemisphere-point.txt b/examples/signed-heat-demo/data/hemisphere-point.txt new file mode 100644 index 000000000..40dd57a33 --- /dev/null +++ b/examples/signed-heat-demo/data/hemisphere-point.txt @@ -0,0 +1,2 @@ +unsigned_point +v 17 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/mobius-orientable-curve.txt b/examples/signed-heat-demo/data/mobius-orientable-curve.txt new file mode 100644 index 000000000..16c72b41a --- /dev/null +++ b/examples/signed-heat-demo/data/mobius-orientable-curve.txt @@ -0,0 +1,6 @@ +signed_curve 0 +l 162 1769 2138 340 428 345 346 1848 2141 459 464 1612 1611 2400 2159 416 418 430 431 287 288 598 466 291 386 607 608 1717 380 375 1701 1709 427 377 376 241 405 233 1694 248 1708 97 95 1703 231 230 614 613 2409 2146 103 242 92 93 188 206 195 1938 167 150 149 160 159 44 46 34 137 1801 +signed_curve 1 +l 1365 1786 1895 2439 2441 1358 2266 1541 2380 2412 1553 2032 1607 1284 1484 1288 671 1475 1299 1547 1556 1536 1271 1270 1129 1523 1480 1128 1126 1318 1326 255 1233 481 482 1160 1005 664 665 1147 1426 1425 1136 1137 1012 1013 1164 543 1132 1581 1582 2104 2418 2419 1951 503 504 760 1410 1409 1352 1353 1394 1368 1070 1071 983 325 319 307 308 71 11 12 99 117 274 978 1391 935 355 792 91 28 30 258 112 361 330 329 954 989 315 314 794 793 795 724 708 810 701 700 706 1661 802 804 1680 1681 745 1687 730 729 1982 453 454 850 849 749 773 772 817 874 873 765 767 866 1715 872 645 644 738 736 583 582 585 1739 868 552 549 550 1743 1742 2187 2158 573 548 546 245 488 208 523 578 2287 2136 555 528 535 491 494 634 2433 2361 1894 489 490 654 +signed_curve 0 +l 653 640 1332 1659 1674 1672 1307 1309 1678 1340 1237 1682 511 510 1218 2068 1224 1225 1667 1685 1265 1264 728 727 1718 1256 1258 695 1732 1254 1174 1175 1010 1008 1758 635 1272 1286 1280 1281 681 680 1003 1727 1105 1104 2132 1103 734 735 16 15 1086 1089 1030 1029 517 1943 2219 2024 1051 1079 1113 1038 951 1121 1067 1069 1850 1416 992 419 420 163 162 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/polygon-bear.txt b/examples/signed-heat-demo/data/polygon-bear.txt new file mode 100644 index 000000000..8e635bf04 --- /dev/null +++ b/examples/signed-heat-demo/data/polygon-bear.txt @@ -0,0 +1,16 @@ +signed_curve 1 +l 1995 2107 2106 2105 2104 2103 1987 2033 2032 +signed_curve 1 +l 2019 2066 2065 2064 2063 1992 2056 2055 1982 2098 1993 2062 +signed_curve 1 +l 2012 2031 2030 2017 2097 2096 2095 2003 2047 2008 2010 2058 2002 2007 2078 +signed_curve 1 +l 2014 2023 2018 2054 2053 2052 2051 1991 2092 2091 +signed_curve 1 +l 2059 1996 2057 1983 2045 1988 2022 2021 2015 2026 2025 2024 2011 2076 2075 2074 +signed_curve 1 +l 2039 2038 1598 2086 2085 1998 2044 2043 2016 2070 2005 2042 2041 +signed_curve 1 +l 1994 2084 2083 2082 2004 2037 2036 2035 2034 2000 2109 2108 2013 2071 2001 +signed_curve 1 +l 2079 222 2102 2101 2100 2099 1989 2049 \ No newline at end of file diff --git a/examples/signed-heat-demo/data/screwdriver.txt b/examples/signed-heat-demo/data/screwdriver.txt new file mode 100644 index 000000000..484ba2531 --- /dev/null +++ b/examples/signed-heat-demo/data/screwdriver.txt @@ -0,0 +1,297 @@ +signed_curve +v 2638 +v 2632 +v 9317 +v 7712 +v 7675 +v 9354 +v 7557 +v 7566 +v 9348 +v 7510 +v 7517 +v 7640 +v 7718 +v 7746 +v 2495 +v 7716 +v 7628 +v 7719 +v 7682 +v 7689 +v 7731 +v 7529 +v 7602 +v 7569 +v 9068 +v 7642 +v 7563 +v 11784 +v 7780 +v 7521 +v 7551 +v 9966 +v 7505 +v 7921 +v 7530 +v 7561 +v 11415 +v 7534 +v 7669 +v 11689 +v 7502 +v 9200 +v 12020 +v 7694 +v 7571 +v 7695 +v 7842 +v 7692 +v 7708 +v 7539 +v 7601 +v 3341 +v 11659 +v 8889 +v 11765 +v 7645 +v 7903 +v 7671 +v 7851 +v 7726 +v 9380 +v 7795 +v 7633 +v 7879 +v 9402 +v 7546 +v 7893 +v 7512 +v 9345 +v 7526 +v 7619 +v 9357 +v 7531 +v 7595 +v 9372 +v 7745 +v 3719 +v 7696 +v 9386 +v 7725 +v 7549 +v 7590 +v 7660 +v 7673 +signed_curve +v 7604 +v 4161 +v 7518 +v 7667 +v 7618 +v 7588 +v 7600 +v 9400 +v 7686 +v 11502 +v 12095 +v 7608 +v 12032 +v 7670 +v 7732 +v 12034 +v 7646 +v 7702 +v 9411 +v 7899 +v 7798 +v 11699 +v 4274 +v 7727 +v 9219 +v 7637 +v 7679 +v 7548 +v 11947 +v 7688 +v 7717 +v 7685 +v 7578 +v 7609 +v 7555 +v 7504 +v 7687 +v 7514 +v 7597 +v 7556 +v 4121 +v 4084 +v 7706 +v 7519 +v 4024 +v 7582 +v 7904 +v 3990 +v 7562 +v 7693 +v 7527 +v 7672 +v 7663 +v 7714 +v 7680 +v 7533 +v 7698 +v 7540 +v 9328 +v 11914 +v 7565 +v 7576 +v 7920 +v 7542 +v 9207 +v 7544 +signed_curve +v 7550 +v 7648 +v 7665 +v 8912 +v 7570 +v 7738 +v 11839 +v 7532 +v 7697 +v 7676 +v 7722 +v 7508 +v 7611 +v 7668 +v 9343 +v 7616 +v 7568 +v 7627 +v 7584 +v 7658 +v 7572 +v 7632 +v 7574 +v 7559 +v 7598 +v 7715 +v 9290 +v 1458 +v 12151 +v 7650 +v 12167 +v 9256 +v 12147 +v 7525 +signed_curve +v 1809 +v 11855 +v 1941 +v 2093 +v 7558 +v 7701 +v 7541 +v 7535 +v 7626 +v 7579 +v 7730 +v 7591 +v 7586 +v 7593 +v 7662 +v 7711 +v 7509 +v 7643 +v 7592 +v 7639 +v 7523 +v 11748 +v 7678 +v 7691 +v 7536 +v 7552 +v 7520 +v 7644 +v 7522 +v 7636 +v 7866 +v 7895 +v 7723 +v 7917 +v 7625 +v 7911 +v 7631 +v 7674 +v 7659 +v 7638 +v 7583 +v 7511 +v 7700 +v 9397 +v 7564 +signed_curve +v 2776 +v 9162 +v 9376 +v 2900 +v 7756 +v 7735 +v 9311 +v 7515 +v 7690 +v 7811 +v 7560 +v 7818 +v 7736 +v 7801 +v 7641 +v 7805 +v 7620 +v 11865 +v 7915 +v 11601 +v 7624 +v 7516 +v 7914 +v 7613 +v 7596 +v 7710 +v 7684 +v 7629 +v 7652 +v 7906 +v 7612 +v 7545 +v 7573 +v 7567 +v 7699 +v 7554 +v 7835 +v 7594 +v 7580 +v 7575 +v 7547 +v 7553 +v 7703 +v 11259 +v 7630 +v 7728 +v 7705 +v 7729 +v 7524 +v 7677 +v 7647 +v 7603 +v 7605 +v 7503 +v 7577 +v 7661 +v 7720 +v 7513 +v 12010 +v 7635 +v 7657 +v 7617 +v 2776 diff --git a/examples/signed-heat-demo/data/shark-cupcake.txt b/examples/signed-heat-demo/data/shark-cupcake.txt new file mode 100644 index 000000000..3776a1c1b --- /dev/null +++ b/examples/signed-heat-demo/data/shark-cupcake.txt @@ -0,0 +1,485 @@ +signed_curve +v 11937 +v 13540 +v 13625 +v 13842 +v 13794 +v 13747 +v 13701 +v 13679 +v 13580 +v 13898 +v 13768 +v 13939 +v 13979 +v 13579 +v 13733 +v 13896 +v 13883 +v 13864 +v 13866 +v 13971 +v 13550 +v 13993 +v 13992 +v 13991 +v 13751 +v 13721 +v 14009 +v 14008 +v 14007 +v 14006 +v 14005 +v 14004 +v 13600 +v 13645 +v 13728 +v 13926 +v 13889 +v 13859 +v 13822 +v 13773 +v 13686 +v 13966 +v 13609 +v 13443 +v 13554 +v 13514 +v 13477 +v 13911 +v 13879 +signed_curve +v 11311 +v 13656 +v 13612 +v 13664 +v 13564 +v 13650 +v 13862 +v 13820 +v 13775 +v 13730 +v 13691 +v 13607 +v 14026 +v 13893 +v 13750 +v 13798 +v 13705 +v 13669 +v 13628 +v 13581 +v 13543 +v 13508 +v 13972 +v 13452 +v 13462 +v 13532 +v 13739 +v 13698 +v 13659 +v 13614 +v 13572 +v 13491 +v 13974 +v 13467 +v 13583 +v 13668 +v 13627 +v 13704 +v 13542 +v 13507 +v 13472 +v 13438 +v 13950 +v 13949 +v 13948 +v 13947 +v 13946 +v 13945 +v 13906 +v 14023 +v 13815 +v 14002 +v 13873 +v 13660 +signed_curve +v 13662 +v 13740 +v 13447 +v 13474 +v 13513 +v 13549 +v 13588 +v 13632 +v 13671 +v 13914 +v 13743 +v 13551 +v 13589 +v 13635 +v 13675 +v 13711 +v 13757 +v 13848 +v 13802 +v 13712 +v 13824 +v 13865 +v 13894 +v 13932 +v 13732 +v 13693 +v 13777 +v 13652 +v 13847 +v 13776 +v 13735 +v 13692 +v 13819 +v 13461 +v 13892 +v 13930 +v 13861 +v 13790 +v 13643 +v 13683 +v 13723 +v 13770 +v 13812 +v 13597 +v 13558 +v 13528 +v 13666 +v 13786 +v 13834 +v 13872 +v 13903 +v 13938 +v 13469 +v 13498 +v 13741 +v 13613 +v 13574 +v 13618 +v 13837 +v 13700 +v 13745 +v 13792 +v 13663 +v 8208 +v 13785 +v 13832 +v 13833 +v 13963 +v 13962 +v 13871 +v 13535 +v 13497 +v 13466 +v 13937 +v 13900 +v 13480 +v 13592 +v 13638 +v 13918 +v 13990 +v 13714 +v 13568 +v 13658 +v 13531 +v 13829 +v 13475 +v 13511 +v 13547 +v 13586 +v 13441 +v 13944 +v 13912 +v 13672 +v 13633 +v 13897 +v 13695 +v 13729 +v 13774 +v 13821 +v 13608 +v 13981 +v 13563 +v 13651 +v 13527 +v 13617 +v 13509 +v 13584 +v 13545 +v 13631 +v 13473 +v 14011 +v 14010 +v 13644 +v 13973 +v 13544 +v 13752 +v 13707 +v 13670 +v 13630 +v 13435 +v 13934 +v 13899 +v 13655 +v 13986 +v 13985 +v 13988 +v 13987 +v 13697 +v 13868 +v 13828 +v 13782 +v 13737 +v 13454 +v 13552 +v 13676 +v 13590 +v 14001 +v 14000 +v 13636 +v 13849 +v 13803 +v 13758 +v 13780 +v 13709 +v 13913 +v 13446 +v 13753 +v 13970 +v 13969 +v 13968 +v 13967 +v 13799 +v 13515 +v 13478 +v 13881 +v 13846 +v 13882 +v 13742 +signed_curve +v 13634 +v 13756 +v 13801 +v 13548 +v 13512 +v 13710 +v 13674 +v 13788 +v 13907 +v 13436 +v 13470 +v 13505 +v 13838 +v 14024 +v 13791 +v 13874 +v 13746 +v 13922 +v 13755 +v 13800 +v 13843 +v 13708 +v 13975 +v 13673 +v 13880 +v 13915 +v 13444 +v 13665 +v 13983 +v 13490 +v 13793 +v 13567 +v 13977 +v 13836 +v 13961 +v 13525 +v 13960 +v 13931 +v 14021 +v 14020 +v 14019 +v 14018 +v 14017 +v 13762 +v 13718 +v 10331 +v 1503 +v 13754 +v 13488 +v 13516 +v 13448 +v 13449 +v 13917 +v 13570 +v 13716 +v 13715 +v 13760 +v 13805 +v 13851 +v 13637 +v 13952 +signed_curve +v 13494 +v 13901 +v 13582 +v 13817 +v 13855 +v 13887 +v 13924 +v 13765 +v 13720 +v 13485 +v 13456 +v 13615 +v 13646 +v 13687 +v 13727 +v 13772 +v 13816 +v 13601 +v 13561 +v 13526 +v 13884 +v 13482 +v 13519 +v 13556 +v 13641 +v 13605 +v 13681 +v 13976 +v 13451 +v 13920 +v 7949 +v 13518 +v 13639 +v 13593 +v 13555 +v 13481 +v 13450 +v 13919 +v 13445 +v 13923 +v 13455 +v 13484 +v 13688 +v 13647 +v 13603 +v 13604 +v 13562 +v 13524 +v 13927 +v 13808 +v 13853 +v 13594 +v 13954 +v 13499 +v 13965 +v 13964 +v 13835 +v 13536 +v 13904 +v 13787 +v 13439 +v 13830 +v 13869 +v 13902 +v 13781 +v 13996 +v 13995 +v 13738 +v 13495 +v 13468 +v 13935 +v 13471 +v 13857 +v 13888 +v 13925 +v 13769 +v 14016 +v 14015 +v 14014 +v 14013 +v 14012 +v 13724 +v 13458 +v 13813 +v 13684 +v 13809 +v 13460 +v 13489 +v 13530 +v 13929 +v 13943 +v 13942 +v 13891 +v 13610 +v 13653 +v 13566 +v 13463 +v 13818 +v 13860 +v 13890 +v 13726 +v 13959 +v 13958 +v 13957 +v 13956 +v 13955 +v 13689 +v 13928 +v 13771 +v 13648 +v 13699 +v 13529 +v 13565 +v 13606 +v 13486 +v 13999 +v 13998 +v 13997 +v 13457 +v 13690 +v 13731 +v 13649 +v 13437 +v 13933 +v 13464 +v 13493 +v 13867 +v 14022 +v 13827 +v 13533 +v 13905 +v 13779 +v 13807 +v 13713 +v 13759 +v 13804 +v 13677 +v 13994 +v 1747 +v 13941 +v 13940 +v 13500 +signed_curve +v 13766 +v 13722 +v 13682 +v 13642 +v 13825 +v 13585 +v 13546 +v 13510 +v 13479 +v 13440 +v 13908 +v 13876 +v 13839 +v 7904 +v 11937 diff --git a/examples/signed-heat-demo/data/sofa-scan.txt b/examples/signed-heat-demo/data/sofa-scan.txt new file mode 100644 index 000000000..17e17724e --- /dev/null +++ b/examples/signed-heat-demo/data/sofa-scan.txt @@ -0,0 +1,291 @@ +signed_curve +e 8100 0.21626 +e 9764 0.786166 +e 9763 0.186757 +e 10448 0.772995 +signed_curve +e 10956 0.703301 +e 10953 0.513881 +e 10955 0.139819 +signed_curve +e 10133 0.16295 +e 10296 0.73917 +e 10293 0.488945 +e 10295 0.216167 +e 9506 0.89262 +e 9507 0.119541 +signed_curve +e 9349 0.319034 +e 9490 0.656611 +e 9486 0.527543 +e 9488 0.316238 +e 8641 0.75929 +e 8642 0.259658 +signed_curve +e 8797 0.896084 +e 8798 0.122079 +signed_curve +e 8667 0.767558 +e 8668 0.320108 +e 8680 0.53174 +e 8679 0.257628 +signed_curve +e 24729 0.172394 +e 24731 0.743588 +e 24269 0.46109 +e 24268 0.717474 +e 24266 0.545112 +e 24267 0.618312 +signed_curve +e 24034 0.60574 +e 24107 0.174209 +signed_curve +e 23789 0.66491 +e 24300 0.245956 +e 24299 0.160093 +signed_curve +e 23997 0.616721 +e 24001 0.49128 +e 23995 0.65256 +e 23996 0.900572 +e 24081 0.0304449 +e 24082 0.75414 +e 24079 0.325371 +e 24078 0.447454 +e 24075 0.380705 +signed_curve +e 23773 0.169643 +e 24279 0.476056 +e 24280 0.69492 +e 24694 0.822123 +signed_curve +e 24693 0.457755 +e 24634 0.71243 +e 24633 0.130013 +e 24636 0.23132 +e 24637 0.565649 +e 24639 0.363811 +e 25139 0.696901 +e 25144 0.763625 +e 26159 0.551369 +e 26164 0.251764 +signed_curve +e 26772 0.197331 +e 26776 0.457422 +signed_curve +e 27526 0.774031 +e 27530 0.622024 +e 27671 0.780237 +e 27667 0.747895 +signed_curve +e 28620 0.901702 +e 28621 0.564555 +signed_curve +e 30439 0.328716 +e 30440 0.427111 +e 31250 0.506421 +signed_curve +e 32036 0.753641 +e 32038 0.324238 +e 33023 0.884264 +signed_curve +e 34619 0.558051 +e 34622 0.38474 +e 34623 0.663254 +e 35395 0.235474 +signed_curve +e 37516 0.805366 +e 37518 0.956559 +signed_curve +e 39170 0.201774 +e 39171 0.333005 +e 39755 0.621606 +signed_curve +e 39757 0.492343 +e 40333 0.561717 +e 40335 0.161988 +e 41472 0.152727 +e 41474 0.176169 +signed_curve +e 80322 0.227947 +e 80328 0.666775 +signed_curve +e 79822 0.65554 +e 79828 0.870196 +e 84227 0.164974 +signed_curve +e 83448 0.222595 +e 84450 0.227242 +e 84452 0.177556 +e 84692 0.667086 +e 85386 0.101737 +e 85385 0.887674 +e 104869 0.450491 +e 104868 0.557013 +e 104943 0.464373 +e 104944 0.464688 +e 104775 0.538025 +e 104774 0.516769 +e 104773 0.283479 +e 104881 0.48834 +e 105194 0.296336 +e 105122 0.280378 +e 105123 0.562343 +e 105124 0.587509 +e 105126 0.616619 +e 105191 0.32378 +e 105190 0.131122 +e 105253 0.163524 +e 105479 0.234111 +e 105480 0.824998 +signed_curve +e 108640 0.254016 +e 108641 0.363683 +e 108997 0.197944 +e 109003 0.855277 +e 109000 0.729475 +v 37558 +signed_curve +e 109074 0.494699 +e 109075 0.20363 +e 109076 0.267186 +e 109077 0.299179 +e 105872 0.576487 +e 105871 0.335777 +e 105874 0.761756 +e 105860 0.623807 +signed_curve +e 106039 0.38348 +e 106069 0.379819 +e 106071 0.712944 +e 106046 0.553948 +signed_curve +e 106298 0.262499 +e 106299 0.321976 +e 106272 0.596815 +e 106271 0.290733 +e 106274 0.75084 +e 88869 0.567555 +e 88867 0.233501 +e 88868 0.251409 +e 89056 0.699533 +e 89055 0.663871 +e 89058 0.673501 +e 88808 0.543503 +e 88807 0.56452 +e 88809 0.644225 +e 88810 0.826931 +signed_curve +e 85520 0.399306 +e 85527 0.553206 +e 85498 0.188729 +signed_curve +e 86236 0.390177 +e 78127 0.888195 +e 78125 0.691907 +signed_curve +e 78117 0.353248 +e 78116 0.316356 +signed_curve +e 78786 0.716181 +e 78791 0.145521 +signed_curve +e 79954 0.447136 +e 79956 0.604922 +signed_curve +e 80633 0.243258 +e 80631 0.833127 +signed_curve +e 76118 0.79271 +e 76119 0.416447 +signed_curve +e 76123 0.467464 +e 76733 0.531764 +signed_curve +e 77225 0.35346 +e 77227 0.512338 +signed_curve +e 77722 0.514936 +e 77725 0.48073 +e 77726 0.532723 +e 78290 0.460173 +e 78288 0.556803 +e 78291 0.439862 +e 78292 0.56818 +e 78891 0.427146 +e 78889 0.574551 +e 78892 0.428143 +e 78893 0.573957 +e 79509 0.418756 +signed_curve +e 79511 0.598139 +e 80156 0.398718 +signed_curve +e 80892 0.272608 +e 80894 0.310962 +e 80896 0.658129 +signed_curve +e 81716 0.667759 +e 81719 0.27625 +signed_curve +e 82301 0.766485 +e 82304 0.693859 +e 82185 0.813676 +signed_curve +e 79879 0.24957 +e 79880 0.528545 +e 79084 0.173004 +e 73666 0.192734 +e 73665 0.718448 +e 73667 0.227023 +signed_curve +e 73181 0.169737 +e 73178 0.499099 +e 73180 0.846383 +e 73136 0.317043 +e 73137 0.399551 +e 72719 0.265161 +e 66397 0.242231 +e 66395 0.834003 +signed_curve +e 65809 0.545986 +e 65749 0.548986 +signed_curve +e 61207 0.311975 +e 61206 0.58921 +signed_curve +e 60773 0.433726 +e 60771 0.209721 +signed_curve +e 21895 0.169934 +e 21740 0.529671 +signed_curve +e 21787 0.796583 +e 21788 0.676094 +e 21693 0.490809 +signed_curve +e 20961 0.379427 +e 20960 0.732931 +e 20791 0.838476 +signed_curve +e 19460 0.437993 +e 19459 0.480456 +signed_curve +e 18478 0.146183 +e 17548 0.368005 +e 17547 0.256399 +signed_curve +e 16437 0.370732 +e 16435 0.15361 +e 13932 0.224838 +signed_curve +e 11111 0.792542 +e 9319 0.309397 +e 9317 0.648219 +e 9320 0.661024 +signed_curve +e 6394 0.72762 +e 6395 0.457707 +signed_curve +e 4759 0.310721 +e 5359 0.755945 diff --git a/examples/signed-heat-demo/data/vase-nested-curves.txt b/examples/signed-heat-demo/data/vase-nested-curves.txt new file mode 100644 index 000000000..14835d3dd --- /dev/null +++ b/examples/signed-heat-demo/data/vase-nested-curves.txt @@ -0,0 +1,18 @@ +signed_curve 1 +l 3169 5064 5162 5208 5377 5376 5251 5150 5059 5374 5373 5372 5060 5401 5400 5399 5398 5149 5461 5202 5408 5407 5148 5329 5012 5393 5259 5361 5132 5213 5423 5111 5415 5414 5056 5522 5173 5045 5226 5101 5529 5528 5277 5495 5494 5493 5492 5491 5295 5392 5091 5486 5485 5140 5459 5151 5432 5169 5421 5218 5195 5427 5296 5124 5041 +signed_curve 1 +l 5224 5313 5065 5027 5476 5165 5120 5269 5442 5441 5440 5439 5438 5437 5436 5435 5434 5268 5353 5121 5453 5166 5028 5496 5312 5146 5254 5503 5085 5246 5104 5113 5282 5417 2380 5490 5020 5182 5413 5412 5080 5371 5370 5369 5185 5368 5032 5502 5501 5500 5499 5199 5297 +signed_curve 1 +l 5334 5133 5446 5119 5130 5349 5006 5276 5351 3169 +signed_curve 1 +l 5052 2912 +signed_curve 1 +l 5468 5189 5451 5156 5475 5018 5074 5477 5087 5273 5516 5517 5204 5022 5411 5178 5482 5483 5484 5129 5264 5258 5305 5318 5430 5431 5328 5422 5116 5358 5359 5306 5391 5256 5102 5365 5098 5420 5333 5478 5077 5271 5310 5449 5272 5209 5479 5480 5066 5497 5082 5463 5464 5308 5095 5470 5471 5106 5171 5488 5489 5287 5078 5447 5127 5097 5514 5062 5304 5284 5362 5363 5364 5229 5179 5267 5519 5051 5232 5010 +signed_curve 1 +l 5194 1924 5426 5075 5220 5317 5357 5019 5160 5526 5527 5279 5303 5068 5460 5266 5135 5168 1413 5311 5263 5326 5125 5211 5239 5152 5172 5507 5117 5081 5474 5281 5072 5515 5128 5192 5433 5206 5452 5030 5299 5465 5466 5467 5157 5225 5394 5395 5061 5510 5511 5280 5340 5322 5523 5524 5525 5230 5481 5107 5389 5017 5457 5458 5073 5115 5052 +signed_curve 0 +l 5274 5283 4581 5235 5402 4422 5513 5167 5222 5003 5216 5139 5518 5243 5197 5418 5037 5261 5390 5040 5262 5289 5033 5252 5521 5044 5380 5381 5382 +signed_curve 0 +l 5196 5046 5141 5164 5375 5007 5323 5487 5086 5187 5315 5089 5302 5021 5255 5347 5131 5336 5180 5126 5100 5214 5498 5158 5278 5034 5385 5288 5404 5316 5112 5397 5053 5350 5300 5339 5090 5071 5341 5342 5343 5344 5345 5346 5070 5367 5024 5088 5454 5455 5084 5193 5242 5348 5191 5203 5456 5134 5260 5221 5026 5307 5079 5176 5419 5324 5042 5244 365 5233 5147 5096 5205 5301 5005 5506 5314 5183 5170 5469 5250 5013 5029 5210 5396 5212 5109 5237 5247 5270 5215 5257 5384 5016 5403 5309 5014 5015 5355 5356 5069 5425 5337 5110 5504 1901 +signed_curve 0 +l 5360 5327 5223 2472 5444 5325 5083 5462 5190 5241 5048 5105 5508 5047 5036 5175 5445 5136 5188 5505 5330 5057 5520 5184 5386 5387 5388 3568 5379 5009 5428 5429 5200 5094 5450 5154 5076 5067 5448 5291 5290 5275 5114 5023 5108 5025 5207 5274 \ No newline at end of file diff --git a/examples/signed-heat-demo/include/utils.h b/examples/signed-heat-demo/include/utils.h new file mode 100644 index 000000000..a58f04daa --- /dev/null +++ b/examples/signed-heat-demo/include/utils.h @@ -0,0 +1,131 @@ +#pragma once + +#include "geometrycentral/pointcloud/point_position_geometry.h" +#include "geometrycentral/surface/integer_coordinates_intrinsic_triangulation.h" +#include "geometrycentral/surface/signed_heat_method.h" +#include "geometrycentral/surface/surface_mesh.h" +#include "geometrycentral/surface/surface_point.h" +#include "geometrycentral/surface/vertex_position_geometry.h" + +#include "polyscope/curve_network.h" +#include "polyscope/polyscope.h" +#include "polyscope/surface_mesh.h" + +using namespace geometrycentral; +using namespace geometrycentral::surface; + +const Vector3 COLOR_NEGATIVE = {0.0627451, 0.517647, 0.94902}; // pasadena blue +const Vector3 COLOR_POSITIVE = {0.992157, 0.431373, 0.337255}; // grapefruit + +int roundToNearestInt(double x); + +template +int sgn(T val) { + return (T(0) < val) - (val < T(0)); +} + +// ================ GEOMETRIC + +Vector3 centroid(VertexPositionGeometry& geometry); + +double radius(VertexPositionGeometry& geometry, const Vector3& c); + +std::tuple boundingBox(VertexPositionGeometry& geometry); + +// ================ TOPOLOGICAL + +bool isSourceGeometryConstrained(const std::vector& curves, const std::vector& points); + +Halfedge determineHalfedgeFromVertices(const Vertex& vA, const Vertex& vB); + +SurfacePoint reinterpretTo(const SurfacePoint& p, SurfaceMesh& otherMesh); + +// ================ I/O + +std::string getHomeDirectory(const std::string& filepath); + +std::tuple, std::vector> readPointCloud(const std::string& filename); + +std::tuple, std::vector> readInput(SurfaceMesh& mesh, const std::string& filename); +std::vector> readCurveVertices(SurfaceMesh& mesh, const std::string& filename); +std::vector> readCurvePoints(pointcloud::PointCloud& cloud, const std::string& filename); + +std::vector>> +getCurveComponents(SurfaceMesh& mesh, const std::vector& curveNodes, + const std::vector>& curveEdges); + +/* `phi` is data on vertices */ +std::vector extractLevelsetAsCurves(IntrinsicGeometryInterface& geom, const Vector& phi, + double isoval = 0.); + +/* Export curves as OBJ. */ +void exportCurves(const VertexData& vertexPositions, const std::vector& curves, + const std::vector& points, const std::string& dir = "../output"); + +void exportCurves(const pointcloud::PointData& positions, + const std::vector>& curves, const std::string& dir = "../output"); + +/* Export SDF on an extrinsic surface mesh. */ +void exportSDF(EmbeddedGeometryInterface& geom, const VertexData& u, const std::string& filename, + bool useBounds = false, double lowerBound = -1, double upperBound = -1); + +void exportSDF(EmbeddedGeometryInterface& geom, const CornerData& u, const std::string& filename, + bool useBounds = false, double lowerBound = -1, double upperBound = -1); + +/* Export SDF on common subdivision. */ +void exportSDF(IntegerCoordinatesIntrinsicTriangulation& intTri, VertexPositionGeometry& manifoldGeom, + const VertexData& u, const std::string& filename, bool useBounds = false, double lowerBound = -1, + double upperBound = -1); + +void exportSDF(IntegerCoordinatesIntrinsicTriangulation& intTri, VertexPositionGeometry& manifoldGeom, + const CornerData& u, const std::string& filename, bool useBounds = false, double lowerBound = -1, + double upperBound = -1, bool normalize = true); + +/* Export SDF on a point cloud. */ +void exportSDF(const pointcloud::PointData& pointPositions, const pointcloud::PointData& u, + const std::string& filename); + +/* Normalize SDF data so it maps onto (custom) divergent colormap correctly. */ +Vector normalizeSDF(const Vector& u, const std::string& dir = "", bool useBounds = false, + double lowerBound = -1, double upperBound = -1); + +// ===================== MESH MUTATION + +std::unique_ptr +createIntrinsicTriangulation(VertexPositionGeometry& geometry, ManifoldSurfaceMesh& mesh, + const std::vector& curves); + +void setIntrinsicSolver(VertexPositionGeometry& geometry, const std::vector& curves, + const std::vector& points, std::unique_ptr& manifoldMesh, + std::unique_ptr& manifoldGeom, std::vector& curvesOnManifold, + std::vector& pointsOnManifold, + std::unique_ptr& intTri, + std::unique_ptr& solver); + +void determineSourceGeometryOnIntrinsicTriangulation(IntrinsicTriangulation& intTri, + const std::vector& curvesOnManifold, + const std::vector& pointsOnManifold, + std::vector& curvesOnIntrinsic, + std::vector& pointsOnIntrinsic); + +// ================ VISUALIZATION + +void displayInput(const VertexData& vertexPositions, const std::vector& curves, + const std::vector& pointSources, const std::string& name = "input", + bool display = true); + +void displayInput(const VertexData& vertexPositions, const std::vector>& curves, + const std::string& name = "input", bool display = true); + +void displayInput(const pointcloud::PointData& positions, + const std::vector>& curves, const std::string& name = "input", + bool display = true); + +void visualizeIntrinsicEdges(IntegerCoordinatesIntrinsicTriangulation& intTri, VertexPositionGeometry& manifoldGeom, + bool display = true); + +VertexData visualizeOnCommonSubdivision(IntegerCoordinatesIntrinsicTriangulation& intTri, + VertexPositionGeometry& manifoldGeom, VertexData& csPositions, + std::unique_ptr& csGeom, + const VertexData& phi, const std::string& quantityName, + bool rebuild = true, bool divergingColormap = true); \ No newline at end of file diff --git a/examples/signed-heat-demo/src/main.cpp b/examples/signed-heat-demo/src/main.cpp new file mode 100644 index 000000000..8215fd2c6 --- /dev/null +++ b/examples/signed-heat-demo/src/main.cpp @@ -0,0 +1,398 @@ +#include "geometrycentral/pointcloud/point_cloud_heat_solver.h" +#include "geometrycentral/surface/manifold_surface_mesh.h" +#include "geometrycentral/surface/meshio.h" +#include "geometrycentral/surface/surface_mesh_factories.h" +#include "geometrycentral/surface/transfer_functions.h" + +#include "polyscope/point_cloud.h" +#include "polyscope/polyscope.h" +#include "polyscope/surface_mesh.h" + +#include "args.hxx" +#include "imgui.h" + +#include "utils.h" + +using namespace geometrycentral; +using namespace geometrycentral::surface; + +#include +using std::chrono::duration; +using std::chrono::duration_cast; +using std::chrono::high_resolution_clock; +using std::chrono::milliseconds; + +// == Geometry-central data +std::unique_ptr mesh; +std::unique_ptr geometry; +std::unique_ptr cloud; +std::unique_ptr pointGeom; +pointcloud::PointData pointPositions, pointNormals; + +// Polyscope stuff +polyscope::SurfaceMesh* psMesh; +polyscope::PointCloud* psCloud; + +enum MeshMode { Triangle = 0, Polygon, Points }; +int MESH_MODE = MeshMode::Triangle; + +// == Intrinsic triangulation stuff. All remeshing is performed on the manifold mesh. +VertexData csPositions; +std::unique_ptr manifoldMesh; +std::unique_ptr manifoldGeom, csGeom; +std::unique_ptr intTri; +std::vector CURVES, curvesOnManifold, curvesOnIntrinsic; +std::vector POINTS, pointsOnManifold, pointsOnIntrinsic; +std::vector> POINTS_CURVES; +std::vector> POLYGON_CURVES; +float REFINE_AREA_THRESH = std::numeric_limits::infinity(); +float REFINE_ANGLE_THRESH = 25.; +int MAX_INSERTIONS = -1; +bool INTTRI_UPDATED = false; + +enum SolverMode { ExtrinsicMesh = 0, IntrinsicMesh }; +int SOLVER_MODE = SolverMode::ExtrinsicMesh; +int LAST_SOLVER_MODE; + +// Solvers & parameters +float TCOEF = 1.; +bool TIME_UPDATED = false; +SignedHeatOptions SHM_OPTIONS; +int CONSTRAINT_MODE = static_cast(LevelSetConstraint::ZeroSet); +bool SOLVE_AS_POINT_CLOUD = false; +bool VIZ = true; +bool VERBOSE, HEADLESS, IS_POLY; +std::unique_ptr signedHeatSolver, intrinsicSolver; +std::unique_ptr pointCloudSolver; +VertexData PHI, PHI_CS; +pointcloud::PointData PHI_POINTS; + +// Program variables +std::string MESHNAME = "input mesh"; +std::string MESH_FILEPATH, OUTPUT_FILENAME, DATA_DIR; +std::string OUTPUT_DIR = "../export"; +bool VIS_INTRINSIC_MESH = false; +bool COMMON_SUBDIVISION = true; +bool USE_BOUNDS = false; +float LOWER_BOUND, UPPER_BOUND; +bool CONSTRAINED_GEOM; +bool EXPORT_ON_CS = true; +std::chrono::time_point t1, t2; +std::chrono::duration ms_fp; + + +void ensureHaveIntrinsicSolver() { + + if (intrinsicSolver != nullptr) return; + + if (mesh->isManifold() && mesh->isOriented() & CONSTRAINED_GEOM) { + if (VERBOSE) std::cerr << "Constructing intrinsic solver..." << std::endl; + t1 = high_resolution_clock::now(); + setIntrinsicSolver(*geometry, CURVES, POINTS, manifoldMesh, manifoldGeom, curvesOnManifold, pointsOnManifold, + intTri, intrinsicSolver); + t2 = high_resolution_clock::now(); + ms_fp = t2 - t1; + if (VERBOSE) std::cerr << "Intrinsic solver construction time (s): " << ms_fp.count() / 1000. << std::endl; + } +} + +void solve() { + + if (MESH_MODE == MeshMode::Triangle) { + if (SOLVER_MODE == SolverMode::ExtrinsicMesh) { + + SHM_OPTIONS.levelSetConstraint = static_cast(CONSTRAINT_MODE); + if (TIME_UPDATED) signedHeatSolver->setDiffusionTimeCoefficient(TCOEF); + + t1 = high_resolution_clock::now(); + PHI = signedHeatSolver->computeDistance(CURVES, POINTS, SHM_OPTIONS); + t2 = high_resolution_clock::now(); + ms_fp = t2 - t1; + if (VERBOSE) { + std::cerr << "min: " << PHI.toVector().minCoeff() << "\tmax: " << PHI.toVector().maxCoeff() << std::endl; + std::cerr << "Solve time (s): " << ms_fp.count() / 1000. << std::endl; + } + + if (!HEADLESS) { + if (SHM_OPTIONS.levelSetConstraint != LevelSetConstraint::Multiple) { + psMesh->addVertexSignedDistanceQuantity("GSD", PHI)->setEnabled(true); + } else { + // If there's multiple level sets, it's arbitrary which one should be "zero". + psMesh->addVertexScalarQuantity("GSD", PHI)->setIsolinesEnabled(true)->setEnabled(true); + } + } + LAST_SOLVER_MODE = SolverMode::ExtrinsicMesh; + + } else { + ensureHaveIntrinsicSolver(); + determineSourceGeometryOnIntrinsicTriangulation(*intTri, curvesOnManifold, pointsOnManifold, curvesOnIntrinsic, + pointsOnIntrinsic); + if (INTTRI_UPDATED) { + intrinsicSolver.reset(new SignedHeatSolver(*intTri)); + INTTRI_UPDATED = false; + } + SHM_OPTIONS.levelSetConstraint = static_cast(CONSTRAINT_MODE); + if (TIME_UPDATED) intrinsicSolver->setDiffusionTimeCoefficient(TCOEF); + + t1 = high_resolution_clock::now(); + PHI_CS = intrinsicSolver->computeDistance(curvesOnIntrinsic, pointsOnIntrinsic, SHM_OPTIONS); + t2 = high_resolution_clock::now(); + ms_fp = t2 - t1; + if (VERBOSE) { + std::cerr << "min: " << PHI_CS.toVector().minCoeff() << "\tmax: " << PHI_CS.toVector().maxCoeff() << std::endl; + std::cerr << "Solve time (s): " << ms_fp.count() / 1000. << std::endl; + } + + PHI = transferBtoA(*intTri, PHI_CS, TransferMethod::L2); + if (!HEADLESS) { + if (SHM_OPTIONS.levelSetConstraint != LevelSetConstraint::Multiple) { + psMesh->addVertexSignedDistanceQuantity("GSD", PHI)->setEnabled(true); + visualizeOnCommonSubdivision(*intTri, *manifoldGeom, csPositions, csGeom, PHI_CS, "GSD", true, true); + } else { + // If there's multiple level sets, it's arbitrary which one should be "zero". + psMesh->addVertexScalarQuantity("GSD", PHI)->setIsolinesEnabled(true)->setEnabled(true); + visualizeOnCommonSubdivision(*intTri, *manifoldGeom, csPositions, csGeom, PHI_CS, "GSD", true, false); + } + } + LAST_SOLVER_MODE = SolverMode::IntrinsicMesh; + } + } else if (MESH_MODE == MeshMode::Points) { + SHM_OPTIONS.levelSetConstraint = static_cast(CONSTRAINT_MODE); + // Reset point cloud solver in case parameters changed. + if (TIME_UPDATED) pointCloudSolver.reset(new pointcloud::PointCloudHeatSolver(*cloud, *pointGeom, TCOEF)); + + t1 = high_resolution_clock::now(); + PHI_POINTS = pointCloudSolver->computeSignedDistance(POINTS_CURVES, pointNormals, SHM_OPTIONS); + t2 = high_resolution_clock::now(); + ms_fp = t2 - t1; + if (VERBOSE) { + std::cerr << "min: " << PHI_POINTS.toVector().minCoeff() << "\tmax: " << PHI_POINTS.toVector().maxCoeff() + << std::endl; + std::cerr << "Solve time (s): " << ms_fp.count() / 1000. << std::endl; + } + + if (!HEADLESS) psCloud->addScalarQuantity("GSD", PHI_POINTS)->setIsolinesEnabled(true)->setEnabled(true); + + } else if (MESH_MODE == MeshMode::Polygon) { + throw std::logic_error("SHM on polygon meshes is not yet released - ETA September-October 2024"); + // TODO: Set up polygon mesh solver + // signedHeatSolver->setDiffusionTimeCoefficient(TCOEF); + // Vector phi = signedHeatSolver->solve(CURVES, POINTS, SHM_OPTIONS); + + // if (!HEADLESS) psMesh->addVertexSignedDistanceQuantity("GSD", phi)->setEnabled(true); + // if (EXPORT_RESULT) { + // exportCurves(geometry->vertexPositions, CURVES, POINTS, OUTPUT_DIR + "/source.obj"); + // exportSDF(*geometry, PHI, OUTPUT_FILENAME, USE_BOUNDS, LOWER_BOUND, UPPER_BOUND); + // } + } + + TIME_UPDATED = false; +} + +void callback() { + + if (ImGui::Button("Solve")) { + solve(); + } + if (ImGui::Button("Export last solution")) { + if (MESH_MODE == MeshMode::Triangle) { + exportCurves(geometry->vertexPositions, CURVES, POINTS, OUTPUT_DIR); + if (LAST_SOLVER_MODE == SolverMode::ExtrinsicMesh) { + exportSDF(*geometry, PHI, OUTPUT_FILENAME, USE_BOUNDS, LOWER_BOUND, UPPER_BOUND); + } else if (LAST_SOLVER_MODE == SolverMode::IntrinsicMesh) { + if (!EXPORT_ON_CS) { + exportSDF(*geometry, PHI, OUTPUT_FILENAME, USE_BOUNDS, LOWER_BOUND, UPPER_BOUND); + } else { + exportSDF(*intTri, *manifoldGeom, PHI_CS, OUTPUT_FILENAME, USE_BOUNDS, LOWER_BOUND, UPPER_BOUND); + } + } + } else if (MESH_MODE == MeshMode::Points) { + exportCurves(pointGeom->positions, POINTS_CURVES, OUTPUT_DIR + "/source.obj"); + exportSDF(pointGeom->positions, PHI_POINTS, OUTPUT_FILENAME); + } else if (MESH_MODE == MeshMode::Polygon) { + // TODO + } + } + if (LAST_SOLVER_MODE == SolverMode::IntrinsicMesh) + ImGui::Checkbox("On common subdivision (vs. input mesh)", &EXPORT_ON_CS); + + ImGui::Text("Solve options"); + ImGui::Separator(); + + if (ImGui::InputFloat("tCoef", &TCOEF)) TIME_UPDATED = true; + + ImGui::Checkbox("Preserve source normals", &SHM_OPTIONS.preserveSourceNormals); + ImGui::RadioButton("Constrain zero set", &CONSTRAINT_MODE, static_cast(LevelSetConstraint::ZeroSet)); + ImGui::RadioButton("Constrain multiple levelsets", &CONSTRAINT_MODE, static_cast(LevelSetConstraint::Multiple)); + ImGui::RadioButton("No levelset constraints", &CONSTRAINT_MODE, static_cast(LevelSetConstraint::None)); + + ImGui::InputDouble("soft weight", &(SHM_OPTIONS.softLevelSetWeight)); + + ImGui::Checkbox("Specify upper/lower bounds for export", &USE_BOUNDS); + if (ImGui::TreeNode("Bounds")) { + ImGui::InputFloat("lower", &LOWER_BOUND); + ImGui::InputFloat("upper", &UPPER_BOUND); + ImGui::TreePop(); + } + + // ImGui::TreePop(); + // } + + if (MESH_MODE == MeshMode::Triangle && mesh->isManifold() && CONSTRAINED_GEOM) { + ImGui::RadioButton("Solve on extrinsic mesh", &SOLVER_MODE, SolverMode::ExtrinsicMesh); + ImGui::RadioButton("Solve on intrinsic mesh", &SOLVER_MODE, SolverMode::IntrinsicMesh); + + if (ImGui::TreeNode("Intrinsic mesh improvement")) { + if (ImGui::Checkbox("Show intrinsic edges", &VIS_INTRINSIC_MESH)) { + ensureHaveIntrinsicSolver(); + visualizeIntrinsicEdges(*intTri, *manifoldGeom, VIS_INTRINSIC_MESH); + INTTRI_UPDATED = true; + } + + if (ImGui::Button("Flip to Delaunay")) { + ensureHaveIntrinsicSolver(); + intTri->flipToDelaunay(); + VIS_INTRINSIC_MESH = true; + visualizeIntrinsicEdges(*intTri, *manifoldGeom, VIS_INTRINSIC_MESH); + INTTRI_UPDATED = true; + } + + ImGui::InputFloat("Angle thresh", &REFINE_ANGLE_THRESH); + ImGui::InputFloat("Area thresh", &REFINE_AREA_THRESH); + ImGui::InputInt("Max insert", &MAX_INSERTIONS); + if (ImGui::Button("Delaunay refine")) { + ensureHaveIntrinsicSolver(); + intTri->delaunayRefine(REFINE_ANGLE_THRESH, REFINE_AREA_THRESH, MAX_INSERTIONS); + VIS_INTRINSIC_MESH = true; + visualizeIntrinsicEdges(*intTri, *manifoldGeom, VIS_INTRINSIC_MESH); + INTTRI_UPDATED = true; + } + + ImGui::TreePop(); + } + } +} + +int main(int argc, char** argv) { + + // Configure the argument parser + args::ArgumentParser parser("Solve for generalized signed distance."); + args::HelpFlag help(parser, "help", "Display this help menu", {"help"}); + args::Positional meshFilename(parser, "mesh", "A mesh file."); + args::ValueFlag inputFilename(parser, "input", "Input curve filepath", {"i", "input"}); + args::ValueFlag outputFilename(parser, "output", "Output filename", {"o", "output"}); + + args::Group group(parser); + args::Flag verbose(group, "verbose", "Verbose output", {"V", "verbose"}); + args::Flag headless(group, "headless", "Don't use the GUI.", {"h", "headless"}); + + // Parse args + try { + parser.ParseCLI(argc, argv); + } catch (args::Help&) { + std::cout << parser; + return 0; + } catch (args::ParseError& e) { + std::cerr << e.what() << std::endl; + std::cerr << parser; + return 1; + } + + if (!meshFilename) { + std::cerr << "Please specify a mesh file as argument." << std::endl; + return EXIT_FAILURE; + } + + // Load mesh + MESH_FILEPATH = args::get(meshFilename); + DATA_DIR = getHomeDirectory(MESH_FILEPATH); + std::string ext = MESH_FILEPATH.substr(MESH_FILEPATH.find_last_of(".") + 1); + MESH_MODE = (ext == "pc") ? MeshMode::Points : MeshMode::Triangle; + + if (outputFilename) OUTPUT_DIR = getHomeDirectory(args::get(outputFilename)); + OUTPUT_FILENAME = OUTPUT_DIR + "/GSD.obj"; + HEADLESS = headless; + VERBOSE = verbose; + + if (MESH_MODE == MeshMode::Points) { + std::vector positions, normals; + std::tie(positions, normals) = readPointCloud(MESH_FILEPATH); + size_t nPts = positions.size(); + cloud = std::unique_ptr(new pointcloud::PointCloud(nPts)); + pointPositions = pointcloud::PointData(*cloud); + pointNormals = pointcloud::PointData(*cloud); + for (size_t i = 0; i < nPts; i++) { + pointPositions[i] = positions[i]; + pointNormals[i] = normals[i]; + } + pointGeom = std::unique_ptr( + new pointcloud::PointPositionGeometry(*cloud, pointPositions)); + pointCloudSolver.reset(new pointcloud::PointCloudHeatSolver(*cloud, *pointGeom, TCOEF)); + } else { + std::tie(mesh, geometry) = readSurfaceMesh(MESH_FILEPATH); + + // // Center and scale. + // Vector3 bboxMin, bboxMax; + // std::tie(bboxMin, bboxMax) = boundingBox(*geometry); + // double diag = (bboxMin - bboxMax).norm(); + // Vector3 center = centroid(*geometry); + // for (Vertex v : mesh->vertices()) { + // Vector3 p = geometry->vertexPositions[v]; + // geometry->vertexPositions[v] = (p - center) / diag; + // } + // geometry->refreshQuantities(); + + if (!mesh->isTriangular()) MESH_MODE = MeshMode::Polygon; + signedHeatSolver = std::unique_ptr(new SignedHeatSolver(*geometry)); + } + + // Load source geometry. + if (inputFilename) { + std::string filename = args::get(inputFilename); + switch (MESH_MODE) { + case (MeshMode::Triangle): { + std::tie(CURVES, POINTS) = readInput(*mesh, filename); + CONSTRAINED_GEOM = isSourceGeometryConstrained(CURVES, POINTS); + break; + } + case (MeshMode::Polygon): { + POLYGON_CURVES = readCurveVertices(*mesh, filename); + break; + } + case (MeshMode::Points): { + POINTS_CURVES = readCurvePoints(*cloud, filename); + break; + } + } + } + + // Visualize data. + if (!HEADLESS) { + polyscope::init(); + polyscope::state::userCallback = callback; + + switch (MESH_MODE) { + case (MeshMode::Triangle): { + psMesh = polyscope::registerSurfaceMesh(MESHNAME, geometry->vertexPositions, mesh->getFaceVertexList()); + psMesh->setAllPermutations(polyscopePermutations(*mesh)); + displayInput(geometry->vertexPositions, CURVES, POINTS); + break; + } + case (MeshMode::Polygon): { + psMesh = polyscope::registerSurfaceMesh(MESHNAME, geometry->vertexPositions, mesh->getFaceVertexList()); + displayInput(geometry->vertexPositions, POLYGON_CURVES); + break; + } + case (MeshMode::Points): { + psCloud = polyscope::registerPointCloud("point cloud", pointPositions); + displayInput(pointGeom->positions, POINTS_CURVES); + break; + } + } + polyscope::show(); + } else { + solve(); + } + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/examples/signed-heat-demo/src/utils.cpp b/examples/signed-heat-demo/src/utils.cpp new file mode 100644 index 000000000..690d0eede --- /dev/null +++ b/examples/signed-heat-demo/src/utils.cpp @@ -0,0 +1,1018 @@ +#include "utils.h" + +int roundToNearestInt(double x) { + + double y = x + 0.5 - (x < 0); + return (int)y; +} + +// ================ GEOMETRIC + +Vector3 centroid(VertexPositionGeometry& geometry) { + + Vector3 c = {0, 0, 0}; + SurfaceMesh& mesh = geometry.mesh; + for (Vertex v : mesh.vertices()) { + c += geometry.vertexPositions[v]; + } + c /= mesh.nVertices(); + return c; +} + +double radius(VertexPositionGeometry& geometry, const Vector3& c) { + + double r = 0; + SurfaceMesh& mesh = geometry.mesh; + for (Vertex v : mesh.vertices()) { + r = std::max(r, (c - geometry.vertexPositions[v]).norm()); + } + return r; +} + +/* + * Return one of the two pairs of furthest-away corners in the axis-aligned bounding box of the mesh. + * + * I.e., the distance between bboxMin and bboxMax is the length of the bbox's diagonal, and the length of the bbox in + * the i-th dimension is |bboxMin[i] - bboxMax[i]|. + */ +std::tuple boundingBox(VertexPositionGeometry& geometry) { + + SurfaceMesh& mesh = geometry.mesh; + const double inf = std::numeric_limits::infinity(); + Vector3 bboxMin = {inf, inf, inf}; + Vector3 bboxMax = {-inf, -inf, -inf}; + for (Vertex v : mesh.vertices()) { + Vector3& pos = geometry.vertexPositions[v]; + for (int i = 0; i < 3; i++) { + if (pos[i] <= bboxMin[i]) bboxMin[i] = pos[i]; + if (pos[i] >= bboxMax[i]) bboxMax[i] = pos[i]; + } + } + return std::make_tuple(bboxMin, bboxMax); +} + +// ================ TOPOLOGICAL + +bool isSourceGeometryConstrained(const std::vector& curves, const std::vector& points) { + + for (const Curve& curve : curves) { + for (const SurfacePoint& p : curve.nodes) { + if (p.type != SurfacePointType::Vertex) return false; + } + } + for (const SurfacePoint& p : points) { + if (p.type != SurfacePointType::Vertex) return false; + } + return true; +} + +Halfedge determineHalfedgeFromVertices(const Vertex& vA, const Vertex& vB) { + + for (Halfedge he : vA.outgoingHalfedges()) { + if (he.tipVertex() == vB) return he; + } + return Halfedge(); +} + +/* + * A SurfacePoint on the original input mesh, re-interpret to a new mesh with the same topology. + */ +SurfacePoint reinterpretTo(const SurfacePoint& p, SurfaceMesh& otherMesh) { + + switch (p.type) { + case (SurfacePointType::Vertex): + return SurfacePoint(otherMesh.vertex(p.vertex.getIndex())); + break; + case (SurfacePointType::Edge): { + Edge e = p.edge; + Vertex vA = otherMesh.vertex(e.firstVertex().getIndex()); + Vertex vB = otherMesh.vertex(e.secondVertex().getIndex()); + Edge otherEdge = determineHalfedgeFromVertices(vA, vB).edge(); + double tEdge = (e.firstVertex().getIndex() == otherEdge.firstVertex().getIndex()) ? p.tEdge : 1. - p.tEdge; + return SurfacePoint(otherEdge, tEdge); + break; + } + case (SurfacePointType::Face): + return SurfacePoint(otherMesh.face(p.face.getIndex()), p.faceCoords); + break; + } + throw std::logic_error("Bad switch"); +} + +// ================ I/O + +std::string getHomeDirectory(const std::string& filepath) { + + std::string dir(filepath.begin(), filepath.begin() + filepath.find_last_of("/") + 1); + return dir; +} + +std::tuple, std::vector> readPointCloud(const std::string& filepath) { + + std::ifstream curr_file(filepath.c_str()); + std::string line; + std::string X; + double x, y, z; + std::vector positions, normals; + if (curr_file.is_open()) { + while (!curr_file.eof()) { + getline(curr_file, line); + // Ignore any newlines + if (line == "") { + continue; + } + std::istringstream iss(line); + iss >> X; + if (X == "v") { + iss >> x >> y >> z; + positions.push_back({x, y, z}); + } else if (X == "vn") { + iss >> x >> y >> z; + normals.push_back({x, y, z}); + } + } + curr_file.close(); + } else { + std::cerr << "Could not open file <" << filepath << ">." << std::endl; + } + return std::make_tuple(positions, normals); +} + +std::tuple, std::vector> readInput(SurfaceMesh& mesh, const std::string& filename) { + + std::vector curves; + std::vector pointSources; + + std::ifstream curr_file(filename.c_str()); + std::string line; + std::string X; + SurfacePoint pt; + size_t idx; + bool flip = false; // to flip orientation or not + bool curveMode = true; + double tEdge, a, b, c; + std::vector curveFlips; + + if (curr_file.is_open()) { + while (!curr_file.eof()) { + getline(curr_file, line); + // Ignore any newlines + if (line == "") { + continue; + } + std::istringstream iss(line); + iss >> X; + if (X == "v") { + iss >> idx; + pt = SurfacePoint(mesh.vertex(idx)); + if (curveMode) { + curves.back().nodes.push_back(pt); + } else { + pointSources.push_back(pt); + } + } else if (X == "e") { + iss >> idx >> tEdge; + pt = SurfacePoint(mesh.edge(idx), tEdge); + if (curveMode) { + curves.back().nodes.push_back(pt); + } else { + pointSources.push_back(pt); + } + } else if (X == "f") { + iss >> idx >> a >> b >> c; + Vector3 faceCoords = {a, b, c}; + pt = SurfacePoint(mesh.face(idx), faceCoords); + if (curveMode) { + curves.back().nodes.push_back(pt); + } else { + pointSources.push_back(pt); + } + } else if (X == "l") { + while (true) { + if (iss.eof()) break; + iss >> idx; + idx -= 1; // OBJ elements are 1-indexed, whereas geometry-central uses 0-indexing + curves.back().nodes.push_back(SurfacePoint(mesh.vertex(idx))); + } + } else if (X == "signed_curve") { + iss >> flip; + curveFlips.push_back(flip); + curveMode = true; + curves.emplace_back(); + curves.back().isSigned = true; + } else if (X == "unsigned_curve") { + iss >> flip; + curveFlips.push_back(flip); + curveMode = true; + curves.emplace_back(); + curves.back().isSigned = false; + } else if (X == "unsigned_point") { + curveMode = false; + } else if (X == "signed_point") { + curveMode = false; + } + } + curr_file.close(); + for (size_t i = 0; i < curves.size(); i++) { + if (curveFlips[i]) { + std::reverse(curves[i].nodes.begin(), curves[i].nodes.end()); + } + } + } else { + std::cerr << "Could not open file <" << filename << ">." << std::endl; + } + return std::make_tuple(curves, pointSources); +} + +std::vector> readCurveVertices(SurfaceMesh& mesh, const std::string& filename) { + + std::vector> curves; + std::ifstream curr_file(filename.c_str()); + std::string line; + std::string X; + size_t idx; + bool flip = false; + bool read = false; + std::vector curveFlips; + + if (curr_file.is_open()) { + while (!curr_file.eof()) { + getline(curr_file, line); + // Ignore any newlines + if (line == "") { + continue; + } + std::istringstream iss(line); + iss >> X; + if (X == "signed_curve") { + iss >> flip; + curveFlips.push_back(flip); + curves.emplace_back(); + read = true; + } else if (X == "unsigned_curve") { + read = false; + } else if (X == "unsigned_point") { + read = false; + } + if (read) { + if (X == "v") { + iss >> idx; + curves.back().emplace_back(mesh.vertex(idx)); + } else if (X == "l") { + while (true) { + if (iss.eof()) break; + iss >> idx; + idx -= 1; // OBJ elements are 1-indexed, whereas geometry-central uses 0-indexing + curves.back().emplace_back(mesh.vertex(idx)); + } + } + } + } + curr_file.close(); + + for (size_t i = 0; i < curves.size(); i++) { + if (curveFlips[i]) { + std::reverse(curves[i].begin(), curves[i].end()); + } + } + + } else { + std::cerr << "Could not open file <" << filename << ">." << std::endl; + } + return curves; +} + +std::vector> readCurvePoints(pointcloud::PointCloud& cloud, + const std::string& filename) { + + std::vector> curves; + std::ifstream curr_file(filename.c_str()); + std::string line; + std::string X; + size_t idx; + bool flip = false; + bool read = false; + std::vector curveFlips; + + if (curr_file.is_open()) { + while (!curr_file.eof()) { + getline(curr_file, line); + // Ignore any newlines + if (line == "") { + continue; + } + std::istringstream iss(line); + iss >> X; + if (X == "signed_curve") { + iss >> flip; + curveFlips.push_back(flip); + curves.emplace_back(); + read = true; + } else if (X == "unsigned_curve") { + read = false; + } else if (X == "unsigned_point") { + read = false; + } + if (read) { + if (X == "v") { + iss >> idx; + curves.back().emplace_back(cloud.point(idx)); + } else if (X == "l") { + while (true) { + if (iss.eof()) break; + iss >> idx; + idx -= 1; // OBJ elements are 1-indexed, whereas geometry-central uses 0-indexing + curves.back().emplace_back(cloud.point(idx)); + } + } + } + } + curr_file.close(); + + for (size_t i = 0; i < curves.size(); i++) { + if (curveFlips[i]) { + std::reverse(curves[i].begin(), curves[i].end()); + } + } + + } else { + std::cerr << "Could not open file <" << filename << ">." << std::endl; + } + return curves; +} + +std::vector>> +getCurveComponents(SurfaceMesh& mesh, const std::vector& curveNodes, + const std::vector>& curveEdges) { + + std::vector> edgesToAdd = curveEdges; + std::vector>> curves; + size_t nSegs = curveEdges.size(); + while (edgesToAdd.size() > 0) { + std::array startSeg = edgesToAdd.back(); + edgesToAdd.pop_back(); + curves.emplace_back(); + curves.back().push_back(startSeg); + + // Add segs to the front end until we can't. + std::array currSeg = startSeg; + while (true) { + const SurfacePoint& front = curveNodes[currSeg[1]]; + bool didWeFindOne = false; + for (size_t i = 0; i < edgesToAdd.size(); i++) { + std::array otherSeg = edgesToAdd[i]; + if (curveNodes[otherSeg[0]] == front) { + currSeg = otherSeg; + curves.back().push_back(otherSeg); + edgesToAdd.erase(edgesToAdd.begin() + i); + didWeFindOne = true; + break; + } + } + if (!didWeFindOne) break; + } + + // Add segs to the back end until we can't. + currSeg = startSeg; + while (true) { + const SurfacePoint& back = curveNodes[currSeg[0]]; + bool didWeFindOne = false; + for (size_t i = 0; i < edgesToAdd.size(); i++) { + std::array otherSeg = edgesToAdd[i]; + if (curveNodes[otherSeg[1]] == back) { + currSeg = otherSeg; + curves.back().insert(curves.back().begin(), otherSeg); + edgesToAdd.erase(edgesToAdd.begin() + i); + didWeFindOne = true; + break; + } + } + if (!didWeFindOne) break; + } + } + return curves; +} + +std::vector extractLevelsetAsCurves(IntrinsicGeometryInterface& geom, const Vector& phi, double isoval) { + + SurfaceMesh& mesh = geom.mesh; + geom.requireVertexIndices(); + std::vector curveNodes; + std::vector> curveEdges; + + // Find levelset. + for (Face f : mesh.faces()) { + std::vector crossings; + std::vector> vals; + for (Halfedge he : f.adjacentHalfedges()) { + size_t vA = geom.vertexIndices[he.tailVertex()]; + size_t vB = geom.vertexIndices[he.tipVertex()]; + double valA = phi[vA]; + double valB = phi[vB]; + if (!(valA <= isoval && isoval <= valB) && !(valB <= isoval && isoval <= valA)) continue; + double t = (isoval - valA) / (valB - valA); + vals.push_back({valA, valB}); + Edge e = he.edge(); + if (!he.orientation()) t = 1. - t; + if (t >= 0. && t <= 1.) crossings.push_back(SurfacePoint(e, t)); + } + if (crossings.size() != 2) continue; + std::array seg; + for (int i = 0; i < 2; i++) { + auto iter = std::find(curveNodes.begin(), curveNodes.end(), crossings[i]); + if (iter != curveNodes.end()) { + seg[i] = iter - curveNodes.begin(); + } else { + curveNodes.push_back(crossings[i]); + seg[i] = curveNodes.size() - 1; + } + } + // Switch order of segment, so that smaller values are on the "inside" of the curve (assuming CCW orientation.) + if (vals[0][0] < vals[0][1]) { + size_t temp = seg[0]; + seg[0] = seg[1]; + seg[1] = temp; + } + curveEdges.push_back(seg); + } + + std::vector>> curveComponents = getCurveComponents(mesh, curveNodes, curveEdges); + std::vector curves; + for (size_t i = 0; i < curveComponents.size(); i++) { + curves.emplace_back(); + Curve& curve = curves.back(); + curve.isSigned = true; + size_t nSegs = curveComponents[i].size(); + for (const auto& seg : curveComponents[i]) { + curve.nodes.push_back(curveNodes[seg[0]]); + } + curve.nodes.push_back(curveNodes[curveComponents[i][nSegs - 1][1]]); + } + geom.unrequireVertexIndices(); + + return curves; +} + +void exportCurves(const VertexData& vertexPositions, const std::vector& curves, + const std::vector& points, const std::string& dir) { + + std::string pFilename = dir + "/points.obj"; + std::string cFilename = dir + "/curves.obj"; + + // Write points. + std::fstream f; + f.open(pFilename, std::ios::out | std::ios::trunc); + if (f.is_open()) { + for (const SurfacePoint& p : points) { + Vector3 pos = p.interpolate(vertexPositions); + f << "v " << pos[0] << " " << pos[1] << " " << pos[2] << "\n"; + } + f.close(); + std::cerr << "File " << pFilename << " written succesfully." << std::endl; + } else { + std::cerr << "Could not save points '" << pFilename << "'!" << std::endl; + } + + f.open(cFilename, std::ios::out | std::ios::trunc); + if (f.is_open()) { + // Assume curves have already been organized into components to be "as connected as possible". + size_t offset = 0; + for (const auto& curve : curves) { + size_t nNodes = curve.nodes.size(); + bool isClosed = (curve.nodes[0] == curve.nodes[nNodes - 1]); + size_t ub = isClosed ? nNodes - 1 : nNodes; + for (size_t i = 0; i < ub; i++) { + Vector3 pos = curve.nodes[i].interpolate(vertexPositions); + f << "v " << pos[0] << " " << pos[1] << " " << pos[2] << "\n"; + } + f << "l "; + for (size_t i = 0; i < nNodes - 1; i++) { + f << (offset + i) + 1 << " "; // OBJ files are 1-indexed + } + f << offset + (nNodes - 1) % ub + 1 << "\n"; + offset += ub; + } + f.close(); + std::cerr << "File " << cFilename << " written succesfully." << std::endl; + } else { + std::cerr << "Could not save curves '" << cFilename << "'!" << std::endl; + } +} + +void exportCurves(const pointcloud::PointData& positions, + const std::vector>& curves, const std::string& dir) { + + std::string cFilename = dir + "/curves.obj"; + + std::fstream f; + f.open(cFilename, std::ios::out | std::ios::trunc); + if (f.is_open()) { + // Assume curves have already been organized into components to be "as connected as possible". + size_t offset = 0; + for (const auto& curve : curves) { + size_t nNodes = curve.size(); + bool isClosed = (curve[0] == curve[nNodes - 1]); + size_t ub = isClosed ? nNodes - 1 : nNodes; + for (size_t i = 0; i < ub; i++) { + Vector3 pos = positions[curve[i]]; + f << "v " << pos[0] << " " << pos[1] << " " << pos[2] << "\n"; + } + f << "l "; + for (size_t i = 0; i < nNodes - 1; i++) { + f << (offset + i) + 1 << " "; // OBJ files are 1-indexed + } + f << offset + (nNodes - 1) % ub + 1 << "\n"; + offset += ub; + } + f.close(); + std::cerr << "File " << cFilename << " written succesfully." << std::endl; + } else { + std::cerr << "Could not save curves '" << cFilename << "'!" << std::endl; + } +} + +/* https://stackoverflow.com/a/141943 */ +Vector3 redistributeRGB(const Vector3& color) { + double r = color[0]; + double g = color[1]; + double b = color[2]; + double m = std::max(std::max(r, g), b); + if (m <= 1.) return color; + double total = r + g + b; + if (total >= 3.) return {1., 1., 1.}; + double x = (3. - total) / (3. * m - total); + double gray = 1. - x * m; + return {gray + x * r, gray + x * g, gray + x * b}; +} + +/* + * Create a custom diverging colormap to represent SDFs. + * Saves a M x N PPM image that has sampled the colormap at N evenly-spaced locations (includes the extrema.) + * If you have imagemagick, you can batch-convert ppm to png via: mogrify -format png *.ppm + + * Unlike typical (Matplotlib) diverging colormaps, negative/positive colors don't both fade to white near zero, + * but rather fade in opposite direction to create a very clear demarcation where sign changes. + * + * Furthermore, normalize each positive/negative portion of the colormap separately, so they both "fade to white" + * despite having different ranges. (Using uniform normalization doesn't look good) + */ +void SDFColormapToImageTexture(const Vector3& colorNegative, const Vector3& colorPositive, double split, + const std::string& dir, int M, int N) { + + std::vector powScalings = {1.0, 0.8}; // go to white faster / slower + int negSamples = roundToNearestInt(N * (split)); + int posSamples = N - negSamples; + std::vector colorsN(negSamples); + std::vector colorsP(posSamples); + double tmin = 1.; + double tmax = 1.5; + for (int i = 0; i < negSamples; i++) { + double t = i / (negSamples - 1.); + t = (1. - t) * tmin + t * tmax; + t = std::pow(t, powScalings[0]); + colorsN[i] = redistributeRGB(t * colorNegative); + } + for (int i = 0; i < posSamples; i++) { + double t = i / (posSamples - 1.); + t = (1. - t) * tmin + t * tmax; + t = std::pow(t, powScalings[1]); + colorsP[i] = redistributeRGB(t * colorPositive); + } + + // always have paler red adjacent to the curve + std::reverse(colorsN.begin(), colorsN.end()); + std::reverse(colorsP.begin(), colorsP.end()); + + std::fstream file; + std::string filename = dir + "colormap.ppm"; + file.open(filename, std::ios::out | std::ios::trunc); + if (file.is_open()) { + file << "P3\n"; + file << N << " " << M << "\n"; // width x height of image in pixels + file << "255\n"; // max value for each color + for (int j = 0; j < M; j++) { + for (int i = 0; i < N; i++) { + Vector3 color = (i < negSamples) ? colorsN[i] : colorsP[i - negSamples]; + file << int(color[0] * 255.) << " " << int(color[1] * 255.) << " " << int(color[2] * 255.) << "\n"; + } + } + std::cerr << "File " << filename << " written succesfully." << std::endl; + file.close(); + } else { + std::cerr << "Could not save file '" << filename << "'!" << std::endl; + } +} + +Vector normalizeSDF(const Vector& u, const std::string& dir, bool useBounds, double lowerBound, + double upperBound) { + + const double inf = std::numeric_limits::infinity(); + double maxNeg = 0.; + double maxPos = 0.; + double minNeg = inf; + double minPos = inf; + size_t N = u.size(); + for (size_t i = 0; i < N; i++) { + if (std::isnan(u[i])) continue; + double abs_u = std::abs(u[i]); + if (u[i] <= 0.) { + minNeg = std::min(minNeg, abs_u); + maxNeg = std::max(maxNeg, abs_u); + } else if (u[i] > 0.) { + minPos = std::min(minPos, abs_u); + maxPos = std::max(maxPos, abs_u); + } + } + + // Export custom colormap. + double rangeNeg = maxNeg - minNeg; + double rangePos = maxPos - minPos; + if (std::isinf(rangeNeg)) rangeNeg = 0.; + if (std::isinf(rangePos)) rangePos = 0.; + + double range, split; + if (useBounds) { + range = upperBound - lowerBound; + split = (rangeNeg + (-maxNeg - lowerBound)) / range; + } else { + range = rangeNeg + rangePos; + split = rangeNeg / range; + } + SDFColormapToImageTexture(COLOR_NEGATIVE, COLOR_POSITIVE, split, dir, 1, 1024); + + Vector w(N); + for (size_t i = 0; i < N; i++) { + int s = sgn(u[i]); + double abs_u = std::abs(u[i]); + double minVal = (s < 0) ? minNeg : minPos; + double val = s * ((abs_u - minVal) / range); + val += split; + w[i] = val; + } + + return w; +} + +CornerData toTexCoords(const VertexData& u) { + + CornerData texCoords(*u.getMesh()); + for (Vertex v : u.getMesh()->vertices()) { + for (Corner c : v.adjacentCorners()) { + texCoords[c] = {u[v], 1.}; + } + } + return texCoords; +} + +void exportFunction(EmbeddedGeometryInterface& geom, const VertexData& u, const std::string& filename) { + + CornerData texCoords = toTexCoords(u); + WavefrontOBJ::write(filename, geom, texCoords); +} + +void exportFunction(IntegerCoordinatesIntrinsicTriangulation& intTri, VertexPositionGeometry& manifoldGeom, + const VertexData& u, const std::string& filename) { + + CommonSubdivision& cs = intTri.getCommonSubdivision(); + cs.constructMesh(true, true); + + // Interpolate from intrinsic mesh to the common subdivision + VertexData cs_u = cs.interpolateAcrossB(u); + CornerData texCoords = toTexCoords(cs_u); + + // Export mesh + ManifoldSurfaceMesh& csMesh = *cs.mesh; + VertexData csPositions = cs.interpolateAcrossA(manifoldGeom.vertexPositions); + VertexPositionGeometry geom(csMesh, csPositions); + writeSurfaceMesh(csMesh, geom, texCoords, filename); +} + + +void exportSDF(EmbeddedGeometryInterface& geom, const VertexData& u, const std::string& filename, + bool useBounds, double lowerBound, double upperBound) { + + std::string dir = getHomeDirectory(filename); + Vector w = normalizeSDF(u.toVector(), dir, useBounds, lowerBound, upperBound); + exportFunction(geom, VertexData(*u.getMesh(), w), filename); +} + +void exportSDF(IntegerCoordinatesIntrinsicTriangulation& intTri, VertexPositionGeometry& manifoldGeom, + const VertexData& u, const std::string& filename, bool useBounds, double lowerBound, + double upperBound) { + + std::string dir = getHomeDirectory(filename); + Vector w = normalizeSDF(u.toVector(), dir, useBounds, lowerBound, upperBound); + exportFunction(intTri, manifoldGeom, VertexData(*u.getMesh(), w), filename); +} + +void exportSDF(const pointcloud::PointData& pointPositions, const pointcloud::PointData& u, + const std::string& filename) { + + std::string dir = getHomeDirectory(filename); + Vector w = normalizeSDF(u.toVector(), dir); + size_t nPoints = pointPositions.size(); + + // Write point positions. + // Store distance values as the x-component in vertex normals. + std::fstream file; + file.open(filename, std::ios::out | std::ios::trunc); + if (file.is_open()) { + for (size_t i = 0; i < nPoints; i++) { + Vector3 pos = pointPositions[i]; + file << "v " << pos[0] << " " << pos[1] << " " << pos[2] << "\n"; + file << "vn " << w[i] << " " << 0. << " " << 0. << "\n"; + } + std::cerr << "File " << filename << " written succesfully." << std::endl; + file.close(); + } else { + std::cerr << "Could not save file '" << filename << "'!" << std::endl; + } +} + +// ===================== MESH MUTATION + + +std::unique_ptr +createIntrinsicTriangulation(VertexPositionGeometry& geometry, ManifoldSurfaceMesh& mesh, + const std::vector& curves) { + + std::unique_ptr intTri = + std::unique_ptr( + new IntegerCoordinatesIntrinsicTriangulation(mesh, geometry)); + + // If curve is given as a set of mesh edges, set these edges as "marked" in the intrinsic triangulation so they + // never get flipped. + if (curves.size() > 0) { + + EdgeData markedEdges(*intTri->intrinsicMesh, false); + + geometry.requireEdgeIndices(); + for (const Curve& curve : curves) { + size_t nNodes = curve.nodes.size(); + for (size_t i = 0; i < nNodes - 1; i++) { + const SurfacePoint& pA = curve.nodes[i]; + const SurfacePoint& pB = curve.nodes[i + 1]; + Halfedge he = determineHalfedgeFromVertices(pA.vertex, pB.vertex); + size_t eIdx = geometry.edgeIndices[he.edge()]; + markedEdges[intTri->intrinsicMesh->edge(eIdx)] = true; + } + } + geometry.unrequireEdgeIndices(); + + intTri->setMarkedEdges(markedEdges); + } + return intTri; +} + +void setIntrinsicSolver(VertexPositionGeometry& geometry, const std::vector& curves, + const std::vector& points, std::unique_ptr& manifoldMesh, + std::unique_ptr& manifoldGeom, std::vector& curvesOnManifold, + std::vector& pointsOnManifold, + std::unique_ptr& intTri, + std::unique_ptr& solver) { + + // Set up corresponding manifold mesh & geometry (necessary for intrinsic triangulation operations.) + SurfaceMesh& mesh = geometry.mesh; + if (!mesh.isManifold() || !mesh.isOriented()) + throw std::logic_error( + "Mesh must be manifold and orientable to convert to geometrycentral::ManifoldSurfaceMesh."); + + manifoldMesh = mesh.toManifoldMesh(); + manifoldMesh->compress(); + + manifoldGeom = geometry.reinterpretTo(*manifoldMesh); + manifoldGeom->refreshQuantities(); + + intTri = std::unique_ptr( + new IntegerCoordinatesIntrinsicTriangulation(*manifoldMesh, *manifoldGeom)); + + // If curve is given as a set of mesh edges, set these edges as "marked" in the intrinsic triangulation so they + // never get flipped. + curvesOnManifold.clear(); + pointsOnManifold.clear(); + if (curves.size() > 0) { + + EdgeData markedEdges(*intTri->intrinsicMesh, false); + + // Re-interpret curve on the newly-constructed manifold mesh. + std::vector curveHalfedgesOnManifold; + geometry.requireVertexIndices(); + for (const Curve& curve : curves) { + curvesOnManifold.emplace_back(); + curvesOnManifold.back().isSigned = curve.isSigned; + std::vector currHalfedges; + size_t nNodes = curve.nodes.size(); + for (size_t i = 0; i < nNodes - 1; i++) { + const SurfacePoint& pA = curve.nodes[i]; + const SurfacePoint& pB = curve.nodes[i + 1]; + if (pA.type != SurfacePointType::Vertex || pB.type != SurfacePointType::Vertex) { + throw std::logic_error("setIntrinsicSolver(): Curves must be constrained to mesh edges."); + } + Vertex vA = manifoldMesh->vertex(geometry.vertexIndices[pA.vertex]); + Vertex vB = manifoldMesh->vertex(geometry.vertexIndices[pB.vertex]); + Halfedge he = determineHalfedgeFromVertices(vA, vB); + if (he == Halfedge()) { + std::cerr << "Could not find halfedge between vertices " << vA << " and " << vB << std::endl; + continue; + } + currHalfedges.push_back(he); + } + curveHalfedgesOnManifold.insert(curveHalfedgesOnManifold.end(), currHalfedges.begin(), currHalfedges.end()); + for (size_t i = 0; i < nNodes; i++) { + curvesOnManifold.back().nodes.push_back(reinterpretTo(curve.nodes[i], *manifoldMesh)); + } + } + geometry.unrequireVertexIndices(); + + manifoldGeom->requireEdgeIndices(); + for (Halfedge he : curveHalfedgesOnManifold) { + size_t eIdx = manifoldGeom->edgeIndices[he.edge()]; + markedEdges[intTri->intrinsicMesh->edge(eIdx)] = true; + } + manifoldGeom->unrequireEdgeIndices(); + + intTri->setMarkedEdges(markedEdges); + } + for (const SurfacePoint& p : points) { + SurfacePoint pt = reinterpretTo(p, *manifoldMesh); + pointsOnManifold.push_back(pt); + } + + solver = std::unique_ptr(new SignedHeatSolver(*intTri)); +} + +void determineSourceGeometryOnIntrinsicTriangulation(IntrinsicTriangulation& intTri, + const std::vector& curvesOnManifold, + const std::vector& pointsOnManifold, + std::vector& curvesOnIntrinsic, + std::vector& pointsOnIntrinsic) { + + // For some reason, need to call this first or else everything fails. Intrinsic mesh isn't built/indexed right. + intTri.traceAllIntrinsicEdgesAlongInput(); + + // Use traceInputHalfedgeAlongIntrinsic(), and verify that all SurfacePoints are vertex-type. + curvesOnIntrinsic.clear(); + pointsOnIntrinsic.clear(); + for (const Curve& curve : curvesOnManifold) { + curvesOnIntrinsic.emplace_back(); + curvesOnIntrinsic.back().isSigned = curve.isSigned; + size_t nNodes = curve.nodes.size(); + for (size_t i = 0; i < nNodes - 1; i++) { + const SurfacePoint& pA = curve.nodes[i]; + const SurfacePoint& pB = curve.nodes[i + 1]; + Halfedge he = determineHalfedgeFromVertices(pA.vertex, pB.vertex); + std::vector pts = intTri.traceInputHalfedgeAlongIntrinsic(he); + for (SurfacePoint pt : pts) assert(pt.type == SurfacePointType::Vertex); + size_t n = pts.size(); + for (size_t j = 0; j < n - 1; j++) { + curvesOnIntrinsic.back().nodes.push_back(pts[j]); + } + if (i == nNodes - 2 && curve.nodes[0] != curve.nodes[nNodes - 1]) { + curvesOnIntrinsic.back().nodes.push_back(pts[n - 1]); + } + } + if (curvesOnIntrinsic.back().nodes.size() < 2) curvesOnIntrinsic.pop_back(); + } + + for (const SurfacePoint& p : pointsOnManifold) { + SurfacePoint pt = reinterpretTo(p, *(intTri.intrinsicMesh)); + pointsOnIntrinsic.push_back(pt); + } +} + +// ================ VISUALIZATION + +void displayInput(const VertexData& vertexPositions, const std::vector& curves, + const std::vector& pointSources, const std::string& name, bool display) { + + std::vector nodes; + std::vector> edges; + std::vector edgeColors; + + // Display signed geometry in orange, unsigned geometry in black. + Vector3 signedColor = {1, 0.3, 0}; + Vector3 unsignedColor = {0, 0, 0}; + size_t offset = 0; + for (const Curve& curve : curves) { + size_t N = curve.nodes.size(); + for (size_t i = 0; i < N - 1; i++) { + nodes.push_back(curve.nodes[i].interpolate(vertexPositions)); + edges.push_back({offset + i, offset + i + 1}); + edgeColors.push_back(curve.isSigned ? signedColor : unsignedColor); + } + nodes.push_back(curve.nodes[N - 1].interpolate(vertexPositions)); + offset += N; + } + for (const SurfacePoint& p : pointSources) { + nodes.push_back(p.interpolate(vertexPositions)); + edges.push_back({offset, offset}); + edgeColors.push_back(unsignedColor); + offset += 1; + } + + auto psCurve = polyscope::registerCurveNetwork(name, nodes, edges); + // psCurve->setRadius(0.001); + psCurve->setEnabled(display); + psCurve->addEdgeColorQuantity(name, edgeColors)->setEnabled(true); +} + +void displayInput(const VertexData& vertexPositions, const std::vector>& curves, + const std::string& name, bool display) { + + std::vector nodes; + std::vector> edges; + + size_t offset = 0; + for (const auto& curve : curves) { + size_t N = curve.size(); + for (size_t i = 0; i < N - 1; i++) { + nodes.push_back(vertexPositions[curve[i]]); + edges.push_back({offset + i, offset + i + 1}); + } + nodes.push_back(vertexPositions[curve[N - 1]]); + offset += N; + } + + auto psCurve = polyscope::registerCurveNetwork(name, nodes, edges); + psCurve->setEnabled(display); + psCurve->setColor({1, 0.3, 0}); +} + +void displayInput(const pointcloud::PointData& positions, + const std::vector>& curves, const std::string& name, bool display) { + + std::vector nodes; + std::vector> edges; + + size_t offset = 0; + for (const auto& curve : curves) { + size_t N = curve.size(); + for (size_t i = 0; i < N - 1; i++) { + nodes.push_back(positions[curve[i]]); + edges.push_back({offset + i, offset + i + 1}); + } + nodes.push_back(positions[curve[N - 1]]); + offset += N; + } + + auto psCurve = polyscope::registerCurveNetwork(name, nodes, edges); + psCurve->setEnabled(display); + psCurve->setColor({1, 0.3, 0}); +} + +void visualizeIntrinsicEdges(IntegerCoordinatesIntrinsicTriangulation& intTri, VertexPositionGeometry& manifoldGeom, + bool display) { + + std::vector nodes; + std::vector> edges; + EdgeData> traces = intTri.traceAllIntrinsicEdgesAlongInput(); + for (Edge e : intTri.intrinsicMesh->edges()) { + size_t N = nodes.size(); + size_t M = traces[e].size(); + for (const auto& pt : traces[e]) { + nodes.push_back(pt.interpolate(manifoldGeom.vertexPositions)); + } + for (size_t i = 0; i < M - 1; i++) edges.push_back({N + i, N + i + 1}); + } + + auto intEdgeQ = polyscope::registerCurveNetwork("intrinsic edges", nodes, edges); + intEdgeQ->setEnabled(display); + intEdgeQ->setColor(polyscope::render::RGB_ORANGE); + intEdgeQ->setRadius(0.0005); +} + +/* + * Display VertexData quantity on the common subdivision of an intrinsic triangulation. + */ +VertexData visualizeOnCommonSubdivision(IntegerCoordinatesIntrinsicTriangulation& intTri, + VertexPositionGeometry& manifoldGeom, VertexData& csPositions, + std::unique_ptr& csGeom, + const VertexData& w, const std::string& name, bool rebuild, + bool divergingColormap) { + + CommonSubdivision& cs = intTri.getCommonSubdivision(); + cs.constructMesh(); + // Linearly interpolate data from intrinsic mesh to the common subdivision. + VertexData cs_w = cs.interpolateAcrossB(w); + + ManifoldSurfaceMesh& csMesh = *cs.mesh; + csPositions = cs.interpolateAcrossA(manifoldGeom.vertexPositions); + csGeom.reset(new VertexPositionGeometry(csMesh, csPositions)); + + if (rebuild) { + // Register and display with Polyscope + polyscope::SurfaceMesh* psCsMesh = + polyscope::registerSurfaceMesh("common subdivision", csPositions, csMesh.getFaceVertexList()); + psCsMesh->setAllPermutations(polyscopePermutations(csMesh)); + psCsMesh->setEnabled(true); + } + if (divergingColormap) { + polyscope::getSurfaceMesh("common subdivision")->addVertexSignedDistanceQuantity(name, cs_w)->setEnabled(true); + } else { + polyscope::getSurfaceMesh("common subdivision") + ->addVertexScalarQuantity(name, cs_w) + ->setIsolinesEnabled(true) + ->setEnabled(true); + } + return cs_w; +} \ No newline at end of file diff --git a/examples/stripe-patterns-demo/CMakeLists.txt b/examples/stripe-patterns-demo/CMakeLists.txt new file mode 100644 index 000000000..850c7eb27 --- /dev/null +++ b/examples/stripe-patterns-demo/CMakeLists.txt @@ -0,0 +1,65 @@ +# ## Configure the compiler +# This is a basic, decent setup that should do something sane on most compilers + +if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + # using Clang (linux or apple) or GCC + message("Using clang/gcc compiler flags") + SET(BASE_CXX_FLAGS "-std=c++11 -Wall -Wextra -g3") + SET(DISABLED_WARNINGS " -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-deprecated-declarations -Wno-missing-braces -Wno-unused-private-field") + SET(TRACE_INCLUDES " -H -Wno-error=unused-command-line-argument") + + if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + message("Setting clang-specific options") + SET(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -ferror-limit=3 -fcolor-diagnostics") + SET(CMAKE_CXX_FLAGS_DEBUG "-fsanitize=address -fno-limit-debug-info") + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + message("Setting gcc-specific options") + SET(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} -fmax-errors=5") + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} -Wno-maybe-uninitialized -Wno-format-zero-length -Wno-unused-but-set-parameter -Wno-unused-but-set-variable") + endif() + + SET(CMAKE_CXX_FLAGS "${BASE_CXX_FLAGS} ${DISABLED_WARNINGS}") + SET(CMAKE_CXX_FLAGS_DEBUG "-g3") + + include(CheckCXXCompilerFlag) + CHECK_CXX_COMPILER_FLAG(-march=native COMPILER_SUPPORTS_MARCH_NATIVE) + + if(COMPILER_SUPPORTS_MARCH_NATIVE) + set(MARCH_NATIVE "-march=native") + else() + set(MARCH_NATIVE "") + endif() + + SET(CMAKE_CXX_FLAGS_RELEASE "${MARCH_NATIVE} -O3 -DNDEBUG") + +elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # using Visual Studio C++ + message("Using Visual Studio compiler flags") + set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} /W4") + set(BASE_CXX_FLAGS "${BASE_CXX_FLAGS} /MP") # parallel build + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4267\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4244\"") # ignore conversion to smaller type (fires more aggressively than the gcc version, which is annoying) + SET(DISABLED_WARNINGS "${DISABLED_WARNINGS} /wd\"4305\"") # ignore truncation on initialization + SET(CMAKE_CXX_FLAGS "${BASE_CXX_FLAGS} ${DISABLED_WARNINGS}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") + + add_definitions(/D "_CRT_SECURE_NO_WARNINGS") + add_definitions(-DNOMINMAX) + add_definitions(-D_USE_MATH_DEFINES) +else() + # unrecognized + message(FATAL_ERROR "Unrecognized compiler [${CMAKE_CXX_COMPILER_ID}]") +endif() + +set(SRCS + main.cpp + + # add any other source files here +) + +add_executable(stripe-patterns-demo "${SRCS}") +find_package(args REQUIRED) +find_package(imgui CONFIG REQUIRED) +target_include_directories(stripe-patterns-demo PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include/") +target_link_libraries(stripe-patterns-demo geometry-central polyscope imgui::imgui taywee::args) diff --git a/examples/stripe-patterns-demo/main.cpp b/examples/stripe-patterns-demo/main.cpp new file mode 100644 index 000000000..531e1990f --- /dev/null +++ b/examples/stripe-patterns-demo/main.cpp @@ -0,0 +1,126 @@ +#include "geometrycentral/surface/direction_fields.h" +#include "geometrycentral/surface/manifold_surface_mesh.h" +#include "geometrycentral/surface/meshio.h" +#include "geometrycentral/surface/stripe_patterns.h" +#include "geometrycentral/surface/surface_mesh_factories.h" + + +#include "polyscope/curve_network.h" +#include "polyscope/polyscope.h" +#include "polyscope/surface_mesh.h" + + +#include "args.hxx" +#include "imgui.h" + +using namespace geometrycentral; +using namespace geometrycentral::surface; + +// == Geometry-central data +std::unique_ptr mesh; +std::unique_ptr geometry; + +// Polyscope visualization handle +polyscope::SurfaceMesh* psMesh = nullptr; + +// Parameters +float stripeFrequency = 40.0; +bool showStripes = true; +bool connectIsolines = true; + +// Stripe pattern data +VertexData guideField; +VertexData frequencies; +std::vector isolineVerts; +std::vector> isolineEdges; + +void computeStripePattern() { + // Generate a guiding field + VertexData guideField = geometrycentral::surface::computeSmoothestVertexDirectionField(*geometry, 2); + + // Compute the stripe pattern + VertexData frequencies(*mesh, stripeFrequency); + CornerData periodicFunc; + FaceData zeroIndices; + FaceData branchIndices; + std::tie(periodicFunc, zeroIndices, branchIndices) = computeStripePattern(*geometry, frequencies, guideField); + + // Extract isolines + std::vector isolineVerts; + std::vector> isolineEdges; + std::tie(isolineVerts, isolineEdges) = + extractPolylinesFromStripePattern(*geometry, periodicFunc, zeroIndices, branchIndices, guideField, false); + + // Visualize + polyscope::registerCurveNetwork("stripes", isolineVerts, isolineEdges)->setEnabled(showStripes); +} + +void myCallback() { + ImGui::PushItemWidth(100); + + if (ImGui::TreeNode("Stripe Pattern Controls")) { + bool paramsChanged = false; + + paramsChanged |= ImGui::SliderFloat("Frequency", &stripeFrequency, 1.0f, 50.0f); + paramsChanged |= ImGui::Checkbox("Connect isolines", &connectIsolines); + + if (paramsChanged) { + computeStripePattern(); + } + + ImGui::Checkbox("Show stripes", &showStripes); + if (auto* cn = polyscope::getCurveNetwork("stripes")) { + cn->setEnabled(showStripes); + } + + ImGui::TreePop(); + } + + ImGui::PopItemWidth(); +} + +int main(int argc, char** argv) { + // Configure the argument parser + args::ArgumentParser parser("Stripe Patterns Demo"); + args::HelpFlag help(parser, "help", "Display this help message", {'h', "help"}); + args::ValueFlag inputMesh(parser, "mesh", "Input mesh file", {"mesh"}); + + // Parse args + try { + parser.ParseCLI(argc, argv); + } catch (const args::Help&) { + std::cout << parser; + return 0; + } catch (const args::ParseError& e) { + std::cerr << e.what() << std::endl; + std::cerr << parser; + return 1; + } + + // Load mesh + std::string meshFilename = args::get(inputMesh); + if (meshFilename == "") { + // Load default mesh if none specified + return 0; + } else { + std::tie(mesh, geometry) = readManifoldSurfaceMesh(meshFilename); + } + + // Initialize polyscope + polyscope::init(); + + // Register the mesh with polyscope + psMesh = polyscope::registerSurfaceMesh("input mesh", geometry->inputVertexPositions, mesh->getFaceVertexList(), + polyscopePermutations(*mesh)); + + // Initial computation + computeStripePattern(); + + // Set the callback function + polyscope::state::userCallback = myCallback; + + // Give control to the polyscope gui + polyscope::show(); + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/include/polyscope/render/opengl/gl_engine_glfw.h b/include/polyscope/render/opengl/gl_engine_glfw.h index 574f2b277..b2819b83d 100644 --- a/include/polyscope/render/opengl/gl_engine_glfw.h +++ b/include/polyscope/render/opengl/gl_engine_glfw.h @@ -24,8 +24,8 @@ #include "imgui.h" #define IMGUI_IMPL_OPENGL_LOADER_GLAD -#include "backends/imgui_impl_glfw.h" -#include "backends/imgui_impl_opengl3.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_opengl3.h" #include "polyscope/render/opengl/gl_engine.h" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5e1cd2c34..8201de698 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,6 @@ # Maybe stop from CMAKEing in the wrong place -if (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) - message(FATAL_ERROR "Source and build directories cannot be the same. Go use the /build directory.") +if(CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) + message(FATAL_ERROR "Source and build directories cannot be the same. Go use the /build directory.") endif() SET(INCLUDE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../include/polyscope/") @@ -17,25 +17,25 @@ endif() # Add the main _engine file no matter what. All of the interesting parts are ifdef'd out, and this # allows us to resolve stubs. -list (APPEND BACKEND_SRCS - render/opengl/gl_engine.cpp - render/opengl/gl_engine_glfw.cpp - render/opengl/gl_engine_egl.cpp - render/mock_opengl/mock_gl_engine.cpp - render/opengl/shaders/texture_draw_shaders.cpp - render/opengl/shaders/lighting_shaders.cpp - render/opengl/shaders/grid_shaders.cpp - render/opengl/shaders/ground_plane_shaders.cpp - render/opengl/shaders/gizmo_shaders.cpp - render/opengl/shaders/histogram_shaders.cpp - render/opengl/shaders/surface_mesh_shaders.cpp - render/opengl/shaders/volume_mesh_shaders.cpp - render/opengl/shaders/vector_shaders.cpp - render/opengl/shaders/sphere_shaders.cpp - render/opengl/shaders/ribbon_shaders.cpp - render/opengl/shaders/cylinder_shaders.cpp - render/opengl/shaders/rules.cpp - render/opengl/shaders/common.cpp +list(APPEND BACKEND_SRCS + render/opengl/gl_engine.cpp + render/opengl/gl_engine_glfw.cpp + render/opengl/gl_engine_egl.cpp + render/mock_opengl/mock_gl_engine.cpp + render/opengl/shaders/texture_draw_shaders.cpp + render/opengl/shaders/lighting_shaders.cpp + render/opengl/shaders/grid_shaders.cpp + render/opengl/shaders/ground_plane_shaders.cpp + render/opengl/shaders/gizmo_shaders.cpp + render/opengl/shaders/histogram_shaders.cpp + render/opengl/shaders/surface_mesh_shaders.cpp + render/opengl/shaders/volume_mesh_shaders.cpp + render/opengl/shaders/vector_shaders.cpp + render/opengl/shaders/sphere_shaders.cpp + render/opengl/shaders/ribbon_shaders.cpp + render/opengl/shaders/cylinder_shaders.cpp + render/opengl/shaders/rules.cpp + render/opengl/shaders/common.cpp ) # Configure the render backend(s) @@ -53,31 +53,31 @@ if("${POLYSCOPE_BACKEND_OPENGL3_GLFW}") ) if(APPLE) - # On macOS, get openGL & friends from Frameworks; do not use GLAD at all + # On macOS, get openGL & friends from Frameworks; do not use GLAD at all - # NOTE: This code is essentially duplicated here and in deps/imgui/CMakeLists.txt + # NOTE: This code is essentially duplicated here and in deps/imgui/CMakeLists.txt - # Apple is playing hardball and deprecating openGL... we'll cross that bridge when we come to it - # Silence warnings about openGL deprecation - add_definitions(-DGL_SILENCE_DEPRECATION) + # Apple is playing hardball and deprecating openGL... we'll cross that bridge when we come to it + # Silence warnings about openGL deprecation + add_definitions(-DGL_SILENCE_DEPRECATION) - find_library(cocoa_library Cocoa) - find_library(opengl_library OpenGL) - find_library(corevideo_library CoreVideo) - find_library(iokit_library IOKit) - list(APPEND BACKEND_LIBS ${cocoa_library} ${opengl_library} ${corevideo_library} ${iokit_library}) + find_library(cocoa_library Cocoa) + find_library(opengl_library OpenGL) + find_library(corevideo_library CoreVideo) + find_library(iokit_library IOKit) + list(APPEND BACKEND_LIBS ${cocoa_library} ${opengl_library} ${corevideo_library} ${iokit_library}) else() - # On Windows/Linux, use the glad openGL loader - - list(APPEND BACKEND_LIBS glad) + # On Windows/Linux, use the glad openGL loader + list(APPEND BACKEND_LIBS glad::glad) endif() add_definitions(-DPOLYSCOPE_BACKEND_OPENGL3_GLFW_ENABLED) endif() -## some logic to decide whether or not EGL is available and whether we want to build with it +# # some logic to decide whether or not EGL is available and whether we want to build with it include(CheckIncludeFileCXX) CHECK_INCLUDE_FILE_CXX("EGL/egl.h" HAVE_EGL_LIB) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(IS_LINUX TRUE) else() @@ -95,24 +95,20 @@ elseif(POLYSCOPE_BACKEND_OPENGL3_EGL) # if "TRUE" (or "ON" or "YES" etc etc) if(NOT IS_LINUX) message(FATAL_ERROR "EGL backend is only supported on linux. Disable it with POLYSCOPE_BACKEND_OPENGL3_EGL=False") endif() + if(NOT HAVE_EGL_LIB) message(FATAL_ERROR "EGL backend requires EGL headers, but 'EGL/egl.h' was not found. On Ubuntu, try 'apt-get install libegl1-mesa-dev'") endif() - # we should be good-to-go for EGL - +# we should be good-to-go for EGL else() # nothing to do, already disabled endif() - - - if("${POLYSCOPE_BACKEND_OPENGL3_EGL}") message("Polyscope backend openGL3_egl enabled") # this only supports headless rendering, and as of Mar 2024 headless rendering seems to only be available on nvidia drivers. - list(APPEND BACKEND_HEADERS ${INCLUDE_ROOT}render/opengl/gl_engine_egl.h ${INCLUDE_ROOT}render/opengl/shaders/common.h @@ -121,7 +117,6 @@ if("${POLYSCOPE_BACKEND_OPENGL3_EGL}") if(APPLE) message(FATAL_ERROR "Compiling EGL backed on APPLE is not supported. Set POLYSCOPE_BACKEND_OPENGL3_EGL=False") else() - # On Windows/Linux, use the glad openGL loader list(APPEND BACKEND_LIBS glad) @@ -132,9 +127,8 @@ if("${POLYSCOPE_BACKEND_OPENGL3_EGL}") # We intentionally *do not* list this as a shared library dependency, it gets loaded optionally at runtime # via dlopen(). See explanation in gl_engine_egl.cpp. - # list(APPEND BACKEND_LIBS EGL) + # list(APPEND BACKEND_LIBS EGL) endif() - endif() add_definitions(-DPOLYSCOPE_BACKEND_OPENGL3_EGL_ENABLED) @@ -151,7 +145,6 @@ if("${POLYSCOPE_BACKEND_OPENGL_MOCK}") add_definitions(-DPOLYSCOPE_BACKEND_OPENGL_MOCK_ENABLED) endif() - SET(SRCS # Core functionality @@ -191,7 +184,7 @@ SET(SRCS weak_handle.cpp marching_cubes.cpp - ## Structures + # # Structures # Point cloud point_cloud.cpp @@ -246,7 +239,7 @@ SET(SRCS imgui_config.cpp fullscreen_artist.cpp - ## Embedded binary data + # # Embedded binary data render/bindata/bindata_font_lato_regular.cpp render/bindata/bindata_font_cousine_regular.cpp render/bindata/concrete_seamless.cpp @@ -260,7 +253,6 @@ SET(SRCS render/bindata/bindata_normal.cpp ) - # Setting headers is useful for some build systems. For instance, in Visual Studio this is necessary for the header files to be indexed as a part of the project. SET(HEADERS ${INCLUDE_ROOT}/affine_remapper.h @@ -378,5 +370,15 @@ add_definitions(-DNOMINMAX) target_include_directories(polyscope PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../include") # Link settings -target_link_libraries(polyscope PUBLIC imgui glm::glm) -target_link_libraries(polyscope PRIVATE "${BACKEND_LIBS}" stb nlohmann_json::nlohmann_json MarchingCube::MarchingCube) +find_package(glm REQUIRED) +target_compile_definitions(polyscope PUBLIC GLM_ENABLE_EXPERIMENTAL) + +find_package(nlohmann_json REQUIRED) +find_package(imgui REQUIRED) +find_package(glfw3 REQUIRED) +find_package(glad REQUIRED) +find_package(stb REQUIRED) + +target_include_directories(polyscope PUBLIC "${Stb_INCLUDE_DIR}") +target_link_libraries(polyscope PUBLIC imgui::imgui glm::glm-header-only) +target_link_libraries(polyscope PRIVATE "${BACKEND_LIBS}" nlohmann_json::nlohmann_json MarchingCube::MarchingCube) diff --git a/src/polyscope.cpp b/src/polyscope.cpp index 037eeebd8..4c8eb1c04 100644 --- a/src/polyscope.cpp +++ b/src/polyscope.cpp @@ -16,10 +16,10 @@ #include "stb_image.h" -#include "nlohmann/json.hpp" +#include "nlohmann/json.hpp/json.hpp" using json = nlohmann::json; -#include "backends/imgui_impl_opengl3.h" +#include "imgui_impl_opengl3.h" namespace polyscope { diff --git a/src/render/ground_plane.cpp b/src/render/ground_plane.cpp index dec2e2054..440ae153c 100644 --- a/src/render/ground_plane.cpp +++ b/src/render/ground_plane.cpp @@ -7,6 +7,9 @@ #include "polyscope/render/material_defs.h" #include "imgui.h" +#ifndef STB_IMAGE_IMPLEMENTATION +#define STB_IMAGE_IMPLEMENTATION +#endif #include "stb_image.h" namespace polyscope { diff --git a/src/render/opengl/gl_engine_glfw.cpp b/src/render/opengl/gl_engine_glfw.cpp index d483c2388..3296c3585 100644 --- a/src/render/opengl/gl_engine_glfw.cpp +++ b/src/render/opengl/gl_engine_glfw.cpp @@ -4,7 +4,7 @@ #include "polyscope/render/opengl/gl_engine_glfw.h" -#include "backends/imgui_impl_opengl3.h" +#include "imgui_impl_opengl3.h" #include "polyscope/polyscope.h" #include "polyscope/render/engine.h" diff --git a/src/screenshot.cpp b/src/screenshot.cpp index 9c483390a..d47034f2c 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -4,6 +4,7 @@ #include "polyscope/polyscope.h" +#define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" #include diff --git a/src/view.cpp b/src/view.cpp index 4511205e5..735873041 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -7,7 +7,7 @@ #include "imgui.h" -#include "nlohmann/json.hpp" +#include "nlohmann/json.hpp/json.hpp" using json = nlohmann::json; namespace polyscope {