Content
# three.ws
[**Website**](https://three.ws) · [**Docs**](https://three.ws/docs) · [**Changelog**](https://three.ws/changelog) · [**X / Twitter**](https://x.com/trythreews) · [**GitHub**](https://github.com/nirholas/three.ws) · [**$THREE on pump.fun**](https://pump.fun/FeMbDoX7R1Psc4GEcvJdsbNbZA3bfztcyDCatJVJpump)
[](https://three.ws) [](https://www.npmjs.com/package/@three-ws/sdk) [](https://www.npmjs.com/package/@three-ws/mcp-server) [](https://registry.modelcontextprotocol.io/?q=io.github.nirholas) [](https://www.x402scan.com/server/17cbd874-52ac-4920-a020-b22ff2489a07)
https://github.com/user-attachments/assets/d52515d1-cb04-4dd6-98bd-fef233312dc4
**Give your AI a body.** three.ws is a source-available, browser-native 3D AI agent platform. Type a prompt and [**Forge**](https://three.ws/forge) generates a textured 3D model, or drop a GLB you already have. Add an LLM brain, register on-chain, and embed anywhere: no plugins, no server uploads, no installs required.
> **Try it in 60 seconds:** open [three.ws/forge](https://three.ws/forge), type *"a brass steampunk owl, full body"*, and download the GLB. Text→3D, image→3D, and sketch→3D — free draft tier, no account. [Jump to the Forge section ↓](#forge--text--image-to-3d)
### Meet the avatar: a live 3D model, right here in markdown
Drag to rotate. This is not an image or a video: it is an interactive 3D model rendered natively by GitHub. The avatar was generated from a one-line text prompt on [three.ws Forge](https://three.ws/forge) (free tier), decimated to 1,200 triangles, and embedded as ASCII STL with [readme-3d](packages/readme-3d), our open-source toolkit for putting 3D models in any GitHub README, issue, or discussion.
```stl
solid threews_avatar
facet normal -0.34 -0.93 0.11
outer loop
vertex 7.06 -3.99 23.19
vertex 9.13 -4.19 27.78
vertex 3.98 -2.59 25.51
endloop
endfacet
facet normal -0.94 -0.30 0.16
outer loop
vertex 17.94 3.99 37.76
vertex 18.01 2.79 35.88
vertex 18.27 2.91 37.66
endloop
endfacet
facet normal -0.90 0.43 0.10
outer loop
vertex 18.27 2.91 37.66
vertex 18.01 2.79 35.88
vertex 17.73 2.15 36.16
endloop
endfacet
facet normal -0.92 0.36 0.15
outer loop
vertex 18.27 2.91 37.66
vertex 17.73 2.15 36.16
vertex 17.95 2.20 37.37
endloop
endfacet
facet normal 0.94 0.34 0.00
outer loop
vertex 27.20 5.38 33.47
vertex 28.47 1.83 38.79
vertex 28.90 0.61 31.76
endloop
endfacet
facet normal 0.91 -0.25 0.33
outer loop
vertex 28.01 -2.89 36.41
vertex 28.47 1.83 38.79
vertex 26.14 -2.49 41.92
endloop
endfacet
facet normal 0.99 -0.14 0.08
outer loop
vertex 28.47 1.83 38.79
vertex 28.01 -2.89 36.41
vertex 28.90 0.61 31.76
endloop
endfacet
facet normal 0.91 0.06 -0.40
outer loop
vertex 28.90 0.61 31.76
vertex 27.10 -0.47 27.53
vertex 27.03 3.46 27.96
endloop
endfacet
facet normal 0.83 -0.51 -0.22
outer loop
vertex 28.01 -2.89 36.41
vertex 27.10 -0.47 27.53
vertex 28.90 0.61 31.76
endloop
endfacet
facet normal 0.91 0.38 -0.16
outer loop
vertex 27.20 5.38 33.47
vertex 28.90 0.61 31.76
vertex 27.03 3.46 27.96
endloop
endfacet
facet normal 0.89 0.45 0.09
outer loop
vertex 26.88 4.99 38.80
vertex 28.47 1.83 38.79
vertex 27.20 5.38 33.47
endloop
endfacet
facet normal 0.90 -0.39 -0.20
outer loop
vertex 28.01 -2.89 36.41
vertex 26.22 -3.16 28.82
vertex 27.10 -0.47 27.53
endloop
endfacet
facet normal 0.82 -0.02 0.58
outer loop
vertex 23.27 4.13 46.24
vertex 26.14 -2.49 41.92
vertex 28.47 1.83 38.79
endloop
endfacet
facet normal 0.80 0.40 0.44
outer loop
vertex 26.88 4.99 38.80
vertex 23.27 4.13 46.24
vertex 28.47 1.83 38.79
endloop
endfacet
facet normal 0.70 -0.07 -0.71
outer loop
vertex 27.03 3.46 27.96
vertex 24.69 2.15 25.80
vertex 25.39 4.36 26.25
endloop
endfacet
facet normal 0.63 -0.73 0.27
outer loop
vertex 28.01 -2.89 36.41
vertex 26.14 -2.49 41.92
vertex 24.39 -5.14 38.78
endloop
endfacet
facet normal 0.56 -0.82 0.08
outer loop
vertex 28.01 -2.89 36.41
vertex 24.39 -5.14 38.78
vertex 24.40 -5.59 34.11
endloop
endfacet
facet normal 0.64 -0.76 -0.12
outer loop
vertex 28.01 -2.89 36.41
vertex 24.40 -5.59 34.11
vertex 26.22 -3.16 28.82
endloop
endfacet
facet normal 0.37 -0.89 -0.28
outer loop
vertex 24.40 -5.59 34.11
vertex 23.26 -5.15 31.23
vertex 26.22 -3.16 28.82
endloop
endfacet
facet normal 0.42 -0.20 -0.89
outer loop
vertex 27.10 -0.47 27.53
vertex 24.15 0.41 25.94
vertex 24.69 2.15 25.80
endloop
endfacet
facet normal 0.34 -0.94 0.00
outer loop
vertex 26.22 -3.16 28.82
vertex 23.11 -4.26 27.61
vertex 24.16 -3.89 27.34
endloop
endfacet
facet normal 0.40 -0.88 -0.23
outer loop
vertex 23.26 -5.15 31.23
vertex 23.11 -4.26 27.61
vertex 26.22 -3.16 28.82
endloop
endfacet
facet normal -0.24 0.97 -0.05
outer loop
vertex 24.58 4.14 25.81
vertex 25.39 4.36 26.25
vertex 22.37 3.43 22.62
endloop
endfacet
facet normal 0.64 -0.61 -0.46
outer loop
vertex 27.10 -0.47 27.53
vertex 24.14 -2.60 26.21
vertex 21.62 -2.12 22.03
endloop
endfacet
facet normal 0.78 -0.11 -0.62
outer loop
vertex 25.39 4.36 26.25
vertex 22.59 1.54 23.24
vertex 22.37 3.43 22.62
endloop
endfacet
facet normal 0.78 -0.12 -0.61
outer loop
vertex 25.39 4.36 26.25
vertex 24.69 2.15 25.80
vertex 22.59 1.54 23.24
endloop
endfacet
facet normal 0.46 -0.87 -0.17
outer loop
vertex 22.82 1.11 26.12
vertex 22.59 1.54 23.24
vertex 24.69 2.15 25.80
endloop
endfacet
facet normal 0.05 -0.66 -0.75
outer loop
vertex 23.11 -4.26 27.61
vertex 24.14 -2.60 26.21
vertex 24.16 -3.89 27.34
endloop
endfacet
facet normal 0.32 -0.80 0.50
outer loop
vertex 26.14 -2.49 41.92
vertex 21.60 -3.52 43.21
vertex 24.39 -5.14 38.78
endloop
endfacet
facet normal -0.37 -0.90 -0.21
outer loop
vertex 23.26 -5.15 31.23
vertex 21.41 -3.57 27.63
vertex 23.11 -4.26 27.61
endloop
endfacet
facet normal -0.23 -0.54 -0.81
outer loop
vertex 23.11 -4.26 27.61
vertex 21.41 -3.57 27.63
vertex 24.14 -2.60 26.21
endloop
endfacet
facet normal -0.01 -1.00 0.10
outer loop
vertex 24.39 -5.14 38.78
vertex 20.81 -5.34 36.22
vertex 24.40 -5.59 34.11
endloop
endfacet
facet normal 0.52 -0.77 0.37
outer loop
vertex 20.28 -1.08 52.96
vertex 18.87 -2.53 51.93
vertex 26.14 -2.49 41.92
endloop
endfacet
facet normal -0.14 -0.95 0.26
outer loop
vertex 21.60 -3.52 43.21
vertex 20.81 -5.34 36.22
vertex 24.39 -5.14 38.78
endloop
endfacet
facet normal -0.13 -0.99 -0.10
outer loop
vertex 24.40 -5.59 34.11
vertex 20.81 -5.34 36.22
vertex 23.26 -5.15 31.23
endloop
endfacet
facet normal 0.03 -0.99 -0.15
outer loop
vertex 22.82 1.11 26.12
vertex 19.99 1.49 22.99
vertex 22.59 1.54 23.24
endloop
endfacet
facet normal 0.91 0.14 0.38
outer loop
vertex 23.27 4.13 46.24
vertex 20.84 0.68 53.36
vertex 26.14 -2.49 41.92
endloop
endfacet
facet normal -0.14 -0.99 -0.03
outer loop
vertex 24.14 -2.60 26.21
vertex 18.46 -1.70 22.74
vertex 21.62 -2.12 22.03
endloop
endfacet
facet normal 0.87 0.27 0.43
outer loop
vertex 20.33 2.84 53.04
vertex 20.84 0.68 53.36
vertex 23.27 4.13 46.24
endloop
endfacet
facet normal -0.48 -0.82 0.30
outer loop
vertex 22.34 1.45 26.31
vertex 18.93 2.50 23.81
vertex 22.82 1.11 26.12
endloop
endfacet
facet normal -0.49 -0.80 0.35
outer loop
vertex 22.82 1.11 26.12
vertex 18.93 2.50 23.81
vertex 19.99 1.49 22.99
endloop
endfacet
facet normal 0.80 -0.36 0.47
outer loop
vertex 20.84 0.68 53.36
vertex 20.28 -1.08 52.96
vertex 26.14 -2.49 41.92
endloop
endfacet
facet normal -0.62 -0.30 0.72
outer loop
vertex 22.22 3.87 27.21
vertex 18.93 2.50 23.81
vertex 22.34 1.45 26.31
endloop
endfacet
facet normal -0.80 0.13 0.59
outer loop
vertex 21.74 -0.40 26.89
vertex 18.46 -1.70 22.74
vertex 21.76 -1.78 27.21
endloop
endfacet
facet normal -0.79 -0.21 0.58
outer loop
vertex 21.76 -1.78 27.21
vertex 18.46 -1.70 22.74
vertex 21.75 -2.39 26.98
endloop
endfacet
facet normal -0.54 -0.84 -0.09
outer loop
vertex 23.26 -5.15 31.23
vertex 17.89 -1.75 31.72
vertex 21.41 -3.57 27.63
endloop
endfacet
facet normal 0.10 -0.26 -0.96
outer loop
vertex 22.59 1.54 23.24
vertex 19.99 1.49 22.99
vertex 20.26 3.48 22.48
endloop
endfacet
facet normal 0.96 0.24 0.12
outer loop
vertex 20.67 -0.54 57.28
vertex 20.84 0.68 53.36
vertex 20.33 2.84 53.04
endloop
endfacet
facet normal -0.53 -0.80 -0.29
outer loop
vertex 20.81 -5.34 36.22
vertex 17.89 -1.75 31.72
vertex 23.26 -5.15 31.23
endloop
endfacet
facet normal 1.00 0.05 0.05
outer loop
vertex 19.64 4.31 87.94
vertex 19.89 8.80 78.04
vertex 19.60 7.11 85.93
endloop
endfacet
facet normal 1.00 0.04 0.04
outer loop
vertex 19.64 4.31 87.94
vertex 19.78 0.25 88.57
vertex 19.89 8.80 78.04
endloop
endfacet
facet normal 0.96 0.26 0.13
outer loop
vertex 19.46 3.33 58.61
vertex 20.67 -0.54 57.28
vertex 20.33 2.84 53.04
endloop
endfacet
facet normal 0.96 -0.29 -0.05
outer loop
vertex 20.67 -0.54 57.28
vertex 20.28 -1.08 52.96
vertex 20.84 0.68 53.36
endloop
endfacet
facet normal -0.11 -0.99 -0.07
outer loop
vertex 24.14 -2.60 26.21
vertex 21.75 -2.39 26.98
vertex 18.46 -1.70 22.74
endloop
endfacet
facet normal 1.00 -0.03 -0.02
outer loop
vertex 19.89 8.80 78.04
vertex 19.78 0.25 88.57
vertex 19.45 -6.79 83.01
endloop
endfacet
facet normal 1.00 0.00 0.07
outer loop
vertex 19.89 8.80 78.04
vertex 19.45 -6.79 83.01
vertex 20.12 -4.30 73.94
endloop
endfacet
facet normal 0.93 0.30 -0.21
outer loop
vertex 19.89 8.80 78.04
vertex 19.93 5.01 72.90
vertex 19.58 8.54 76.35
endloop
endfacet
facet normal -0.70 -0.09 0.71
outer loop
vertex 22.22 3.87 27.21
vertex 19.00 3.74 24.02
vertex 18.93 2.50 23.81
endloop
endfacet
facet normal 0.99 0.00 -0.17
outer loop
vertex 20.12 -4.30 73.94
vertex 19.78 1.87 71.95
vertex 19.93 5.01 72.90
endloop
endfacet
facet normal 1.00 0.02 -0.01
outer loop
vertex 19.89 8.80 78.04
vertex 20.12 -4.30 73.94
vertex 19.93 5.01 72.90
endloop
endfacet
facet normal 0.79 -0.61 0.01
outer loop
vertex 20.67 -0.54 57.28
vertex 18.66 -3.15 57.91
vertex 20.28 -1.08 52.96
endloop
endfacet
facet normal 0.27 -0.95 0.19
outer loop
vertex 26.14 -2.49 41.92
vertex 18.87 -2.53 51.93
vertex 21.60 -3.52 43.21
endloop
endfacet
facet normal 0.99 0.13 0.11
outer loop
vertex 19.45 -6.79 83.01
vertex 20.12 -5.67 75.56
vertex 20.12 -4.30 73.94
endloop
endfacet
facet normal -0.77 -0.07 0.63
outer loop
vertex 19.80 0.58 24.64
vertex 18.46 -1.70 22.74
vertex 21.74 -0.40 26.89
endloop
endfacet
facet normal 0.99 -0.11 0.08
outer loop
vertex 19.78 0.25 88.57
vertex 19.38 -4.86 86.48
vertex 19.45 -6.79 83.01
endloop
endfacet
facet normal 0.73 -0.52 -0.45
outer loop
vertex 20.12 -4.30 73.94
vertex 20.12 -5.67 75.56
vertex 17.93 -5.99 72.36
endloop
endfacet
facet normal 0.30 -0.95 -0.11
outer loop
vertex 19.45 -6.79 83.01
vertex 17.93 -5.99 72.36
vertex 20.12 -5.67 75.56
endloop
endfacet
facet normal -0.47 0.12 0.87
outer loop
vertex 18.22 5.83 86.97
vertex 18.49 -1.78 88.13
vertex 19.78 0.25 88.57
endloop
endfacet
facet normal 0.97 0.25 0.07
outer loop
vertex 19.11 0.55 6.61
vertex 18.74 3.81 0.23
vertex 18.00 5.61 3.97
endloop
endfacet
facet normal 1.00 0.07 -0.02
outer loop
vertex 18.74 3.81 0.23
vertex 19.11 0.55 6.61
vertex 19.30 -4.41 0.13
endloop
endfacet
facet normal 0.28 -0.37 0.89
outer loop
vertex 19.78 0.25 88.57
vertex 18.49 -1.78 88.13
vertex 18.53 -3.21 87.53
endloop
endfacet
facet normal 0.73 -0.68 -0.04
outer loop
vertex 18.66 -3.15 57.91
vertex 18.87 -2.53 51.93
vertex 20.28 -1.08 52.96
endloop
endfacet
facet normal 0.06 -0.99 0.13
outer loop
vertex 18.87 -2.53 51.93
vertex 17.09 -2.77 50.96
vertex 21.60 -3.52 43.21
endloop
endfacet
facet normal -0.68 -0.64 0.36
outer loop
vertex 21.60 -3.52 43.21
vertex 18.20 -0.42 42.36
vertex 18.38 -3.05 38.01
endloop
endfacet
facet normal 1.00 -0.02 0.05
outer loop
vertex 19.01 -4.77 6.21
vertex 19.30 -4.41 0.13
vertex 19.11 0.55 6.61
endloop
endfacet
facet normal 0.33 -0.38 0.86
outer loop
vertex 19.78 0.25 88.57
vertex 18.53 -3.21 87.53
vertex 19.38 -4.86 86.48
endloop
endfacet
facet normal -0.72 -0.69 -0.09
outer loop
vertex 20.81 -5.34 36.22
vertex 18.38 -3.05 38.01
vertex 17.89 -1.75 31.72
endloop
endfacet
facet normal -0.47 0.12 0.87
outer loop
vertex 19.64 4.31 87.94
vertex 18.22 5.83 86.97
vertex 19.78 0.25 88.57
endloop
endfacet
facet normal 0.63 -0.07 0.78
outer loop
vertex 19.46 3.33 58.61
vertex 18.15 -2.50 59.15
vertex 20.67 -0.54 57.28
endloop
endfacet
facet normal 0.73 -0.44 0.53
outer loop
vertex 20.67 -0.54 57.28
vertex 18.15 -2.50 59.15
vertex 18.66 -3.15 57.91
endloop
endfacet
facet normal -0.75 -0.58 0.31
outer loop
vertex 18.53 -3.21 87.53
vertex 19.45 -6.79 83.01
vertex 19.38 -4.86 86.48
endloop
endfacet
facet normal 0.98 -0.19 0.03
outer loop
vertex 19.01 -4.77 6.21
vertex 18.35 -9.34 0.20
vertex 19.30 -4.41 0.13
endloop
endfacet
facet normal 0.84 0.53 -0.09
outer loop
vertex 18.00 5.61 3.97
vertex 18.74 3.81 0.23
vertex 15.98 8.19 0.20
endloop
endfacet
facet normal -0.91 -0.37 0.19
outer loop
vertex 18.20 -0.42 42.36
vertex 17.46 -0.51 38.61
vertex 18.38 -3.05 38.01
endloop
endfacet
facet normal 0.41 -0.07 -0.91
outer loop
vertex 19.81 4.08 29.79
vertex 18.75 -0.34 29.66
vertex 16.22 3.38 28.24
endloop
endfacet
facet normal 0.62 0.14 0.77
outer loop
vertex 18.22 5.83 86.97
vertex 15.47 -5.06 91.14
vertex 18.49 -1.78 88.13
endloop
endfacet
facet normal 0.55 -0.05 0.83
outer loop
vertex 19.46 3.33 58.61
vertex 15.94 0.49 60.78
vertex 18.15 -2.50 59.15
endloop
endfacet
facet normal 0.37 -0.75 0.55
outer loop
vertex 18.15 -2.50 59.15
vertex 16.52 -3.84 58.40
vertex 18.66 -3.15 57.91
endloop
endfacet
facet normal 0.49 -0.77 0.41
outer loop
vertex 17.89 -1.75 31.72
vertex 17.07 -2.53 31.23
vertex 19.02 -1.97 29.92
endloop
endfacet
facet normal 0.71 -0.07 0.70
outer loop
vertex 19.11 0.55 6.61
vertex 15.26 -5.01 10.00
vertex 19.01 -4.77 6.21
endloop
endfacet
facet normal 0.91 -0.38 0.19
outer loop
vertex 19.01 -4.77 6.21
vertex 16.89 -9.62 6.67
vertex 18.35 -9.34 0.20
endloop
endfacet
facet normal 0.61 -0.66 0.44
outer loop
vertex 17.94 3.99 37.76
vertex 16.93 2.01 36.18
vertex 18.01 2.79 35.88
endloop
endfacet
facet normal -0.14 0.08 0.99
outer loop
vertex 18.70 4.53 31.50
vertex 16.29 2.09 31.35
vertex 17.47 1.45 31.57
endloop
endfacet
facet normal -0.05 0.42 0.91
outer loop
vertex 18.01 2.79 35.88
vertex 16.93 2.01 36.18
vertex 17.73 2.15 36.16
endloop
endfacet
facet normal -0.01 -0.48 0.88
outer loop
vertex 18.15 -2.50 59.15
vertex 15.94 0.49 60.78
vertex 16.52 -3.84 58.40
endloop
endfacet
facet normal 0.80 -0.22 0.57
outer loop
vertex 18.49 -1.78 88.13
vertex 15.47 -5.06 91.14
vertex 18.53 -3.21 87.53
endloop
endfacet
facet normal 0.74 -0.11 0.66
outer loop
vertex 19.11 0.55 6.61
vertex 16.35 -0.79 9.47
vertex 15.26 -5.01 10.00
endloop
endfacet
facet normal 0.70 -0.25 0.67
outer loop
vertex 19.01 -4.77 6.21
vertex 15.26 -5.01 10.00
vertex 15.17 -9.29 8.52
endloop
endfacet
facet normal 0.79 -0.59 0.15
outer loop
vertex 16.89 -9.62 6.67
vertex 16.62 -11.67 0.18
vertex 18.35 -9.34 0.20
endloop
endfacet
facet normal 0.84 0.42 0.35
outer loop
vertex 16.06 10.04 87.13
vertex 18.22 5.83 86.97
vertex 18.19 7.96 84.49
endloop
endfacet
facet normal 0.76 0.42 0.50
outer loop
vertex 15.15 6.32 7.73
vertex 19.11 0.55 6.61
vertex 18.00 5.61 3.97
endloop
endfacet
facet normal -0.32 -0.23 0.92
outer loop
vertex 17.47 -0.77 31.82
vertex 17.07 -2.53 31.23
vertex 17.89 -1.75 31.72
endloop
endfacet
facet normal 0.42 -0.87 0.26
outer loop
vertex 17.07 -2.53 31.23
vertex 16.95 -3.37 28.55
vertex 19.02 -1.97 29.92
endloop
endfacet
facet normal 0.54 0.03 -0.84
outer loop
vertex 19.02 -1.97 29.92
vertex 16.95 -3.37 28.55
vertex 15.24 -1.91 27.51
endloop
endfacet
facet normal 0.69 -0.24 0.69
outer loop
vertex 15.17 -9.29 8.52
vertex 16.89 -9.62 6.67
vertex 19.01 -4.77 6.21
endloop
endfacet
facet normal 0.93 -0.35 -0.16
outer loop
vertex 17.93 -5.99 72.36
vertex 19.45 -6.79 83.01
vertex 16.89 -9.27 73.44
endloop
endfacet
facet normal 0.30 0.32 0.90
outer loop
vertex 19.46 3.33 58.61
vertex 15.61 3.83 59.72
vertex 15.94 0.49 60.78
endloop
endfacet
facet normal 0.62 0.28 0.73
outer loop
vertex 19.11 0.55 6.61
vertex 15.15 6.32 7.73
vertex 16.35 -0.79 9.47
endloop
endfacet
facet normal 0.76 -0.16 -0.63
outer loop
vertex 20.12 -4.30 73.94
vertex 14.47 -7.07 67.83
vertex 19.78 1.87 71.95
endloop
endfacet
facet normal 0.33 -0.86 -0.39
outer loop
vertex 18.87 -2.53 51.93
vertex 15.90 -3.74 52.11
vertex 17.09 -2.77 50.96
endloop
endfacet
facet normal 0.37 -0.93 -0.08
outer loop
vertex 18.66 -3.15 57.91
vertex 15.90 -3.74 52.11
vertex 18.87 -2.53 51.93
endloop
endfacet
facet normal 0.72 -0.54 -0.42
outer loop
vertex 20.12 -4.30 73.94
vertex 17.93 -5.99 72.36
vertex 14.47 -7.07 67.83
endloop
endfacet
facet normal 0.77 0.63 0.13
outer loop
vertex 11.40 16.58 83.07
vertex 16.06 10.04 87.13
vertex 18.19 7.96 84.49
endloop
endfacet
facet normal 0.79 0.39 0.47
outer loop
vertex 15.11 9.98 88.77
vertex 18.22 5.83 86.97
vertex 16.06 10.04 87.13
endloop
endfacet
facet normal 0.88 -0.04 0.48
outer loop
vertex 15.35 3.82 92.08
vertex 15.47 -5.06 91.14
vertex 18.22 5.83 86.97
endloop
endfacet
facet normal 0.27 -0.85 -0.44
outer loop
vertex 15.90 -3.74 52.11
vertex 16.50 -1.52 48.21
vertex 17.09 -2.77 50.96
endloop
endfacet
facet normal -0.71 -0.66 0.24
outer loop
vertex 16.95 -3.37 28.55
vertex 17.07 -2.53 31.23
vertex 15.24 -1.91 27.51
endloop
endfacet
facet normal 0.83 -0.39 -0.40
outer loop
vertex 16.89 -9.27 73.44
vertex 15.58 -10.03 71.48
vertex 17.93 -5.99 72.36
endloop
endfacet
facet normal 0.80 0.37 -0.47
outer loop
vertex 18.54 7.21 74.10
vertex 19.78 1.87 71.95
vertex 14.22 8.62 67.90
endloop
endfacet
facet normal 0.97 0.25 0.08
outer loop
vertex 15.39 5.36 54.00
vertex 16.56 2.63 48.23
vertex 15.68 7.10 45.14
endloop
endfacet
facet normal -0.11 0.89 -0.44
outer loop
vertex 15.39 5.36 54.00
vertex 16.55 3.65 50.29
vertex 16.56 2.63 48.23
endloop
endfacet
facet normal 0.99 0.14 -0.07
outer loop
vertex 16.56 2.63 48.23
vertex 16.72 0.23 45.64
vertex 15.68 7.10 45.14
endloop
endfacet
facet normal -0.18 0.28 0.94
outer loop
vertex 15.61 3.83 59.72
vertex 13.19 1.84 59.86
vertex 15.94 0.49 60.78
endloop
endfacet
facet normal -0.49 -0.82 0.30
outer loop
vertex 16.29 2.09 31.35
vertex 15.35 2.03 29.63
vertex 17.47 1.45 31.57
endloop
endfacet
facet normal -0.66 0.08 0.74
outer loop
vertex 17.47 1.45 31.57
vertex 15.35 2.03 29.63
vertex 17.47 -0.77 31.82
endloop
endfacet
facet normal 0.69 -0.70 -0.19
outer loop
vertex 16.89 -9.27 73.44
vertex 11.91 -13.35 70.39
vertex 15.58 -10.03 71.48
endloop
endfacet
facet normal 0.79 0.42 -0.45
outer loop
vertex 18.54 7.21 74.10
vertex 14.22 8.62 67.90
vertex 13.55 12.96 70.78
endloop
endfacet
facet normal 0.70 0.58 0.42
outer loop
vertex 15.56 8.35 4.24
vertex 15.15 6.32 7.73
vertex 18.00 5.61 3.97
endloop
endfacet
facet normal 0.93 0.36 0.10
outer loop
vertex 13.91 9.95 51.03
vertex 15.39 5.36 54.00
vertex 15.68 7.10 45.14
endloop
endfacet
facet normal 0.98 0.14 -0.15
outer loop
vertex 16.72 0.23 45.64
vertex 15.23 2.48 37.71
vertex 15.68 7.10 45.14
endloop
endfacet
facet normal 0.96 0.20 0.17
outer loop
vertex 12.17 0.67 31.81
vertex 16.35 -0.79 9.47
vertex 15.15 6.32 7.73
endloop
endfacet
facet normal 0.98 0.01 -0.18
outer loop
vertex 16.72 0.23 45.64
vertex 15.38 -1.56 38.27
vertex 15.23 2.48 37.71
endloop
endfacet
facet normal 0.02 -0.63 -0.77
outer loop
vertex 16.52 -3.84 58.40
vertex 13.93 -3.61 58.14
vertex 18.66 -3.15 57.91
endloop
endfacet
facet normal 0.10 -0.99 0.05
outer loop
vertex 18.66 -3.15 57.91
vertex 13.93 -3.61 58.14
vertex 15.90 -3.74 52.11
endloop
endfacet
facet normal 0.96 -0.26 -0.09
outer loop
vertex 16.50 -1.52 48.21
vertex 14.15 -8.99 44.47
vertex 16.72 0.23 45.64
endloop
endfacet
facet normal 0.96 -0.29 -0.02
outer loop
vertex 16.50 -1.52 48.21
vertex 15.90 -3.74 52.11
vertex 14.15 -8.99 44.47
endloop
endfacet
facet normal 0.79 -0.39 0.47
outer loop
vertex 18.53 -3.21 87.53
vertex 15.47 -5.06 91.14
vertex 19.45 -6.79 83.01
endloop
endfacet
facet normal 0.78 -0.34 -0.52
outer loop
vertex 17.93 -5.99 72.36
vertex 15.58 -10.03 71.48
vertex 14.47 -7.07 67.83
endloop
endfacet
facet normal 0.82 -0.57 -0.07
outer loop
vertex 19.45 -6.79 83.01
vertex 14.09 -13.48 75.24
vertex 16.89 -9.27 73.44
endloop
endfacet
facet normal 0.79 -0.05 0.61
outer loop
vertex 15.35 3.82 92.08
vertex 13.27 -2.78 94.19
vertex 15.47 -5.06 91.14
endloop
endfacet
facet normal 0.52 -0.03 0.85
outer loop
vertex 16.35 -0.79 9.47
vertex 14.96 -3.20 10.24
vertex 15.26 -5.01 10.00
endloop
endfacet
facet normal 0.73 -0.68 0.08
outer loop
vertex 13.93 -12.26 86.65
vertex 14.09 -13.48 75.24
vertex 19.45 -6.79 83.01
endloop
endfacet
facet normal -0.39 -0.20 0.90
outer loop
vertex 15.94 0.49 60.78
vertex 13.19 1.84 59.86
vertex 13.54 -2.80 58.99
endloop
endfacet
facet normal 0.01 -0.48 0.88
outer loop
vertex 15.94 0.49 60.78
vertex 13.54 -2.80 58.99
vertex 16.52 -3.84 58.40
endloop
endfacet
facet normal 0.67 -0.05 -0.74
outer loop
vertex 19.78 1.87 71.95
vertex 14.47 -7.07 67.83
vertex 9.23 3.47 62.37
endloop
endfacet
facet normal 0.34 -0.07 0.94
outer loop
vertex 14.96 -3.20 10.24
vertex 14.04 -4.14 10.50
vertex 15.26 -5.01 10.00
endloop
endfacet
facet normal 0.96 -0.25 -0.11
outer loop
vertex 16.72 0.23 45.64
vertex 14.15 -8.99 44.47
vertex 15.38 -1.56 38.27
endloop
endfacet
facet normal 0.92 -0.38 0.05
outer loop
vertex 15.90 -3.74 52.11
vertex 13.81 -8.82 52.21
vertex 14.15 -8.99 44.47
endloop
endfacet
facet normal 0.23 -0.32 0.92
outer loop
vertex 15.26 -5.01 10.00
vertex 10.29 -9.63 9.64
vertex 15.17 -9.29 8.52
endloop
endfacet
facet normal 0.76 -0.45 0.47
outer loop
vertex 15.47 -5.06 91.14
vertex 13.93 -12.26 86.65
vertex 19.45 -6.79 83.01
endloop
endfacet
facet normal 0.41 0.91 0.01
outer loop
vertex 12.94 9.56 0.15
vertex 15.56 8.35 4.24
vertex 15.98 8.19 0.20
endloop
endfacet
facet normal 0.91 -0.02 -0.41
outer loop
vertex 15.23 2.48 37.71
vertex 15.38 -1.56 38.27
vertex 11.37 -2.58 29.40
endloop
endfacet
facet normal -0.13 -0.75 0.65
outer loop
vertex 16.52 -3.84 58.40
vertex 13.54 -2.80 58.99
vertex 13.93 -3.61 58.14
endloop
endfacet
facet normal 0.94 -0.29 -0.16
outer loop
vertex 15.38 -1.56 38.27
vertex 14.15 -8.99 44.47
vertex 13.35 -7.97 37.87
endloop
endfacet
facet normal 0.89 -0.36 0.30
outer loop
vertex 13.93 -3.61 58.14
vertex 13.81 -8.82 52.21
vertex 15.90 -3.74 52.11
endloop
endfacet
facet normal 0.40 -0.76 0.51
outer loop
vertex 16.89 -9.62 6.67
vertex 15.17 -9.29 8.52
vertex 12.21 -12.35 6.23
endloop
endfacet
facet normal 0.71 -0.62 -0.34
outer loop
vertex 16.89 -9.27 73.44
vertex 14.09 -13.48 75.24
vertex 11.91 -13.35 70.39
endloop
endfacet
facet normal 0.37 -0.89 0.27
outer loop
vertex 16.89 -9.62 6.67
vertex 12.07 -13.56 0.11
vertex 16.62 -11.67 0.18
endloop
endfacet
facet normal 0.68 -0.72 0.09
outer loop
vertex 13.93 -12.26 86.65
vertex 9.15 -17.53 80.47
vertex 14.09 -13.48 75.24
endloop
endfacet
facet normal 0.65 0.65 0.40
outer loop
vertex 16.06 10.04 87.13
vertex 10.53 13.41 90.66
vertex 15.11 9.98 88.77
endloop
endfacet
facet normal 0.60 0.44 0.66
outer loop
vertex 9.34 8.19 95.26
vertex 15.11 9.98 88.77
vertex 10.53 13.41 90.66
endloop
endfacet
facet normal 0.76 0.51 0.41
outer loop
vertex 12.49 5.31 59.51
vertex 15.39 5.36 54.00
vertex 13.91 9.95 51.03
endloop
endfacet
facet normal 0.70 0.22 0.68
outer loop
vertex 15.11 9.98 88.77
vertex 9.34 8.19 95.26
vertex 18.22 5.83 86.97
endloop
endfacet
facet normal 0.66 0.50 0.57
outer loop
vertex 15.35 3.82 92.08
vertex 18.22 5.83 86.97
vertex 9.34 8.19 95.26
endloop
endfacet
facet normal -0.45 0.59 0.67
outer loop
vertex 15.61 3.83 59.72
vertex 13.97 4.61 57.95
vertex 13.19 1.84 59.86
endloop
endfacet
facet normal 0.79 -0.59 0.19
outer loop
vertex 11.32 -3.43 22.47
vertex 16.35 -0.79 9.47
vertex 12.17 0.67 31.81
endloop
endfacet
facet normal 0.87 -0.42 0.25
outer loop
vertex 11.32 -3.43 22.47
vertex 14.96 -3.20 10.24
vertex 16.35 -0.79 9.47
endloop
endfacet
facet normal 0.63 -0.50 -0.59
outer loop
vertex 15.58 -10.03 71.48
vertex 11.91 -13.35 70.39
vertex 14.47 -7.07 67.83
endloop
endfacet
facet normal 0.49 -0.86 0.16
outer loop
vertex 12.21 -12.35 6.23
vertex 12.07 -13.56 0.11
vertex 16.89 -9.62 6.67
endloop
endfacet
facet normal 0.74 0.66 -0.11
outer loop
vertex 18.42 8.44 76.34
vertex 13.55 12.96 70.78
vertex 10.93 16.12 72.25
endloop
endfacet
facet normal 0.83 0.56 -0.02
outer loop
vertex 13.91 9.95 51.03
vertex 15.68 7.10 45.14
vertex 11.78 13.01 47.59
endloop
endfacet
facet normal 0.82 0.57 -0.07
outer loop
vertex 15.68 7.10 45.14
vertex 13.24 10.02 39.97
vertex 11.78 13.01 47.59
endloop
endfacet
facet normal 0.38 0.89 0.26
outer loop
vertex 12.17 0.67 31.81
vertex 15.15 6.32 7.73
vertex 12.96 7.02 8.53
endloop
endfacet
facet normal 0.72 -0.66 0.20
outer loop
vertex 11.32 -3.43 22.47
vertex 14.04 -4.14 10.50
vertex 14.96 -3.20 10.24
endloop
endfacet
facet normal 0.89 -0.26 -0.37
outer loop
vertex 15.38 -1.56 38.27
vertex 13.35 -7.97 37.87
vertex 11.37 -2.58 29.40
endloop
endfacet
facet normal 0.68 0.72 -0.15
outer loop
vertex 11.78 13.01 47.59
vertex 13.24 10.02 39.97
vertex 9.14 13.41 37.70
endloop
endfacet
facet normal 0.83 0.35 -0.44
outer loop
vertex 13.24 10.02 39.97
vertex 15.23 2.48 37.71
vertex 9.34 6.54 29.76
endloop
endfacet
facet normal 0.69 0.63 0.37
outer loop
vertex 12.49 5.31 59.51
vertex 13.97 4.61 57.95
vertex 15.39 5.36 54.00
endloop
endfacet
facet normal 0.82 0.42 -0.39
outer loop
vertex 15.23 2.48 37.71
vertex 11.73 3.63 31.66
vertex 9.34 6.54 29.76
endloop
endfacet
facet normal 0.94 0.32 0.12
outer loop
vertex 12.72 6.52 11.74
vertex 12.17 0.67 31.81
vertex 12.96 7.02 8.53
endloop
endfacet
facet normal 0.99 0.15 0.07
outer loop
vertex 11.73 3.63 31.66
vertex 12.17 0.67 31.81
vertex 12.72 6.52 11.74
endloop
endfacet
facet normal 0.87 0.11 -0.48
outer loop
vertex 15.23 2.48 37.71
vertex 12.17 0.67 31.81
vertex 11.73 3.63 31.66
endloop
endfacet
facet normal 0.86 0.15 -0.49
outer loop
vertex 15.23 2.48 37.71
vertex 11.37 -2.58 29.40
vertex 12.17 0.67 31.81
endloop
endfacet
facet normal 0.97 -0.26 0.02
outer loop
vertex 11.37 -2.58 29.40
vertex 11.32 -3.43 22.47
vertex 12.17 0.67 31.81
endloop
endfacet
facet normal 0.69 -0.33 0.64
outer loop
vertex 13.54 -2.80 58.99
vertex 12.16 -7.44 58.05
vertex 13.93 -3.61 58.14
endloop
endfacet
facet normal 0.85 -0.40 0.34
outer loop
vertex 12.16 -7.44 58.05
vertex 13.81 -8.82 52.21
vertex 13.93 -3.61 58.14
endloop
endfacet
facet normal 0.79 -0.61 0.05
outer loop
vertex 13.81 -8.82 52.21
vertex 10.98 -12.74 48.67
vertex 14.15 -8.99 44.47
endloop
endfacet
facet normal 0.54 0.14 0.83
outer loop
vertex 9.34 8.19 95.26
vertex 5.89 5.28 98.02
vertex 15.35 3.82 92.08
endloop
endfacet
facet normal 0.75 0.21 0.62
outer loop
vertex 12.49 5.31 59.51
vertex 13.19 1.84 59.86
vertex 13.97 4.61 57.95
endloop
endfacet
facet normal 0.52 -0.84 0.17
outer loop
vertex 14.04 -4.14 10.50
vertex 11.32 -3.43 22.47
vertex 8.38 -5.67 20.45
endloop
endfacet
facet normal 0.19 -0.28 0.94
outer loop
vertex 15.26 -5.01 10.00
vertex 14.04 -4.14 10.50
vertex 10.29 -9.63 9.64
endloop
endfacet
facet normal 0.57 -0.50 -0.65
outer loop
vertex 14.47 -7.07 67.83
vertex 11.91 -13.35 70.39
vertex 8.91 -13.34 67.77
endloop
endfacet
facet normal 0.46 -0.86 -0.23
outer loop
vertex 14.09 -13.48 75.24
vertex 9.15 -17.53 80.47
vertex 11.91 -13.35 70.39
endloop
endfacet
facet normal 0.73 0.54 0.42
outer loop
vertex 8.93 13.86 54.71
vertex 12.49 5.31 59.51
vertex 13.91 9.95 51.03
endloop
endfacet
facet normal 0.77 -0.44 -0.46
outer loop
vertex 13.35 -7.97 37.87
vertex 9.35 -9.24 32.36
vertex 11.37 -2.58 29.40
endloop
endfacet
facet normal 0.57 0.81 0.15
outer loop
vertex 10.41 5.14 28.48
vertex 11.73 3.63 31.66
vertex 12.72 6.52 11.74
endloop
endfacet
facet normal 0.63 -0.75 -0.19
outer loop
vertex 10.98 -12.74 48.67
vertex 13.35 -7.97 37.87
vertex 14.15 -8.99 44.47
endloop
endfacet
facet normal 0.49 -0.13 0.86
outer loop
vertex 9.23 3.47 62.37
vertex 13.54 -2.80 58.99
vertex 13.19 1.84 59.86
endloop
endfacet
facet normal 0.53 -0.84 0.10
outer loop
vertex 9.13 -4.19 27.78
vertex 11.32 -3.43 22.47
vertex 11.37 -2.58 29.40
endloop
endfacet
facet normal 0.04 -0.18 0.98
outer loop
vertex 14.04 -4.14 10.50
vertex 7.42 -5.02 10.59
vertex 10.29 -9.63 9.64
endloop
endfacet
facet normal 0.60 -0.39 0.70
outer loop
vertex 15.47 -5.06 91.14
vertex 9.05 -10.82 93.50
vertex 11.18 -11.25 91.43
endloop
endfacet
facet normal 0.67 -0.70 0.24
outer loop
vertex 7.76 -13.16 56.28
vertex 10.98 -12.74 48.67
vertex 13.81 -8.82 52.21
endloop
endfacet
facet normal 0.72 -0.47 0.51
outer loop
vertex 15.47 -5.06 91.14
vertex 11.18 -11.25 91.43
vertex 13.93 -12.26 86.65
endloop
endfacet
facet normal 0.49 0.03 0.87
outer loop
vertex 13.27 -2.78 94.19
vertex 5.89 5.28 98.02
vertex 7.34 -4.63 97.60
endloop
endfacet
facet normal 0.13 -0.99 -0.08
outer loop
vertex 8.38 -5.67 20.45
vertex 7.42 -5.02 10.59
vertex 14.04 -4.14 10.50
endloop
endfacet
facet normal 0.20 -0.71 0.68
outer loop
vertex 15.17 -9.29 8.52
vertex 10.29 -9.63 9.64
vertex 12.21 -12.35 6.23
endloop
endfacet
facet normal 0.62 -0.77 0.18
outer loop
vertex 13.93 -12.26 86.65
vertex 9.21 -15.77 87.96
vertex 9.15 -17.53 80.47
endloop
endfacet
facet normal 0.20 -0.79 0.58
outer loop
vertex 11.32 -3.43 22.47
vertex 7.06 -3.99 23.19
vertex 8.38 -5.67 20.45
endloop
endfacet
facet normal 0.69 -0.64 0.34
outer loop
vertex 13.81 -8.82 52.21
vertex 12.16 -7.44 58.05
vertex 7.76 -13.16 56.28
endloop
endfacet
facet normal 0.58 0.20 0.79
outer loop
vertex 12.49 5.31 59.51
vertex 9.23 3.47 62.37
vertex 13.19 1.84 59.86
endloop
endfacet
facet normal 0.60 -0.02 0.80
outer loop
vertex 9.23 3.47 62.37
vertex 8.71 -4.02 62.58
vertex 13.54 -2.80 58.99
endloop
endfacet
facet normal 0.11 -0.99 -0.09
outer loop
vertex 9.13 -4.19 27.78
vertex 7.06 -3.99 23.19
vertex 11.32 -3.43 22.47
endloop
endfacet
facet normal 0.58 -0.34 0.75
outer loop
vertex 15.47 -5.06 91.14
vertex 7.34 -4.63 97.60
vertex 9.05 -10.82 93.50
endloop
endfacet
facet normal 0.55 -0.43 0.72
outer loop
vertex 7.34 -4.63 97.60
vertex 15.47 -5.06 91.14
vertex 13.27 -2.78 94.19
endloop
endfacet
facet normal 0.61 -0.63 0.48
outer loop
vertex 11.18 -11.25 91.43
vertex 9.21 -15.77 87.96
vertex 13.93 -12.26 86.65
endloop
endfacet
facet normal -0.32 -0.95 -0.03
outer loop
vertex 5.44 -4.55 16.66
vertex 7.42 -5.02 10.59
vertex 8.38 -5.67 20.45
endloop
endfacet
facet normal 0.52 -0.56 0.65
outer loop
vertex 9.05 -10.82 93.50
vertex 7.42 -12.77 93.11
vertex 11.18 -11.25 91.43
endloop
endfacet
facet normal 0.59 -0.76 -0.26
outer loop
vertex 13.35 -7.97 37.87
vertex 6.61 -11.39 32.43
vertex 9.35 -9.24 32.36
endloop
endfacet
facet normal 0.61 -0.73 -0.30
outer loop
vertex 7.08 -14.88 41.74
vertex 6.61 -11.39 32.43
vertex 13.35 -7.97 37.87
endloop
endfacet
facet normal -0.13 -0.97 0.20
outer loop
vertex 7.19 -12.90 0.11
vertex 12.07 -13.56 0.11
vertex 12.21 -12.35 6.23
endloop
endfacet
facet normal 0.68 -0.71 -0.16
outer loop
vertex 13.35 -7.97 37.87
vertex 10.98 -12.74 48.67
vertex 7.08 -14.88 41.74
endloop
endfacet
facet normal 0.27 -0.94 0.22
outer loop
vertex 9.21 -15.77 87.96
vertex 4.54 -16.54 90.43
vertex 9.15 -17.53 80.47
endloop
endfacet
facet normal 0.57 0.22 0.79
outer loop
vertex 12.49 5.31 59.51
vertex 8.51 5.03 62.46
vertex 9.23 3.47 62.37
endloop
endfacet
facet normal 0.63 -0.47 -0.62
outer loop
vertex 11.37 -2.58 29.40
vertex 9.35 -9.24 32.36
vertex 7.41 -7.74 29.29
endloop
endfacet
facet normal 0.69 0.54 0.47
outer loop
vertex 12.49 5.31 59.51
vertex 7.52 13.06 57.90
vertex 9.67 8.17 60.38
endloop
endfacet
facet normal 0.55 0.30 0.78
outer loop
vertex 9.67 8.17 60.38
vertex 8.00 5.87 62.43
vertex 12.49 5.31 59.51
endloop
endfacet
facet normal 0.54 0.35 0.77
outer loop
vertex 12.49 5.31 59.51
vertex 8.00 5.87 62.43
vertex 8.51 5.03 62.46
endloop
endfacet
facet normal 0.90 0.42 -0.12
outer loop
vertex 8.51 5.03 62.46
vertex 8.79 4.45 62.54
vertex 9.23 3.47 62.37
endloop
endfacet
facet normal 0.62 -0.33 0.72
outer loop
vertex 8.71 -4.02 62.58
vertex 12.16 -7.44 58.05
vertex 13.54 -2.80 58.99
endloop
endfacet
facet normal 0.47 -0.57 0.67
outer loop
vertex 7.76 -13.16 56.28
vertex 12.16 -7.44 58.05
vertex 4.63 -13.71 58.03
endloop
endfacet
facet normal 0.34 -0.85 -0.40
outer loop
vertex 11.91 -13.35 70.39
vertex 2.01 -18.49 72.87
vertex 8.91 -13.34 67.77
endloop
endfacet
facet normal 0.60 0.53 -0.59
outer loop
vertex 6.17 9.88 29.54
vertex 9.34 6.54 29.76
vertex 6.45 6.00 26.34
endloop
endfacet
facet normal 0.71 -0.54 -0.45
outer loop
vertex 11.37 -2.58 29.40
vertex 7.41 -7.74 29.29
vertex 9.13 -4.19 27.78
endloop
endfacet
facet normal 0.34 -0.45 0.82
outer loop
vertex 7.34 -4.63 97.60
vertex 7.42 -12.77 93.11
vertex 9.05 -10.82 93.50
endloop
endfacet
facet normal 0.43 -0.66 0.61
outer loop
vertex 11.18 -11.25 91.43
vertex 4.54 -16.54 90.43
vertex 9.21 -15.77 87.96
endloop
endfacet
facet normal 0.44 0.40 0.80
outer loop
vertex 9.67 8.17 60.38
vertex 5.10 8.89 62.54
vertex 8.00 5.87 62.43
endloop
endfacet
facet normal 0.99 0.04 0.16
outer loop
vertex 7.33 -3.87 99.15
vertex 7.59 -7.36 98.53
vertex 8.33 -12.81 95.38
endloop
endfacet
facet normal 0.44 -0.53 0.73
outer loop
vertex 8.71 -4.02 62.58
vertex 4.63 -13.71 58.03
vertex 12.16 -7.44 58.05
endloop
endfacet
facet normal -0.26 -0.82 0.51
outer loop
vertex 10.29 -9.63 9.64
vertex 4.38 -10.70 4.87
vertex 12.21 -12.35 6.23
endloop
endfacet
facet normal -0.24 -0.93 0.28
outer loop
vertex 12.21 -12.35 6.23
vertex 4.38 -10.70 4.87
vertex 7.19 -12.90 0.11
endloop
endfacet
facet normal 0.90 -0.24 -0.37
outer loop
vertex 8.33 -12.81 95.38
vertex 5.49 -18.55 92.12
vertex 7.42 -12.77 93.11
endloop
endfacet
facet normal 0.50 -0.72 0.48
outer loop
vertex 11.18 -11.25 91.43
vertex 7.42 -12.77 93.11
vertex 4.54 -16.54 90.43
endloop
endfacet
facet normal 0.39 0.56 0.73
outer loop
vertex 10.53 13.41 90.66
vertex 3.45 14.23 93.81
vertex 9.34 8.19 95.26
endloop
endfacet
facet normal 0.80 0.14 -0.59
outer loop
vertex 7.22 2.42 99.14
vertex 7.34 -4.63 97.60
vertex 5.89 5.28 98.02
endloop
endfacet
facet normal 1.00 0.02 0.00
outer loop
vertex 7.22 2.42 99.14
vertex 7.33 -3.87 99.15
vertex 7.34 -4.63 97.60
endloop
endfacet
facet normal 0.99 0.14 -0.06
outer loop
vertex 7.33 -3.87 99.15
vertex 8.33 -12.81 95.38
vertex 7.34 -4.63 97.60
endloop
endfacet
facet normal 0.91 0.21 -0.36
outer loop
vertex 8.33 -12.81 95.38
vertex 7.42 -12.77 93.11
vertex 7.34 -4.63 97.60
endloop
endfacet
facet normal 0.48 -0.63 -0.61
outer loop
vertex 6.61 -11.39 32.43
vertex 7.41 -7.74 29.29
vertex 9.35 -9.24 32.36
endloop
endfacet
facet normal 0.77 -0.15 -0.62
outer loop
vertex 5.49 -18.55 92.12
vertex 4.54 -16.54 90.43
vertex 7.42 -12.77 93.11
endloop
endfacet
facet normal 0.42 0.59 0.69
outer loop
vertex 9.67 8.17 60.38
vertex 4.47 14.69 57.92
vertex 5.10 8.89 62.54
endloop
endfacet
facet normal -0.36 -0.40 0.84
outer loop
vertex 7.42 -5.02 10.59
vertex 3.08 -6.57 8.03
vertex 10.29 -9.63 9.64
endloop
endfacet
facet normal 0.69 -0.52 0.50
outer loop
vertex 8.71 -4.02 62.58
vertex 5.18 -8.44 62.81
vertex 4.63 -13.71 58.03
endloop
endfacet
facet normal 0.21 -0.56 0.80
outer loop
vertex 8.33 -12.81 95.38
vertex -0.40 -15.90 95.49
vertex 5.49 -18.55 92.12
endloop
endfacet
facet normal 0.29 0.53 0.80
outer loop
vertex 7.52 13.06 57.90
vertex 4.47 14.69 57.92
vertex 9.67 8.17 60.38
endloop
endfacet
facet normal 0.27 0.47 0.84
outer loop
vertex 9.34 8.19 95.26
vertex 3.45 14.23 93.81
vertex 5.89 5.28 98.02
endloop
endfacet
facet normal 0.33 0.77 0.55
outer loop
vertex 1.24 17.51 90.53
vertex 3.45 14.23 93.81
vertex 10.53 13.41 90.66
endloop
endfacet
facet normal -0.44 -0.90 -0.07
outer loop
vertex 5.44 -4.55 16.66
vertex 5.03 -3.78 9.66
vertex 7.42 -5.02 10.59
endloop
endfacet
facet normal 0.04 -0.17 0.98
outer loop
vertex 7.33 -3.87 99.15
vertex -0.71 -9.55 98.52
vertex 7.59 -7.36 98.53
endloop
endfacet
facet normal 0.43 -0.89 0.13
outer loop
vertex 7.76 -13.16 56.28
vertex 1.55 -16.68 52.71
vertex 10.98 -12.74 48.67
endloop
endfacet
facet normal -0.11 0.00 0.99
outer loop
vertex 7.22 2.42 99.14
vertex 5.28 6.14 98.93
vertex 7.33 -3.87 99.15
endloop
endfacet
facet normal 0.01 -0.85 0.53
outer loop
vertex 7.06 -3.99 23.19
vertex 3.98 -2.59 25.51
vertex 8.38 -5.67 20.45
endloop
endfacet
facet normal -0.44 -0.20 0.87
outer loop
vertex 5.03 -3.78 9.66
vertex 3.08 -6.57 8.03
vertex 7.42 -5.02 10.59
endloop
endfacet
facet normal -0.20 -0.87 0.45
outer loop
vertex 4.44 -9.22 7.78
vertex 4.38 -10.70 4.87
vertex 10.29 -9.63 9.64
endloop
endfacet
facet normal 0.13 -0.48 0.87
outer loop
vertex 7.59 -7.36 98.53
vertex -0.71 -9.55 98.52
vertex 8.33 -12.81 95.38
endloop
endfacet
facet normal 0.33 -0.89 0.31
outer loop
vertex 7.76 -13.16 56.28
vertex 4.63 -13.71 58.03
vertex 1.55 -16.68 52.71
endloop
endfacet
facet normal 0.42 -0.90 0.10
outer loop
vertex 10.98 -12.74 48.67
vertex 1.55 -16.68 52.71
vertex 2.07 -16.61 51.15
endloop
endfacet
facet normal 0.41 -0.91 0.05
outer loop
vertex 10.98 -12.74 48.67
vertex 2.07 -16.61 51.15
vertex 7.08 -14.88 41.74
endloop
endfacet
facet normal 0.25 -0.83 -0.50
outer loop
vertex 2.01 -18.49 72.87
vertex 2.12 -14.63 66.51
vertex 8.91 -13.34 67.77
endloop
endfacet
facet normal 0.39 -0.88 -0.26
outer loop
vertex 9.15 -17.53 80.47
vertex 2.01 -18.49 72.87
vertex 11.91 -13.35 70.39
endloop
endfacet
facet normal -0.48 -0.87 0.11
outer loop
vertex 8.38 -5.67 20.45
vertex 3.98 -2.59 25.51
vertex 5.44 -4.55 16.66
endloop
endfacet
facet normal 0.27 -0.37 -0.89
outer loop
vertex 9.13 -4.19 27.78
vertex 4.25 -8.01 27.88
vertex 3.98 -2.59 25.51
endloop
endfacet
facet normal 0.25 -0.59 -0.77
outer loop
vertex 5.18 -8.44 62.81
vertex 8.91 -13.34 67.77
vertex 2.12 -14.63 66.51
endloop
endfacet
facet normal 0.33 0.61 0.72
outer loop
vertex 4.47 14.69 57.92
vertex 2.02 10.41 62.69
vertex 5.10 8.89 62.54
endloop
endfacet
facet normal -0.31 -0.24 0.92
outer loop
vertex 3.08 -6.57 8.03
vertex 4.44 -9.22 7.78
vertex 10.29 -9.63 9.64
endloop
endfacet
facet normal -0.83 -0.56 -0.01
outer loop
vertex 3.98 -2.59 25.51
vertex 5.03 -3.78 9.66
vertex 5.44 -4.55 16.66
endloop
endfacet
facet normal -0.53 -0.84 0.07
outer loop
vertex 4.38 -10.70 4.87
vertex 3.71 -10.68 0.19
vertex 7.19 -12.90 0.11
endloop
endfacet
facet normal -0.70 -0.63 0.34
outer loop
vertex 4.44 -9.22 7.78
vertex 3.13 -9.26 5.00
vertex 4.38 -10.70 4.87
endloop
endfacet
facet normal 0.34 -0.66 -0.68
outer loop
vertex 6.61 -11.39 32.43
vertex 1.59 -10.60 29.18
vertex 7.41 -7.74 29.29
endloop
endfacet
facet normal 0.17 0.46 0.87
outer loop
vertex 3.45 14.23 93.81
vertex -1.73 7.66 98.23
vertex 5.89 5.28 98.02
endloop
endfacet
facet normal -0.61 -0.04 0.79
outer loop
vertex 5.03 -3.78 9.66
vertex 3.05 2.00 8.46
vertex 3.08 -6.57 8.03
endloop
endfacet
facet normal -0.81 -0.45 0.39
outer loop
vertex 3.08 -6.57 8.03
vertex 3.13 -9.26 5.00
vertex 4.44 -9.22 7.78
endloop
endfacet
facet normal 0.35 -0.68 -0.64
outer loop
vertex 7.41 -7.74 29.29
vertex 1.59 -10.60 29.18
vertex 4.25 -8.01 27.88
endloop
endfacet
facet normal 0.16 -0.42 0.89
outer loop
vertex 8.33 -12.81 95.38
vertex -0.71 -9.55 98.52
vertex -0.40 -15.90 95.49
endloop
endfacet
facet normal 0.26 -0.90 -0.35
outer loop
vertex 7.08 -14.88 41.74
vertex -0.48 -14.23 34.37
vertex 6.61 -11.39 32.43
endloop
endfacet
facet normal 0.23 -0.92 -0.32
outer loop
vertex -0.49 -16.23 40.16
vertex -0.48 -14.23 34.37
vertex 7.08 -14.88 41.74
endloop
endfacet
facet normal 0.08 -0.99 -0.14
outer loop
vertex 2.07 -16.61 51.15
vertex -1.98 -16.83 50.25
vertex 7.08 -14.88 41.74
endloop
endfacet
facet normal 0.19 0.76 -0.62
outer loop
vertex 3.91 18.32 70.74
vertex 5.72 14.33 66.35
vertex 1.37 15.37 66.30
endloop
endfacet
facet normal 0.09 0.72 0.69
outer loop
vertex 4.47 14.69 57.92
vertex -2.04 15.54 57.89
vertex 2.02 10.41 62.69
endloop
endfacet
facet normal -0.75 -0.66 0.11
outer loop
vertex 4.38 -10.70 4.87
vertex 3.13 -9.26 5.00
vertex 3.71 -10.68 0.19
endloop
endfacet
facet normal 0.12 -0.67 0.73
outer loop
vertex 4.63 -13.71 58.03
vertex 5.18 -8.44 62.81
vertex -0.44 -14.78 57.91
endloop
endfacet
facet normal 0.18 -0.98 -0.03
outer loop
vertex -1.98 -16.83 50.25
vertex -0.49 -16.23 40.16
vertex 7.08 -14.88 41.74
endloop
endfacet
facet normal 0.04 0.54 0.84
outer loop
vertex 3.45 14.23 93.81
vertex -2.15 14.69 93.77
vertex -1.73 7.66 98.23
endloop
endfacet
facet normal 0.20 -0.84 -0.51
outer loop
vertex -0.48 -14.23 34.37
vertex 1.59 -10.60 29.18
vertex 6.61 -11.39 32.43
endloop
endfacet
facet normal 0.18 -0.90 0.40
outer loop
vertex 4.63 -13.71 58.03
vertex -0.44 -14.78 57.91
vertex 1.55 -16.68 52.71
endloop
endfacet
facet normal 0.14 -0.98 0.16
outer loop
vertex 4.54 -16.54 90.43
vertex -0.42 -17.31 90.18
vertex 9.15 -17.53 80.47
endloop
endfacet
facet normal 0.05 0.72 0.69
outer loop
vertex 3.45 14.23 93.81
vertex 1.24 17.51 90.53
vertex -2.15 14.69 93.77
endloop
endfacet
facet normal 0.31 -0.74 0.60
outer loop
vertex 5.18 -8.44 62.81
vertex 1.41 -9.92 62.96
vertex -0.44 -14.78 57.91
endloop
endfacet
facet normal 0.69 0.64 -0.34
outer loop
vertex 1.83 -16.79 51.03
vertex 2.77 -19.64 47.53
vertex 1.56 -18.21 47.79
endloop
endfacet
facet normal 0.03 -0.76 0.65
outer loop
vertex -0.40 -15.90 95.49
vertex -5.05 -19.03 92.04
vertex 5.49 -18.55 92.12
endloop
endfacet
facet normal 0.83 -0.31 0.47
outer loop
vertex 1.83 -16.79 51.03
vertex 0.75 -18.84 51.61
vertex 2.77 -19.64 47.53
endloop
endfacet
facet normal -0.18 -0.41 0.90
outer loop
vertex 2.07 -16.61 51.15
vertex 1.59 -16.58 51.07
vertex -1.98 -16.83 50.25
endloop
endfacet
facet normal 0.57 -0.81 0.15
outer loop
vertex 1.55 -16.68 52.71
vertex 1.83 -16.79 51.03
vertex 2.07 -16.61 51.15
endloop
endfacet
facet normal 0.89 -0.42 0.18
outer loop
vertex 1.83 -16.79 51.03
vertex 1.55 -16.68 52.71
vertex 0.75 -18.84 51.61
endloop
endfacet
facet normal -0.30 -0.41 0.86
outer loop
vertex 1.56 -18.21 47.79
vertex 0.85 -18.52 47.39
vertex 2.77 -19.64 47.53
endloop
endfacet
facet normal 0.04 -0.85 -0.52
outer loop
vertex 2.01 -18.49 72.87
vertex -2.39 -15.22 67.10
vertex 2.12 -14.63 66.51
endloop
endfacet
facet normal 0.13 -0.99 0.08
outer loop
vertex 2.77 -19.64 47.53
vertex -0.63 -20.17 46.23
vertex 2.32 -19.76 46.71
endloop
endfacet
facet normal 0.00 -0.99 0.13
outer loop
vertex 9.15 -17.53 80.47
vertex -2.60 -18.49 72.85
vertex 2.01 -18.49 72.87
endloop
endfacet
facet normal -0.28 -0.37 0.89
outer loop
vertex 2.77 -19.64 47.53
vertex 0.85 -18.52 47.39
vertex -0.63 -20.17 46.23
endloop
endfacet
facet normal -0.02 0.68 0.74
outer loop
vertex 2.02 10.41 62.69
vertex -2.04 15.54 57.89
vertex -3.30 10.28 62.69
endloop
endfacet
facet normal 0.03 -0.40 -0.92
outer loop
vertex 4.25 -8.01 27.88
vertex -3.63 -8.61 27.84
vertex 3.98 -2.59 25.51
endloop
endfacet
facet normal 0.04 -0.48 -0.87
outer loop
vertex 1.59 -10.60 29.18
vertex -3.63 -8.61 27.84
vertex 4.25 -8.01 27.88
endloop
endfacet
facet normal 0.06 0.72 0.69
outer loop
vertex 1.24 17.51 90.53
vertex -2.27 16.05 92.35
vertex -2.15 14.69 93.77
endloop
endfacet
facet normal 0.07 -0.93 0.37
outer loop
vertex -0.44 -14.78 57.91
vertex -2.34 -16.42 54.14
vertex 1.55 -16.68 52.71
endloop
endfacet
facet normal -0.07 -1.00 0.00
outer loop
vertex -2.34 -16.42 54.14
vertex -1.62 -16.48 52.63
vertex 1.53 -16.71 51.99
endloop
endfacet
facet normal 0.10 -0.99 -0.13
outer loop
vertex 1.53 -16.71 51.99
vertex -1.98 -16.83 50.25
vertex 1.59 -16.58 51.07
endloop
endfacet
facet normal 0.21 -0.68 0.70
outer loop
vertex 0.85 -18.52 47.39
vertex -2.50 -18.07 48.82
vertex -0.63 -20.17 46.23
endloop
endfacet
facet normal 0.08 -0.99 0.10
outer loop
vertex -0.42 -17.31 90.18
vertex -6.10 -18.81 79.30
vertex 9.15 -17.53 80.47
endloop
endfacet
facet normal 0.09 -0.74 0.67
outer loop
vertex -2.50 -18.07 48.82
vertex -2.38 -19.98 46.68
vertex -0.63 -20.17 46.23
endloop
endfacet
facet normal -0.02 -0.15 0.99
outer loop
vertex 0.45 7.94 99.10
vertex -2.98 7.58 98.98
vertex 5.28 6.14 98.93
endloop
endfacet
facet normal 0.05 0.23 0.97
outer loop
vertex -2.98 7.58 98.98
vertex -3.91 3.43 100.00
vertex 5.28 6.14 98.93
endloop
endfacet
facet normal 0.10 0.04 0.99
outer loop
vertex 5.28 6.14 98.93
vertex -3.91 3.43 100.00
vertex 7.33 -3.87 99.15
endloop
endfacet
facet normal -0.22 -0.66 0.72
outer loop
vertex 1.41 -9.92 62.96
vertex -7.43 -7.32 62.69
vertex -0.44 -14.78 57.91
endloop
endfacet
facet normal -0.04 -0.99 0.15
outer loop
vertex -1.62 -16.48 52.63
vertex -1.98 -16.83 50.25
vertex 1.53 -16.71 51.99
endloop
endfacet
facet normal 0.00 -0.12 0.99
outer loop
vertex 7.33 -3.87 99.15
vertex -7.84 -1.66 99.47
vertex -0.71 -9.55 98.52
endloop
endfacet
facet normal 0.23 -0.96 0.15
outer loop
vertex -2.34 -16.42 54.14
vertex -2.29 -16.60 52.89
vertex -1.62 -16.48 52.63
endloop
endfacet
facet normal 0.00 -0.87 -0.49
outer loop
vertex -2.60 -18.49 72.85
vertex -2.39 -15.22 67.10
vertex 2.01 -18.49 72.87
endloop
endfacet
facet normal 0.37 -0.11 0.92
outer loop
vertex -1.62 -16.48 52.63
vertex -2.29 -16.60 52.89
vertex -1.89 -18.33 52.52
endloop
endfacet
facet normal 0.98 -0.14 -0.13
outer loop
vertex -1.62 -16.48 52.63
vertex -1.89 -18.33 52.52
vertex -1.98 -16.83 50.25
endloop
endfacet
facet normal 1.00 0.07 0.03
outer loop
vertex -2.34 2.52 4.65
vertex -1.83 -4.74 4.51
vertex -1.88 -2.03 0.05
endloop
endfacet
facet normal 0.93 0.06 0.38
outer loop
vertex -3.17 -5.01 7.87
vertex -1.83 -4.74 4.51
vertex -2.34 2.52 4.65
endloop
endfacet
facet normal 0.99 -0.11 -0.08
outer loop
vertex -1.83 -4.74 4.51
vertex -2.47 -7.15 0.06
vertex -1.88 -2.03 0.05
endloop
endfacet
facet normal 0.96 -0.20 -0.17
outer loop
vertex -1.89 -18.33 52.52
vertex -2.50 -18.07 48.82
vertex -1.98 -16.83 50.25
endloop
endfacet
facet normal -0.04 0.25 0.97
outer loop
vertex -2.98 7.58 98.98
vertex -4.39 7.10 99.05
vertex -3.91 3.43 100.00
endloop
endfacet
facet normal 0.94 0.28 -0.18
outer loop
vertex -2.34 2.52 4.65
vertex -1.88 -2.03 0.05
vertex -4.42 6.78 0.28
endloop
endfacet
facet normal 0.00 -0.11 0.99
outer loop
vertex -3.91 3.43 100.00
vertex -7.84 -1.66 99.47
vertex 7.33 -3.87 99.15
endloop
endfacet
facet normal 0.92 -0.37 0.07
outer loop
vertex -1.83 -4.74 4.51
vertex -3.68 -9.48 3.64
vertex -2.47 -7.15 0.06
endloop
endfacet
facet normal -0.19 -0.81 0.55
outer loop
vertex -0.44 -14.78 57.91
vertex -5.31 -14.67 56.33
vertex -1.62 -15.60 56.27
endloop
endfacet
facet normal 0.53 0.64 -0.56
outer loop
vertex -2.45 -17.49 49.52
vertex -2.50 -18.07 48.82
vertex -2.78 -17.54 49.15
endloop
endfacet
facet normal 0.92 -0.34 -0.17
outer loop
vertex -1.89 -18.33 52.52
vertex -2.93 -19.65 49.60
vertex -2.50 -18.07 48.82
endloop
endfacet
facet normal 0.97 -0.17 0.20
outer loop
vertex -2.50 -18.07 48.82
vertex -2.93 -19.65 49.60
vertex -2.38 -19.98 46.68
endloop
endfacet
facet normal 0.05 -0.99 0.12
outer loop
vertex -2.93 -19.65 49.60
vertex -3.00 -19.92 47.43
vertex -2.38 -19.98 46.68
endloop
endfacet
facet normal 0.90 0.44 0.01
outer loop
vertex -4.41 6.70 4.63
vertex -2.34 2.52 4.65
vertex -4.42 6.78 0.28
endloop
endfacet
facet normal 0.95 0.03 0.32
outer loop
vertex -3.65 0.74 8.66
vertex -3.17 -5.01 7.87
vertex -2.34 2.52 4.65
endloop
endfacet
facet normal 0.86 -0.40 0.32
outer loop
vertex -3.17 -5.01 7.87
vertex -5.11 -9.21 7.80
vertex -3.68 -9.48 3.64
endloop
endfacet
facet normal 0.86 -0.40 0.31
outer loop
vertex -3.17 -5.01 7.87
vertex -3.68 -9.48 3.64
vertex -1.83 -4.74 4.51
endloop
endfacet
facet normal 0.88 -0.48 -0.02
outer loop
vertex -3.68 -9.48 3.64
vertex -4.36 -10.61 0.00
vertex -2.47 -7.15 0.06
endloop
endfacet
facet normal -0.20 -0.77 -0.61
outer loop
vertex -0.48 -14.23 34.37
vertex -7.96 -12.04 34.02
vertex 1.59 -10.60 29.18
endloop
endfacet
facet normal -0.15 -0.98 0.13
outer loop
vertex -2.34 -16.42 54.14
vertex -2.58 -16.92 50.22
vertex -2.29 -16.60 52.89
endloop
endfacet
facet normal 0.81 0.40 0.44
outer loop
vertex -5.83 5.66 8.21
vertex -2.34 2.52 4.65
vertex -4.41 6.70 4.63
endloop
endfacet
facet normal -0.05 -0.51 -0.86
outer loop
vertex -2.39 -15.22 67.10
vertex -7.43 -7.32 62.69
vertex 2.12 -14.63 66.51
endloop
endfacet
facet normal -0.25 -0.91 -0.32
outer loop
vertex -0.49 -16.23 40.16
vertex -7.96 -12.04 34.02
vertex -0.48 -14.23 34.37
endloop
endfacet
facet normal -0.34 -0.93 0.14
outer loop
vertex -2.34 -16.42 54.14
vertex -5.37 -15.24 54.69
vertex -2.58 -16.92 50.22
endloop
endfacet
facet normal 0.81 0.40 0.44
outer loop
vertex -5.83 5.66 8.21
vertex -3.65 0.74 8.66
vertex -2.34 2.52 4.65
endloop
endfacet
facet normal -0.22 -0.91 -0.35
outer loop
vertex -0.49 -16.23 40.16
vertex -5.58 -15.84 42.39
vertex -7.96 -12.04 34.02
endloop
endfacet
facet normal -0.28 -0.74 -0.62
outer loop
vertex -2.39 -15.22 67.10
vertex -4.93 -16.80 70.13
vertex -9.83 -15.05 70.23
endloop
endfacet
facet normal 0.91 0.40 -0.06
outer loop
vertex -3.25 2.37 25.40
vertex -3.65 0.74 8.66
vertex -5.83 5.66 8.21
endloop
endfacet
facet normal 0.96 -0.28 0.00
outer loop
vertex -3.25 2.37 25.40
vertex -4.70 -2.57 25.36
vertex -3.65 0.74 8.66
endloop
endfacet
facet normal 0.54 -0.07 0.84
outer loop
vertex -3.65 0.74 8.66
vertex -5.64 -3.66 9.59
vertex -3.17 -5.01 7.87
endloop
endfacet
facet normal 0.47 -0.23 0.85
outer loop
vertex -3.17 -5.01 7.87
vertex -5.64 -3.66 9.59
vertex -5.11 -9.21 7.80
endloop
endfacet
facet normal -0.15 -0.43 0.89
outer loop
vertex -0.71 -9.55 98.52
vertex -8.96 -12.01 95.91
vertex -0.40 -15.90 95.49
endloop
endfacet
facet normal -0.22 -0.92 0.33
outer loop
vertex -5.31 -14.67 56.33
vertex -5.37 -15.24 54.69
vertex -1.62 -15.60 56.27
endloop
endfacet
facet normal -0.26 -0.87 0.42
outer loop
vertex -1.62 -15.60 56.27
vertex -5.37 -15.24 54.69
vertex -2.34 -16.42 54.14
endloop
endfacet
facet normal -0.11 -0.99 -0.07
outer loop
vertex -1.98 -16.83 50.25
vertex -5.58 -15.84 42.39
vertex -0.49 -16.23 40.16
endloop
endfacet
facet normal 0.87 0.50 -0.03
outer loop
vertex -4.89 5.24 25.72
vertex -3.25 2.37 25.40
vertex -5.83 5.66 8.21
endloop
endfacet
facet normal 0.91 -0.42 -0.03
outer loop
vertex -4.70 -2.57 25.36
vertex -5.64 -3.66 9.59
vertex -3.65 0.74 8.66
endloop
endfacet
facet normal 0.41 -0.89 0.20
outer loop
vertex -3.68 -9.48 3.64
vertex -5.11 -9.21 7.80
vertex -4.36 -10.61 0.00
endloop
endfacet
facet normal -0.13 -0.85 -0.50
outer loop
vertex 1.59 -10.60 29.18
vertex -7.96 -12.04 34.02
vertex -5.36 -9.63 29.27
endloop
endfacet
facet normal -0.20 -0.65 0.73
outer loop
vertex -7.43 -7.32 62.69
vertex -7.95 -12.32 58.07
vertex -0.44 -14.78 57.91
endloop
endfacet
facet normal -0.22 -0.73 0.65
outer loop
vertex -0.44 -14.78 57.91
vertex -7.95 -12.32 58.07
vertex -5.31 -14.67 56.33
endloop
endfacet
facet normal -0.12 0.90 -0.41
outer loop
vertex -2.58 -16.92 50.22
vertex -5.37 -15.24 54.69
vertex -1.98 -16.83 50.25
endloop
endfacet
facet normal -0.05 -0.87 -0.50
outer loop
vertex -2.39 -15.22 67.10
vertex -2.60 -18.49 72.85
vertex -4.93 -16.80 70.13
endloop
endfacet
facet normal -0.24 0.94 0.26
outer loop
vertex -0.50 19.72 85.66
vertex -6.85 19.38 81.09
vertex -6.89 17.20 88.92
endloop
endfacet
facet normal -0.26 0.21 0.94
outer loop
vertex -3.91 3.43 100.00
vertex -4.39 7.10 99.05
vertex -7.83 2.62 99.10
endloop
endfacet
facet normal 0.81 -0.59 -0.01
outer loop
vertex -4.70 -2.57 25.36
vertex -6.33 -4.71 17.19
vertex -5.64 -3.66 9.59
endloop
endfacet
facet normal -0.37 -0.93 0.05
outer loop
vertex -5.37 -15.24 54.69
vertex -5.58 -15.84 42.39
vertex -1.98 -16.83 50.25
endloop
endfacet
facet normal -0.67 -0.73 -0.15
outer loop
vertex -4.81 3.04 24.13
vertex -6.86 5.01 23.63
vertex -5.04 3.35 23.67
endloop
endfacet
facet normal -0.10 -0.21 0.97
outer loop
vertex -7.84 -1.66 99.47
vertex -8.63 -7.67 98.10
vertex -0.71 -9.55 98.52
endloop
endfacet
facet normal -0.43 -0.80 0.42
outer loop
vertex -7.95 -12.32 58.07
vertex -8.25 -13.82 54.92
vertex -5.31 -14.67 56.33
endloop
endfacet
facet normal -0.20 -0.95 0.23
outer loop
vertex -6.55 -15.83 90.85
vertex -10.00 -16.18 86.29
vertex -0.42 -17.31 90.18
endloop
endfacet
facet normal -0.21 -0.95 0.24
outer loop
vertex -0.42 -17.31 90.18
vertex -10.00 -16.18 86.29
vertex -6.10 -18.81 79.30
endloop
endfacet
facet normal -0.39 -0.84 -0.36
outer loop
vertex -5.05 -19.03 92.04
vertex -6.52 -18.38 92.11
vertex -6.32 -18.30 91.72
endloop
endfacet
facet normal -0.44 -0.47 0.77
outer loop
vertex -5.04 3.35 23.67
vertex -6.86 5.01 23.63
vertex -7.56 1.97 21.37
endloop
endfacet
facet normal -0.72 0.20 0.67
outer loop
vertex -5.04 3.35 23.67
vertex -7.56 1.97 21.37
vertex -6.74 -3.37 23.83
endloop
endfacet
facet normal 0.40 -0.92 -0.04
outer loop
vertex -6.18 -3.24 26.07
vertex -6.74 -3.37 23.83
vertex -4.70 -2.57 25.36
endloop
endfacet
facet normal 0.35 -0.26 0.90
outer loop
vertex -5.64 -3.66 9.59
vertex -9.47 -5.19 10.66
vertex -5.11 -9.21 7.80
endloop
endfacet
facet normal 0.31 -0.30 0.90
outer loop
vertex -5.11 -9.21 7.80
vertex -9.47 -5.19 10.66
vertex -11.08 -8.20 10.22
endloop
endfacet
facet normal -0.40 -0.86 0.31
outer loop
vertex -5.31 -14.67 56.33
vertex -8.25 -13.82 54.92
vertex -5.37 -15.24 54.69
endloop
endfacet
facet normal -0.04 -0.91 -0.40
outer loop
vertex -5.58 -15.84 42.39
vertex -7.14 -14.79 40.16
vertex -7.96 -12.04 34.02
endloop
endfacet
facet normal -0.32 -0.88 -0.36
outer loop
vertex -4.93 -16.80 70.13
vertex -10.22 -16.21 73.43
vertex -9.83 -15.05 70.23
endloop
endfacet
facet normal -0.35 0.62 0.71
outer loop
vertex -1.73 7.66 98.23
vertex -9.83 4.95 96.60
vertex -6.39 5.33 97.97
endloop
endfacet
facet normal -0.24 0.08 0.97
outer loop
vertex -3.91 3.43 100.00
vertex -7.83 2.62 99.10
vertex -7.84 -1.66 99.47
endloop
endfacet
facet normal -0.15 -0.44 0.89
outer loop
vertex -8.63 -7.67 98.10
vertex -8.96 -12.01 95.91
vertex -0.71 -9.55 98.52
endloop
endfacet
facet normal -0.46 -0.67 -0.59
outer loop
vertex -7.96 -12.04 34.02
vertex -7.18 -8.10 28.96
vertex -5.36 -9.63 29.27
endloop
endfacet
facet normal -0.29 -0.93 -0.21
outer loop
vertex -6.10 -18.81 79.30
vertex -10.22 -16.21 73.43
vertex -2.60 -18.49 72.85
endloop
endfacet
facet normal -0.19 -0.52 0.83
outer loop
vertex -8.96 -12.01 95.91
vertex -8.45 -16.09 93.50
vertex -0.40 -15.90 95.49
endloop
endfacet
facet normal -0.24 -0.94 0.22
outer loop
vertex -10.00 -16.18 86.29
vertex -10.45 -16.84 82.95
vertex -6.10 -18.81 79.30
endloop
endfacet
facet normal -0.38 0.10 0.92
outer loop
vertex -6.39 5.33 97.97
vertex -9.83 4.95 96.60
vertex -8.07 -1.79 98.06
endloop
endfacet
facet normal 0.28 -0.94 0.19
outer loop
vertex -4.70 -2.57 25.36
vertex -10.52 -5.32 20.44
vertex -6.33 -4.71 17.19
endloop
endfacet
facet normal 0.47 -0.86 0.20
outer loop
vertex -5.11 -9.21 7.80
vertex -9.38 -13.35 0.12
vertex -4.36 -10.61 0.00
endloop
endfacet
facet normal -0.25 -0.65 0.72
outer loop
vertex -8.45 -16.09 93.50
vertex -6.52 -18.38 92.11
vertex -5.05 -19.03 92.04
endloop
endfacet
facet normal 0.04 -0.99 -0.13
outer loop
vertex -6.33 -4.71 17.19
vertex -10.52 -5.32 20.44
vertex -5.64 -3.66 9.59
endloop
endfacet
facet normal 0.38 -0.93 0.03
outer loop
vertex -10.52 -5.32 20.44
vertex -9.47 -5.19 10.66
vertex -5.64 -3.66 9.59
endloop
endfacet
facet normal -0.17 -0.76 0.62
outer loop
vertex -4.70 -2.57 25.36
vertex -6.74 -3.37 23.83
vertex -10.52 -5.32 20.44
endloop
endfacet
facet normal -0.47 0.65 0.60
outer loop
vertex -2.04 15.54 57.89
vertex -7.62 7.47 62.40
vertex -3.30 10.28 62.69
endloop
endfacet
facet normal 0.38 0.29 0.88
outer loop
vertex -9.83 4.95 96.60
vertex -9.51 2.16 97.38
vertex -8.07 -1.79 98.06
endloop
endfacet
facet normal -0.54 -0.54 0.64
outer loop
vertex -7.43 -7.32 62.69
vertex -12.29 -7.75 58.25
vertex -7.95 -12.32 58.07
endloop
endfacet
facet normal -0.34 0.34 0.88
outer loop
vertex -7.89 11.69 94.30
vertex -11.56 5.20 95.44
vertex -1.73 7.66 98.23
endloop
endfacet
facet normal -0.35 0.65 0.67
outer loop
vertex -1.73 7.66 98.23
vertex -11.56 5.20 95.44
vertex -9.83 4.95 96.60
endloop
endfacet
facet normal -0.22 0.38 0.90
outer loop
vertex -7.56 1.97 21.37
vertex -10.06 -3.91 23.23
vertex -6.74 -3.37 23.83
endloop
endfacet
facet normal 0.13 -0.71 -0.69
outer loop
vertex -8.97 -4.39 27.54
vertex -8.75 -4.06 27.24
vertex -8.42 -4.04 27.29
endloop
endfacet
facet normal 0.64 -0.77 0.06
outer loop
vertex -5.11 -9.21 7.80
vertex -9.49 -13.15 3.73
vertex -9.38 -13.35 0.12
endloop
endfacet
facet normal -0.81 -0.49 0.34
outer loop
vertex -7.14 -14.79 40.16
vertex -5.58 -15.84 42.39
vertex -8.85 -13.38 38.12
endloop
endfacet
facet normal -0.29 0.61 0.73
outer loop
vertex -9.91 11.76 57.90
vertex -7.62 7.47 62.40
vertex -2.04 15.54 57.89
endloop
endfacet
facet normal -0.01 -1.00 -0.04
outer loop
vertex -6.85 4.90 26.37
vertex -10.96 5.06 23.64
vertex -6.86 5.01 23.63
endloop
endfacet
facet normal -0.23 0.59 0.77
outer loop
vertex -10.06 -3.91 23.23
vertex -10.15 -4.31 23.51
vertex -6.74 -3.37 23.83
endloop
endfacet
facet normal -0.37 -0.23 0.90
outer loop
vertex -7.97 -4.57 97.40
vertex -8.07 -1.79 98.06
vertex -9.50 -5.00 96.66
endloop
endfacet
facet normal 0.85 -0.52 0.06
outer loop
vertex -8.75 -4.06 27.24
vertex -8.97 -4.39 27.54
vertex -8.91 -4.39 26.69
endloop
endfacet
facet normal 0.23 -0.93 0.28
outer loop
vertex -10.15 -4.31 23.51
vertex -10.52 -5.32 20.44
vertex -6.74 -3.37 23.83
endloop
endfacet
facet normal -0.29 -0.42 0.86
outer loop
vertex -7.97 -4.57 97.40
vertex -9.50 -5.00 96.66
vertex -8.05 -10.91 94.29
endloop
endfacet
facet normal -0.45 -0.89 -0.05
outer loop
vertex -10.45 -16.84 82.95
vertex -12.23 -15.52 75.67
vertex -6.10 -18.81 79.30
endloop
endfacet
facet normal -0.02 -1.00 -0.02
outer loop
vertex -6.85 4.90 26.37
vertex -11.19 5.00 26.18
vertex -10.96 5.06 23.64
endloop
endfacet
facet normal -0.11 -0.99 -0.01
outer loop
vertex -8.97 -4.39 27.54
vertex -10.00 -4.25 24.66
vertex -8.91 -4.39 26.69
endloop
endfacet
facet normal 0.01 -0.73 -0.68
outer loop
vertex -6.85 4.90 26.37
vertex -12.76 3.29 28.01
vertex -11.19 5.00 26.18
endloop
endfacet
facet normal 0.00 -0.62 0.79
outer loop
vertex -6.86 5.01 23.63
vertex -10.96 5.06 23.64
vertex -10.83 2.64 21.75
endloop
endfacet
facet normal -0.03 -0.59 0.81
outer loop
vertex -6.86 5.01 23.63
vertex -10.83 2.64 21.75
vertex -7.56 1.97 21.37
endloop
endfacet
facet normal 0.16 0.24 0.96
outer loop
vertex -7.56 1.97 21.37
vertex -10.83 2.64 21.75
vertex -10.06 -3.91 23.23
endloop
endfacet
facet normal 0.23 -0.56 0.80
outer loop
vertex -11.08 -8.20 10.22
vertex -11.01 -11.63 7.77
vertex -5.11 -9.21 7.80
endloop
endfacet
facet normal -0.48 -0.60 0.64
outer loop
vertex -6.55 -15.83 90.85
vertex -8.05 -10.91 94.29
vertex -11.35 -8.86 93.74
endloop
endfacet
facet normal -0.50 -0.86 0.03
outer loop
vertex -8.25 -13.82 54.92
vertex -12.56 -11.44 51.73
vertex -5.58 -15.84 42.39
endloop
endfacet
facet normal 0.95 -0.29 -0.11
outer loop
vertex -10.00 -4.25 24.66
vertex -10.15 -4.31 23.51
vertex -10.06 -3.91 23.23
endloop
endfacet
facet normal -0.50 -0.15 0.85
outer loop
vertex -8.07 -1.79 98.06
vertex -12.38 -3.37 95.27
vertex -9.50 -5.00 96.66
endloop
endfacet
facet normal 0.34 -0.83 0.44
outer loop
vertex -5.11 -9.21 7.80
vertex -11.01 -11.63 7.77
vertex -9.49 -13.15 3.73
endloop
endfacet
facet normal -0.42 -0.90 -0.10
outer loop
vertex -6.10 -18.81 79.30
vertex -12.23 -15.52 75.67
vertex -10.22 -16.21 73.43
endloop
endfacet
facet normal -0.51 0.52 0.69
outer loop
vertex -12.11 13.09 90.10
vertex -11.85 8.19 94.03
vertex -7.89 11.69 94.30
endloop
endfacet
facet normal -0.38 0.36 0.85
outer loop
vertex -7.89 11.69 94.30
vertex -11.85 8.19 94.03
vertex -11.56 5.20 95.44
endloop
endfacet
facet normal -0.53 0.17 0.83
outer loop
vertex -11.56 5.20 95.44
vertex -9.51 2.16 97.38
vertex -9.83 4.95 96.60
endloop
endfacet
facet normal 0.11 0.65 -0.75
outer loop
vertex -11.55 -2.11 28.27
vertex -11.40 -1.67 28.68
vertex -8.91 -4.39 26.69
endloop
endfacet
facet normal -0.40 -0.42 0.81
outer loop
vertex -8.05 -10.91 94.29
vertex -9.50 -5.00 96.66
vertex -11.35 -8.86 93.74
endloop
endfacet
facet normal -0.09 -0.94 0.32
outer loop
vertex -11.01 -11.63 7.77
vertex -12.92 -13.75 1.06
vertex -9.49 -13.15 3.73
endloop
endfacet
facet normal -0.57 -0.82 -0.04
outer loop
vertex -12.56 -11.44 51.73
vertex -8.85 -13.38 38.12
vertex -5.58 -15.84 42.39
endloop
endfacet
facet normal 0.13 -0.99 0.06
outer loop
vertex -9.49 -13.15 3.73
vertex -12.92 -13.75 1.06
vertex -9.38 -13.35 0.12
endloop
endfacet
facet normal -0.56 -0.80 0.23
outer loop
vertex -10.00 -16.18 86.29
vertex -12.79 -14.66 84.76
vertex -10.45 -16.84 82.95
endloop
endfacet
facet normal -0.43 -0.10 0.90
outer loop
vertex -10.45 1.82 62.30
vertex -14.53 -1.69 59.96
vertex -7.43 -7.32 62.69
endloop
endfacet
facet normal -0.61 -0.76 -0.23
outer loop
vertex -12.03 -3.20 31.61
vertex -11.97 -2.57 29.42
vertex -8.97 -4.39 27.54
endloop
endfacet
facet normal -0.61 -0.61 0.51
outer loop
vertex -6.55 -15.83 90.85
vertex -12.79 -14.66 84.76
vertex -10.00 -16.18 86.29
endloop
endfacet
facet normal -0.69 0.58 0.43
outer loop
vertex -9.91 11.76 57.90
vertex -10.31 12.71 56.01
vertex -13.56 8.97 55.86
endloop
endfacet
facet normal 0.73 -0.40 0.56
outer loop
vertex -10.83 2.64 21.75
vertex -10.96 5.06 23.64
vertex -12.37 1.98 23.28
endloop
endfacet
facet normal 0.29 0.24 0.93
outer loop
vertex -10.83 2.64 21.75
vertex -12.49 -0.47 23.08
vertex -10.06 -3.91 23.23
endloop
endfacet
facet normal 0.62 0.77 0.16
outer loop
vertex -12.01 -2.43 23.75
vertex -10.00 -4.25 24.66
vertex -10.06 -3.91 23.23
endloop
endfacet
facet normal -0.53 -0.84 0.12
outer loop
vertex -10.00 -4.25 24.66
vertex -12.89 -2.83 21.72
vertex -10.15 -4.31 23.51
endloop
endfacet
facet normal -0.60 -0.74 0.31
outer loop
vertex -10.15 -4.31 23.51
vertex -12.89 -2.83 21.72
vertex -10.52 -5.32 20.44
endloop
endfacet
facet normal -0.55 -0.32 0.77
outer loop
vertex -12.38 -3.37 95.27
vertex -11.35 -8.86 93.74
vertex -9.50 -5.00 96.66
endloop
endfacet
facet normal -0.66 -0.66 -0.36
outer loop
vertex -8.85 -13.38 38.12
vertex -13.23 -7.86 35.98
vertex -7.96 -12.04 34.02
endloop
endfacet
facet normal -0.48 -0.81 -0.35
outer loop
vertex -10.22 -16.21 73.43
vertex -12.16 -15.09 73.51
vertex -9.83 -15.05 70.23
endloop
endfacet
facet normal -0.60 0.30 0.75
outer loop
vertex -11.85 8.19 94.03
vertex -14.36 6.90 92.53
vertex -11.56 5.20 95.44
endloop
endfacet
facet normal 0.65 -0.76 0.04
outer loop
vertex -10.96 5.06 23.64
vertex -11.19 5.00 26.18
vertex -12.74 3.56 23.93
endloop
endfacet
facet normal 0.50 0.39 0.77
outer loop
vertex -12.01 -2.43 23.75
vertex -10.06 -3.91 23.23
vertex -12.49 -0.47 23.08
endloop
endfacet
facet normal -0.51 -0.86 0.09
outer loop
vertex -11.97 -2.57 29.42
vertex -12.89 -2.83 21.72
vertex -10.00 -4.25 24.66
endloop
endfacet
facet normal -0.58 -0.79 0.19
outer loop
vertex -12.79 -14.66 84.76
vertex -12.10 -15.80 82.23
vertex -10.45 -16.84 82.95
endloop
endfacet
facet normal -0.49 -0.85 -0.18
outer loop
vertex -10.22 -16.21 73.43
vertex -12.23 -15.52 75.67
vertex -12.16 -15.09 73.51
endloop
endfacet
facet normal -0.61 0.45 0.65
outer loop
vertex -7.62 7.47 62.40
vertex -13.56 8.97 55.86
vertex -14.50 4.74 57.87
endloop
endfacet
facet normal 0.71 -0.70 -0.04
outer loop
vertex -12.76 3.29 28.01
vertex -12.74 3.56 23.93
vertex -11.19 5.00 26.18
endloop
endfacet
facet normal 0.38 -0.27 0.89
outer loop
vertex -10.96 5.06 23.64
vertex -12.74 3.56 23.93
vertex -12.37 1.98 23.28
endloop
endfacet
facet normal 0.72 -0.09 0.68
outer loop
vertex -10.83 2.64 21.75
vertex -12.37 1.98 23.28
vertex -12.49 -0.47 23.08
endloop
endfacet
facet normal 0.77 0.62 -0.12
outer loop
vertex -12.80 -0.60 28.02
vertex -11.55 -2.11 28.27
vertex -12.01 -2.43 23.75
endloop
endfacet
facet normal -0.59 -0.41 0.69
outer loop
vertex -7.43 -7.32 62.69
vertex -14.53 -1.69 59.96
vertex -12.29 -7.75 58.25
endloop
endfacet
facet normal -0.65 -0.65 0.39
outer loop
vertex -12.29 -7.75 58.25
vertex -12.56 -11.44 51.73
vertex -8.25 -13.82 54.92
endloop
endfacet
facet normal -0.24 -0.90 0.35
outer loop
vertex -11.01 -11.63 7.77
vertex -16.78 -10.65 6.36
vertex -12.92 -13.75 1.06
endloop
endfacet
facet normal -0.60 -0.62 0.50
outer loop
vertex -6.55 -15.83 90.85
vertex -11.35 -8.86 93.74
vertex -12.79 -14.66 84.76
endloop
endfacet
facet normal -0.69 -0.53 -0.50
outer loop
vertex -12.16 -15.09 73.51
vertex -15.72 -12.56 75.72
vertex -9.83 -15.05 70.23
endloop
endfacet
facet normal -0.59 0.48 0.64
outer loop
vertex -12.11 13.09 90.10
vertex -15.12 8.50 90.79
vertex -11.85 8.19 94.03
endloop
endfacet
facet normal 0.96 0.26 0.07
outer loop
vertex -12.80 -0.60 28.02
vertex -12.01 -2.43 23.75
vertex -12.49 -0.47 23.08
endloop
endfacet
facet normal -0.27 -0.96 -0.04
outer loop
vertex -10.52 -5.32 20.44
vertex -14.81 -3.65 10.35
vertex -9.47 -5.19 10.66
endloop
endfacet
facet normal -0.29 -0.56 0.78
outer loop
vertex -11.08 -8.20 10.22
vertex -16.78 -10.65 6.36
vertex -11.01 -11.63 7.77
endloop
endfacet
facet normal -0.86 -0.51 0.00
outer loop
vertex -12.10 -15.80 82.23
vertex -12.79 -14.66 84.76
vertex -12.23 -15.52 75.67
endloop
endfacet
facet normal -0.74 -0.07 0.67
outer loop
vertex -14.36 6.90 92.53
vertex -9.51 2.16 97.38
vertex -11.56 5.20 95.44
endloop
endfacet
facet normal 1.00 0.06 0.01
outer loop
vertex -12.76 3.29 28.01
vertex -12.49 -0.47 23.08
vertex -12.74 3.56 23.93
endloop
endfacet
facet normal 0.75 -0.09 0.65
outer loop
vertex -12.74 3.56 23.93
vertex -12.49 -0.47 23.08
vertex -12.37 1.98 23.28
endloop
endfacet
facet normal 1.00 -0.01 0.06
outer loop
vertex -12.76 3.29 28.01
vertex -12.80 -0.60 28.02
vertex -12.49 -0.47 23.08
endloop
endfacet
facet normal -0.78 -0.61 0.11
outer loop
vertex -11.97 -2.57 29.42
vertex -13.92 -1.70 20.75
vertex -12.89 -2.83 21.72
endloop
endfacet
facet normal -0.09 -0.10 0.99
outer loop
vertex -9.47 -5.19 10.66
vertex -14.81 -3.65 10.35
vertex -11.08 -8.20 10.22
endloop
endfacet
facet normal -0.76 -0.64 -0.11
outer loop
vertex -12.56 -11.44 51.73
vertex -13.23 -7.86 35.98
vertex -8.85 -13.38 38.12
endloop
endfacet
facet normal -0.64 -0.75 -0.17
outer loop
vertex -12.23 -15.52 75.67
vertex -15.72 -12.56 75.72
vertex -12.16 -15.09 73.51
endloop
endfacet
facet normal -0.65 -0.76 0.03
outer loop
vertex -12.23 -15.52 75.67
vertex -12.79 -14.66 84.76
vertex -15.72 -12.56 75.72
endloop
endfacet
facet normal -0.33 0.94 0.01
outer loop
vertex -16.43 8.45 0.29
vertex -14.73 9.02 4.55
vertex -12.77 9.74 0.21
endloop
endfacet
facet normal -0.51 -0.40 0.76
outer loop
vertex -14.53 -1.69 59.96
vertex -14.70 -2.97 59.17
vertex -12.29 -7.75 58.25
endloop
endfacet
facet normal -0.16 -0.16 0.97
outer loop
vertex -14.81 -3.65 10.35
vertex -15.10 -8.08 9.59
vertex -11.08 -8.20 10.22
endloop
endfacet
facet normal -0.53 -0.05 0.85
outer loop
vertex -8.07 -1.79 98.06
vertex -9.51 2.16 97.38
vertex -12.38 -3.37 95.27
endloop
endfacet
facet normal 0.72 -0.17 0.68
outer loop
vertex -13.64 1.69 59.87
vertex -14.52 0.42 60.49
vertex -14.53 -1.69 59.96
endloop
endfacet
facet normal -0.55 -0.66 0.51
outer loop
vertex -11.35 -8.86 93.74
vertex -15.80 -11.01 86.17
vertex -12.79 -14.66 84.76
endloop
endfacet
facet normal -0.61 0.43 0.66
outer loop
vertex -15.12 8.50 90.79
vertex -14.36 6.90 92.53
vertex -11.85 8.19 94.03
endloop
endfacet
facet normal 0.59 0.55 0.59
outer loop
vertex -14.50 4.74 57.87
vertex -15.24 3.84 59.44
vertex -13.64 1.69 59.87
endloop
endfacet
facet normal 0.19 0.32 0.93
outer loop
vertex -15.24 3.84 59.44
vertex -14.52 0.42 60.49
vertex -13.64 1.69 59.87
endloop
endfacet
facet normal -0.73 -0.65 0.20
outer loop
vertex -10.52 -5.32 20.44
vertex -16.08 -2.33 9.99
vertex -14.81 -3.65 10.35
endloop
endfacet
facet normal -0.61 0.17 0.78
outer loop
vertex -14.36 6.90 92.53
vertex -16.37 3.81 91.66
vertex -9.51 2.16 97.38
endloop
endfacet
facet normal -0.44 -0.88 0.19
outer loop
vertex -16.78 -10.65 6.36
vertex -17.09 -11.83 0.17
vertex -12.92 -13.75 1.06
endloop
endfacet
facet normal -0.13 -0.64 -0.76
outer loop
vertex -12.92 -13.75 1.06
vertex -17.09 -11.83 0.17
vertex -9.38 -13.35 0.12
endloop
endfacet
facet normal 0.06 0.30 0.95
outer loop
vertex -15.24 3.84 59.44
vertex -17.55 3.97 59.55
vertex -14.52 0.42 60.49
endloop
endfacet
facet normal 0.16 0.38 0.91
outer loop
vertex -14.52 0.42 60.49
vertex -17.55 3.97 59.55
vertex -17.86 1.93 60.46
endloop
endfacet
facet normal -0.65 -0.36 0.67
outer loop
vertex -16.37 3.81 91.66
vertex -18.99 2.53 88.43
vertex -9.51 2.16 97.38
endloop
endfacet
facet normal -0.68 0.08 0.73
outer loop
vertex -9.51 2.16 97.38
vertex -18.99 2.53 88.43
vertex -12.38 -3.37 95.27
endloop
endfacet
facet normal -0.12 -0.24 0.96
outer loop
vertex -14.52 0.42 60.49
vertex -17.86 1.93 60.46
vertex -14.53 -1.69 59.96
endloop
endfacet
facet normal -0.39 -0.13 0.91
outer loop
vertex -14.81 -3.65 10.35
vertex -16.08 -2.33 9.99
vertex -15.10 -8.08 9.59
endloop
endfacet
facet normal -0.01 -0.92 0.39
outer loop
vertex -17.81 -2.85 59.37
vertex -15.22 -4.36 55.87
vertex -14.70 -2.97 59.17
endloop
endfacet
facet normal -0.74 -0.33 0.59
outer loop
vertex -19.06 -1.54 88.25
vertex -19.20 -4.59 86.36
vertex -11.35 -8.86 93.74
endloop
endfacet
facet normal -0.12 -0.74 0.66
outer loop
vertex -15.10 -8.08 9.59
vertex -16.78 -10.65 6.36
vertex -11.08 -8.20 10.22
endloop
endfacet
facet normal -0.73 -0.40 0.55
outer loop
vertex -19.20 -4.59 86.36
vertex -15.80 -11.01 86.17
vertex -11.35 -8.86 93.74
endloop
endfacet
facet normal 0.17 0.82 0.55
outer loop
vertex -14.50 4.74 57.87
vertex -17.53 4.98 58.45
vertex -15.24 3.84 59.44
endloop
endfacet
facet normal 0.98 0.07 0.17
outer loop
vertex -17.26 3.52 30.88
vertex -16.22 -2.44 27.38
vertex -16.83 3.51 28.37
endloop
endfacet
facet normal 0.95 -0.02 0.31
outer loop
vertex -17.26 3.52 30.88
vertex -17.25 -3.20 30.51
vertex -16.22 -2.44 27.38
endloop
endfacet
facet normal -0.09 -0.22 0.97
outer loop
vertex -17.86 1.93 60.46
vertex -17.81 -2.85 59.37
vertex -14.53 -1.69 59.96
endloop
endfacet
facet normal 0.04 -0.53 0.85
outer loop
vertex -14.53 -1.69 59.96
vertex -17.81 -2.85 59.37
vertex -14.70 -2.97 59.17
endloop
endfacet
facet normal -0.24 -0.94 0.23
outer loop
vertex -17.81 -2.85 59.37
vertex -19.78 -3.38 55.19
vertex -15.22 -4.36 55.87
endloop
endfacet
facet normal -0.17 -0.96 -0.22
outer loop
vertex -19.78 -3.38 55.19
vertex -19.28 -2.69 51.78
vertex -16.89 -2.78 50.33
endloop
endfacet
facet normal -0.17 -0.96 -0.22
outer loop
vertex -15.22 -4.36 55.87
vertex -19.78 -3.38 55.19
vertex -16.89 -2.78 50.33
endloop
endfacet
facet normal -0.63 0.42 0.66
outer loop
vertex -17.30 6.34 6.02
vertex -19.35 2.04 6.79
vertex -14.37 6.39 8.79
endloop
endfacet
facet normal -0.65 0.47 0.59
outer loop
vertex -14.37 6.39 8.79
vertex -19.35 2.04 6.79
vertex -16.70 2.03 9.70
endloop
endfacet
facet normal 0.83 -0.46 -0.30
outer loop
vertex -16.89 -2.78 50.33
vertex -18.85 -1.53 42.99
vertex -17.20 -1.49 47.50
endloop
endfacet
facet normal 0.31 -0.92 -0.24
outer loop
vertex -16.89 -2.78 50.33
vertex -23.72 -3.30 43.51
vertex -18.85 -1.53 42.99
endloop
endfacet
facet normal -0.97 -0.15 -0.20
outer loop
vertex -16.08 -2.33 9.99
vertex -16.70 2.03 9.70
vertex -15.10 -8.08 9.59
endloop
endfacet
facet normal -0.63 -0.11 0.77
outer loop
vertex -15.10 -8.08 9.59
vertex -16.70 2.03 9.70
vertex -19.13 -6.49 6.49
endloop
endfacet
facet normal -0.19 -0.94 -0.29
outer loop
vertex -17.25 -3.20 30.51
vertex -19.61 -2.94 31.17
vertex -16.22 -2.44 27.38
endloop
endfacet
facet normal -0.50 -0.84 0.19
outer loop
vertex -16.78 -10.65 6.36
vertex -18.27 -10.94 1.02
vertex -17.09 -11.83 0.17
endloop
endfacet
facet normal 0.43 0.05 0.90
outer loop
vertex -17.26 3.52 30.88
vertex -18.71 3.17 31.60
vertex -18.24 1.18 31.48
endloop
endfacet
facet normal 0.97 -0.12 -0.19
outer loop
vertex -17.50 2.23 34.58
vertex -17.69 -1.61 35.95
vertex -18.24 1.18 31.48
endloop
endfacet
facet normal 0.91 -0.40 -0.06
outer loop
vertex -17.26 3.52 30.88
vertex -18.24 1.18 31.48
vertex -18.48 0.70 31.08
endloop
endfacet
facet normal 0.77 -0.29 0.57
outer loop
vertex -18.48 0.70 31.08
vertex -18.61 -0.12 30.83
vertex -17.26 3.52 30.88
endloop
endfacet
facet normal 0.91 -0.27 -0.33
outer loop
vertex -17.20 -1.49 47.50
vertex -18.85 -1.53 42.99
vertex -17.34 0.41 45.58
endloop
endfacet
facet normal -0.78 0.28 0.56
outer loop
vertex -18.61 -0.12 30.83
vertex -18.49 -1.69 31.79
vertex -17.26 3.52 30.88
endloop
endfacet
facet normal 0.69 -0.04 0.72
outer loop
vertex -17.26 3.52 30.88
vertex -18.49 -1.69 31.79
vertex -17.25 -3.20 30.51
endloop
endfacet
facet normal 0.01 -1.00 0.07
outer loop
vertex -16.89 -2.78 50.33
vertex -19.28 -2.69 51.78
vertex -23.72 -3.30 43.51
endloop
endfacet
facet normal -0.54 -0.77 0.35
outer loop
vertex -20.03 -1.56 58.80
vertex -19.78 -3.38 55.19
vertex -17.81 -2.85 59.37
endloop
endfacet
facet normal -0.86 -0.48 -0.16
outer loop
vertex -19.23 -7.00 77.87
vertex -19.21 -6.14 75.07
vertex -15.72 -12.56 75.72
endloop
endfacet
facet normal -0.72 -0.54 -0.43
outer loop
vertex -17.09 -11.83 0.17
vertex -18.27 -10.94 1.02
vertex -19.07 -9.21 0.19
endloop
endfacet
facet normal -0.36 0.69 0.63
outer loop
vertex -17.53 4.98 58.45
vertex -19.56 3.41 59.03
vertex -17.55 3.97 59.55
endloop
endfacet
facet normal -0.34 0.43 0.84
outer loop
vertex -17.55 3.97 59.55
vertex -19.56 3.41 59.03
vertex -17.86 1.93 60.46
endloop
endfacet
facet normal 0.92 0.24 -0.30
outer loop
vertex -18.71 3.17 31.60
vertex -17.50 2.23 34.58
vertex -18.24 1.18 31.48
endloop
endfacet
facet normal 0.97 0.04 0.25
outer loop
vertex -19.66 3.89 42.46
vertex -17.69 -1.61 35.95
vertex -17.50 2.23 34.58
endloop
endfacet
facet normal 0.84 0.07 -0.54
outer loop
vertex -19.66 3.89 42.46
vertex -17.34 0.41 45.58
vertex -18.85 -1.53 42.99
endloop
endfacet
facet normal 0.98 -0.11 -0.19
outer loop
vertex -18.24 1.18 31.48
vertex -17.69 -1.61 35.95
vertex -18.49 -1.69 31.79
endloop
endfacet
facet normal 0.17 -0.55 0.82
outer loop
vertex -18.49 -1.69 31.79
vertex -19.61 -2.94 31.17
vertex -17.25 -3.20 30.51
endloop
endfacet
facet normal 0.97 0.16 0.16
outer loop
vertex -19.66 3.89 42.46
vertex -18.85 -1.53 42.99
vertex -17.69 -1.61 35.95
endloop
endfacet
facet normal 0.91 -0.12 -0.39
outer loop
vertex -18.24 1.18 31.48
vertex -18.49 -1.69 31.79
vertex -18.48 0.70 31.08
endloop
endfacet
facet normal 0.97 -0.08 -0.25
outer loop
vertex -18.49 -1.69 31.79
vertex -18.61 -0.12 30.83
vertex -18.48 0.70 31.08
endloop
endfacet
facet normal 0.78 0.62 0.08
outer loop
vertex -19.66 3.89 42.46
vertex -17.50 2.23 34.58
vertex -20.94 6.69 33.09
endloop
endfacet
facet normal -0.54 0.80 0.26
outer loop
vertex -21.02 3.14 56.84
vertex -19.56 3.41 59.03
vertex -17.53 4.98 58.45
endloop
endfacet
facet normal 0.81 0.57 -0.15
outer loop
vertex -17.50 2.23 34.58
vertex -18.71 3.17 31.60
vertex -20.94 6.69 33.09
endloop
endfacet
facet normal 0.60 0.77 -0.22
outer loop
vertex -21.37 5.31 42.77
vertex -17.02 3.99 50.02
vertex -19.66 3.89 42.46
endloop
endfacet
facet normal 0.78 0.06 -0.62
outer loop
vertex -18.48 0.70 31.08
vertex -18.61 -0.12 30.83
vertex -19.53 -0.65 29.62
endloop
endfacet
facet normal 0.71 0.43 0.55
outer loop
vertex -18.88 8.29 83.81
vertex -20.02 6.73 86.49
vertex -18.99 2.53 88.43
endloop
endfacet
facet normal -0.71 0.14 0.69
outer loop
vertex -18.99 2.53 88.43
vertex -20.02 6.73 86.49
vertex -20.17 -2.21 88.21
endloop
endfacet
facet normal 0.83 0.55 -0.07
outer loop
vertex -20.94 6.69 33.09
vertex -18.71 3.17 31.60
vertex -19.35 3.82 29.10
endloop
endfacet
facet normal 0.96 -0.27 0.11
outer loop
vertex -19.50 3.46 25.45
vertex -20.04 1.58 25.51
vertex -19.29 3.54 23.82
endloop
endfacet
facet normal 0.95 -0.29 0.09
outer loop
vertex -19.29 3.54 23.82
vertex -20.04 1.58 25.51
vertex -19.80 1.66 23.05
endloop
endfacet
facet normal -0.01 -0.05 1.00
outer loop
vertex -20.17 -2.21 88.21
vertex -19.06 -1.54 88.25
vertex -18.99 2.53 88.43
endloop
endfacet
facet normal -0.63 0.02 0.77
outer loop
vertex -19.56 3.41 59.03
vertex -20.03 -1.56 58.80
vertex -17.86 1.93 60.46
endloop
endfacet
facet normal -0.36 -0.21 0.91
outer loop
vertex -17.86 1.93 60.46
vertex -20.03 -1.56 58.80
vertex -17.81 -2.85 59.37
endloop
endfacet
facet normal 0.99 0.00 0.11
outer loop
vertex -19.20 -0.81 22.66
vertex -19.40 -2.47 24.51
vertex -19.19 -2.35 22.59
endloop
endfacet
facet normal 0.28 -0.51 0.81
outer loop
vertex -19.06 -1.54 88.25
vertex -20.17 -2.21 88.21
vertex -19.20 -4.59 86.36
endloop
endfacet
facet normal 0.77 -0.63 -0.14
outer loop
vertex -18.49 -1.69 31.79
vertex -17.69 -1.61 35.95
vertex -19.61 -2.94 31.17
endloop
endfacet
facet normal 0.00 -0.99 -0.13
outer loop
vertex -19.61 -2.94 31.17
vertex -20.34 -2.74 29.64
vertex -16.22 -2.44 27.38
endloop
endfacet
facet normal -0.19 -0.94 -0.29
outer loop
vertex -19.23 -7.00 77.87
vertex -20.72 -6.12 75.99
vertex -19.21 -6.14 75.07
endloop
endfacet
facet normal 0.46 0.23 -0.86
outer loop
vertex -19.29 3.54 23.82
vertex -19.80 1.66 23.05
vertex -22.07 3.56 22.34
endloop
endfacet
facet normal 0.68 0.51 0.53
outer loop
vertex -22.55 -0.69 26.86
vertex -19.40 -2.47 24.51
vertex -19.20 -0.81 22.66
endloop
endfacet
facet normal -0.08 -0.63 0.77
outer loop
vertex -20.17 -2.21 88.21
vertex -20.04 -5.86 85.22
vertex -19.20 -4.59 86.36
endloop
endfacet
facet normal -0.44 -0.55 -0.71
outer loop
vertex -20.72 -6.12 75.99
vertex -20.54 -1.47 72.24
vertex -19.21 -6.14 75.07
endloop
endfacet
facet normal 0.74 -0.65 0.18
outer loop
vertex -19.20 -4.59 86.36
vertex -20.04 -5.86 85.22
vertex -19.23 -7.00 77.87
endloop
endfacet
facet normal 0.60 -0.77 0.19
outer loop
vertex -19.23 -7.00 77.87
vertex -20.04 -5.86 85.22
vertex -20.20 -7.07 80.73
endloop
endfacet
facet normal 0.62 -0.69 -0.38
outer loop
vertex -19.61 -2.94 31.17
vertex -20.84 -4.57 32.16
vertex -20.34 -2.74 29.64
endloop
endfacet
facet normal 0.75 -0.65 0.13
outer loop
vertex -18.85 -1.53 42.99
vertex -20.83 -4.62 38.86
vertex -17.69 -1.61 35.95
endloop
endfacet
facet normal 0.76 -0.64 -0.13
outer loop
vertex -17.69 -1.61 35.95
vertex -20.84 -4.57 32.16
vertex -19.61 -2.94 31.17
endloop
endfacet
facet normal 0.69 -0.73 -0.01
outer loop
vertex -20.83 -4.62 38.86
vertex -20.84 -4.57 32.16
vertex -17.69 -1.61 35.95
endloop
endfacet
facet normal -0.36 -0.92 -0.14
outer loop
vertex -19.23 -7.00 77.87
vertex -20.20 -7.07 80.73
vertex -20.72 -6.12 75.99
endloop
endfacet
facet normal 0.42 0.81 -0.41
outer loop
vertex -20.94 6.69 33.09
vertex -19.35 3.82 29.10
vertex -21.34 5.38 30.11
endloop
endfacet
facet normal 0.68 -0.04 -0.73
outer loop
vertex -19.28 1.12 29.76
vertex -19.53 -0.65 29.62
vertex -22.62 1.50 26.64
endloop
endfacet
facet normal -0.83 -0.04 0.56
outer loop
vertex -20.03 -1.56 58.80
vertex -21.62 1.41 56.63
vertex -21.54 -0.26 56.64
endloop
endfacet
facet normal 0.35 -0.82 0.45
outer loop
vertex -18.85 -1.53 42.99
vertex -23.72 -3.30 43.51
vertex -20.83 -4.62 38.86
endloop
endfacet
facet normal 0.52 -0.12 0.84
outer loop
vertex -19.50 3.46 25.45
vertex -22.25 3.63 27.18
vertex -20.04 1.58 25.51
endloop
endfacet
facet normal 0.02 -1.00 -0.03
outer loop
vertex -20.04 1.58 25.51
vertex -22.62 1.50 26.64
vertex -19.80 1.66 23.05
endloop
endfacet
facet normal -0.68 -0.61 0.41
outer loop
vertex -19.28 -2.69 51.78
vertex -23.86 0.76 49.34
vertex -23.72 -3.30 43.51
endloop
endfacet
facet normal 0.64 0.14 0.75
outer loop
vertex -22.55 -0.69 26.86
vertex -22.69 -2.60 27.34
vertex -19.40 -2.47 24.51
endloop
endfacet
facet normal 0.23 -0.97 -0.04
outer loop
vertex -19.40 -2.47 24.51
vertex -23.38 -3.50 27.08
vertex -19.19 -2.35 22.59
endloop
endfacet
facet normal 0.01 -1.00 -0.03
outer loop
vertex -23.54 1.62 22.92
vertex -22.19 1.65 22.40
vertex -19.80 1.66 23.05
endloop
endfacet
facet normal 0.68 -0.05 -0.74
outer loop
vertex -22.62 1.50 26.64
vertex -19.53 -0.65 29.62
vertex -22.55 -0.69 26.86
endloop
endfacet
facet normal 0.22 -0.98 -0.05
outer loop
vertex -23.38 -3.50 27.08
vertex -20.16 -2.53 21.76
vertex -19.19 -2.35 22.59
endloop
endfacet
facet normal 0.65 -0.67 -0.36
outer loop
vertex -20.84 -4.57 32.16
vertex -22.52 -4.42 28.80
vertex -20.34 -2.74 29.64
endloop
endfacet
facet normal 0.27 -0.87 0.41
outer loop
vertex -23.72 -3.30 43.51
vertex -23.27 -5.29 39.02
vertex -20.83 -4.62 38.86
endloop
endfacet
facet normal 0.56 0.73 -0.40
outer loop
vertex -20.94 6.69 33.09
vertex -21.34 5.38 30.11
vertex -22.34 6.69 31.09
endloop
endfacet
facet normal 0.39 -0.29 0.87
outer loop
vertex -22.25 3.63 27.18
vertex -22.62 1.50 26.64
vertex -20.04 1.58 25.51
endloop
endfacet
facet normal -0.85 0.11 0.52
outer loop
vertex -21.41 1.72 53.15
vertex -23.86 0.76 49.34
vertex -21.50 0.68 53.23
endloop
endfacet
facet normal 0.01 -1.00 -0.04
outer loop
vertex -19.80 1.66 23.05
vertex -22.62 1.50 26.64
vertex -23.54 1.62 22.92
endloop
endfacet
facet normal -0.07 -1.00 -0.01
outer loop
vertex -25.37 -4.24 29.49
vertex -22.52 -4.42 28.80
vertex -20.84 -4.57 32.16
endloop
endfacet
facet normal 0.91 0.30 0.30
outer loop
vertex -23.46 5.52 28.98
vertex -22.25 3.63 27.18
vertex -22.96 5.60 27.37
endloop
endfacet
facet normal 0.26 -0.96 -0.05
outer loop
vertex -23.27 -5.29 39.02
vertex -24.83 -5.37 32.44
vertex -20.83 -4.62 38.86
endloop
endfacet
facet normal 0.20 -0.98 -0.01
outer loop
vertex -20.83 -4.62 38.86
vertex -24.83 -5.37 32.44
vertex -20.84 -4.57 32.16
endloop
endfacet
facet normal 0.54 -0.59 0.60
outer loop
vertex -22.69 -2.60 27.34
vertex -23.38 -3.50 27.08
vertex -19.40 -2.47 24.51
endloop
endfacet
facet normal 0.16 -0.91 -0.38
outer loop
vertex -24.83 -5.37 32.44
vertex -25.37 -4.24 29.49
vertex -20.84 -4.57 32.16
endloop
endfacet
facet normal -0.01 -1.00 -0.03
outer loop
vertex -22.62 1.50 26.64
vertex -25.03 1.54 26.19
vertex -23.54 1.62 22.92
endloop
endfacet
facet normal -0.15 -0.90 -0.40
outer loop
vertex -25.37 -4.24 29.49
vertex -23.38 -3.50 27.08
vertex -22.52 -4.42 28.80
endloop
endfacet
facet normal -0.41 -0.88 -0.25
outer loop
vertex -23.38 -3.50 27.08
vertex -26.05 -1.96 25.98
vertex -23.70 -2.14 22.77
endloop
endfacet
facet normal -0.16 -0.91 0.39
outer loop
vertex -23.72 -3.30 43.51
vertex -25.82 -4.07 40.81
vertex -23.27 -5.29 39.02
endloop
endfacet
facet normal -0.06 0.99 0.12
outer loop
vertex -20.74 6.70 37.98
vertex -25.72 6.88 34.20
vertex -24.67 6.09 41.03
endloop
endfacet
facet normal -0.37 -0.92 0.10
outer loop
vertex -25.82 -4.07 40.81
vertex -24.83 -5.37 32.44
vertex -23.27 -5.29 39.02
endloop
endfacet
facet normal -0.36 -0.87 -0.34
outer loop
vertex -27.39 -2.41 28.54
vertex -26.05 -1.96 25.98
vertex -23.38 -3.50 27.08
endloop
endfacet
facet normal -0.54 -0.84 0.07
outer loop
vertex -25.82 -4.07 40.81
vertex -28.69 -2.83 33.06
vertex -24.83 -5.37 32.44
endloop
endfacet
facet normal -0.56 -0.80 -0.20
outer loop
vertex -24.83 -5.37 32.44
vertex -28.69 -2.83 33.06
vertex -25.37 -4.24 29.49
endloop
endfacet
facet normal -0.61 0.77 0.17
outer loop
vertex -28.13 5.02 33.46
vertex -28.52 3.53 38.82
vertex -24.67 6.09 41.03
endloop
endfacet
facet normal -0.66 -0.74 0.13
outer loop
vertex -25.82 -4.07 40.81
vertex -28.70 -1.83 38.84
vertex -28.69 -2.83 33.06
endloop
endfacet
facet normal 0.65 0.09 -0.76
outer loop
vertex 27.03 3.46 27.96
vertex 27.10 -0.47 27.53
vertex 24.69 2.15 25.80
endloop
endfacet
facet normal 0.47 0.85 0.22
outer loop
vertex 22.17 5.19 44.80
vertex 27.20 5.38 33.47
vertex 24.41 7.05 32.91
endloop
endfacet
facet normal 0.54 0.79 -0.29
outer loop
vertex 27.20 5.38 33.47
vertex 27.03 3.46 27.96
vertex 24.41 7.05 32.91
endloop
endfacet
facet normal 0.15 0.99 0.08
outer loop
vertex 26.88 4.99 38.80
vertex 27.20 5.38 33.47
vertex 22.17 5.19 44.80
endloop
endfacet
facet normal 0.52 0.80 -0.30
outer loop
vertex 24.41 7.05 32.91
vertex 27.03 3.46 27.96
vertex 23.09 5.84 27.42
endloop
endfacet
facet normal 0.61 -0.49 -0.61
outer loop
vertex 24.16 -3.89 27.34
vertex 27.10 -0.47 27.53
vertex 26.22 -3.16 28.82
endloop
endfacet
facet normal 0.42 0.85 0.30
outer loop
vertex 23.27 4.13 46.24
vertex 26.88 4.99 38.80
vertex 22.17 5.19 44.80
endloop
endfacet
facet normal 0.52 0.85 -0.05
outer loop
vertex 23.09 5.84 27.42
vertex 27.03 3.46 27.96
vertex 25.39 4.36 26.25
endloop
endfacet
facet normal 0.63 -0.51 -0.59
outer loop
vertex 24.14 -2.60 26.21
vertex 27.10 -0.47 27.53
vertex 24.16 -3.89 27.34
endloop
endfacet
facet normal -0.15 -0.03 -0.99
outer loop
vertex 24.69 2.15 25.80
vertex 24.15 0.41 25.94
vertex 22.82 1.11 26.12
endloop
endfacet
facet normal 0.15 0.75 -0.65
outer loop
vertex 23.09 5.84 27.42
vertex 25.39 4.36 26.25
vertex 24.58 4.14 25.81
endloop
endfacet
facet normal 0.51 0.83 0.23
outer loop
vertex 22.17 5.19 44.80
vertex 24.41 7.05 32.91
vertex 21.84 7.00 38.95
endloop
endfacet
facet normal 0.52 0.53 -0.67
outer loop
vertex 24.15 0.41 25.94
vertex 27.10 -0.47 27.53
vertex 21.62 -2.12 22.03
endloop
endfacet
facet normal 0.05 0.97 -0.23
outer loop
vertex 21.70 6.92 31.79
vertex 24.41 7.05 32.91
vertex 23.09 5.84 27.42
endloop
endfacet
facet normal 0.39 0.64 -0.66
outer loop
vertex 18.84 0.12 22.57
vertex 24.15 0.41 25.94
vertex 21.62 -2.12 22.03
endloop
endfacet
facet normal -0.05 1.00 -0.01
outer loop
vertex 21.70 6.92 31.79
vertex 21.84 7.00 38.95
vertex 24.41 7.05 32.91
endloop
endfacet
facet normal -0.84 0.40 -0.37
outer loop
vertex 21.70 6.92 31.79
vertex 23.09 5.84 27.42
vertex 22.11 5.06 28.80
endloop
endfacet
facet normal -0.51 0.31 -0.80
outer loop
vertex 22.22 3.87 27.21
vertex 23.09 5.84 27.42
vertex 24.58 4.14 25.81
endloop
endfacet
facet normal -0.08 1.00 0.04
outer loop
vertex 22.22 3.87 27.21
vertex 24.58 4.14 25.81
vertex 19.00 3.74 24.02
endloop
endfacet
facet normal 0.32 0.76 -0.57
outer loop
vertex 22.82 1.11 26.12
vertex 24.15 0.41 25.94
vertex 18.84 0.12 22.57
endloop
endfacet
facet normal -0.84 0.41 -0.36
outer loop
vertex 22.11 5.06 28.80
vertex 23.09 5.84 27.42
vertex 22.22 3.87 27.21
endloop
endfacet
facet normal 0.00 0.98 -0.22
outer loop
vertex 24.58 4.14 25.81
vertex 22.37 3.43 22.62
vertex 19.00 3.74 24.02
endloop
endfacet
facet normal 0.06 -0.31 -0.95
outer loop
vertex 20.26 3.48 22.48
vertex 22.37 3.43 22.62
vertex 22.59 1.54 23.24
endloop
endfacet
facet normal -0.90 0.11 -0.42
outer loop
vertex 22.15 0.71 26.54
vertex 22.22 3.87 27.21
vertex 22.34 1.45 26.31
endloop
endfacet
facet normal -0.46 -0.16 -0.87
outer loop
vertex 22.15 0.71 26.54
vertex 22.34 1.45 26.31
vertex 22.82 1.11 26.12
endloop
endfacet
facet normal -0.40 0.90 0.20
outer loop
vertex 22.15 0.71 26.54
vertex 22.82 1.11 26.12
vertex 18.84 0.12 22.57
endloop
endfacet
facet normal -0.31 -0.39 -0.87
outer loop
vertex 21.75 -2.39 26.98
vertex 24.14 -2.60 26.21
vertex 21.41 -3.57 27.63
endloop
endfacet
facet normal -0.37 0.88 0.29
outer loop
vertex 19.31 4.42 43.53
vertex 22.17 5.19 44.80
vertex 21.84 7.00 38.95
endloop
endfacet
facet normal -0.52 0.67 -0.53
outer loop
vertex 19.81 4.08 29.79
vertex 22.11 5.06 28.80
vertex 22.22 3.87 27.21
endloop
endfacet
facet normal -0.83 0.13 -0.54
outer loop
vertex 22.22 3.87 27.21
vertex 22.15 0.71 26.54
vertex 21.74 -0.40 26.89
endloop
endfacet
facet normal -0.52 0.83 0.18
outer loop
vertex 19.31 4.42 43.53
vertex 21.84 7.00 38.95
vertex 19.67 6.58 34.61
endloop
endfacet
facet normal -0.95 0.12 -0.28
outer loop
vertex 21.41 -3.57 27.63
vertex 21.76 -1.78 27.21
vertex 21.75 -2.39 26.98
endloop
endfacet
facet normal -0.51 0.69 -0.50
outer loop
vertex 21.70 6.92 31.79
vertex 22.11 5.06 28.80
vertex 19.81 4.08 29.79
endloop
endfacet
facet normal 0.03 0.99 -0.14
outer loop
vertex 19.00 3.74 24.02
vertex 22.37 3.43 22.62
vertex 20.26 3.48 22.48
endloop
endfacet
facet normal 0.19 0.94 -0.29
outer loop
vertex 19.80 0.58 24.64
vertex 22.15 0.71 26.54
vertex 18.84 0.12 22.57
endloop
endfacet
facet normal -0.59 0.43 0.69
outer loop
vertex 21.74 -0.40 26.89
vertex 22.15 0.71 26.54
vertex 19.80 0.58 24.64
endloop
endfacet
facet normal -0.67 -0.18 -0.72
outer loop
vertex 18.75 -0.34 29.66
vertex 21.74 -0.40 26.89
vertex 21.76 -1.78 27.21
endloop
endfacet
facet normal -0.22 -0.04 -0.97
outer loop
vertex 18.84 0.12 22.57
vertex 21.62 -2.12 22.03
vertex 18.46 -1.70 22.74
endloop
endfacet
facet normal -0.18 0.98 -0.01
outer loop
vertex 19.67 6.58 34.61
vertex 21.84 7.00 38.95
vertex 21.70 6.92 31.79
endloop
endfacet
facet normal 0.39 0.86 0.33
outer loop
vertex 18.43 4.21 51.70
vertex 23.27 4.13 46.24
vertex 22.17 5.19 44.80
endloop
endfacet
facet normal -0.67 0.13 -0.73
outer loop
vertex 22.22 3.87 27.21
vertex 21.74 -0.40 26.89
vertex 18.75 -0.34 29.66
endloop
endfacet
facet normal -0.70 -0.03 -0.71
outer loop
vertex 21.76 -1.78 27.21
vertex 21.41 -3.57 27.63
vertex 19.02 -1.97 29.92
endloop
endfacet
facet normal 0.49 0.63 -0.60
outer loop
vertex 19.58 8.54 76.35
vertex 19.93 5.01 72.90
vertex 18.54 7.21 74.10
endloop
endfacet
facet normal -0.57 0.76 -0.32
outer loop
vertex 19.67 6.58 34.61
vertex 21.70 6.92 31.79
vertex 18.70 4.53 31.50
endloop
endfacet
facet normal -0.50 0.69 -0.51
outer loop
vertex 18.70 4.53 31.50
vertex 21.70 6.92 31.79
vertex 19.81 4.08 29.79
endloop
endfacet
facet normal 0.39 0.86 0.33
outer loop
vertex 18.43 4.21 51.70
vertex 20.33 2.84 53.04
vertex 23.27 4.13 46.24
endloop
endfacet
facet normal -0.68 -0.23 -0.70
outer loop
vertex 18.75 -0.34 29.66
vertex 21.76 -1.78 27.21
vertex 19.02 -1.97 29.92
endloop
endfacet
facet normal -0.74 -0.54 -0.40
outer loop
vertex 19.02 -1.97 29.92
vertex 21.41 -3.57 27.63
vertex 17.89 -1.75 31.72
endloop
endfacet
facet normal 0.94 0.32 0.10
outer loop
vertex 19.40 8.41 83.74
vertex 19.60 7.11 85.93
vertex 19.89 8.80 78.04
endloop
endfacet
facet normal -0.55 -0.79 0.27
outer loop
vertex 21.60 -3.52 43.21
vertex 18.38 -3.05 38.01
vertex 20.81 -5.34 36.22
endloop
endfacet
facet normal -0.01 0.86 0.51
outer loop
vertex 18.19 7.96 84.49
vertex 19.60 7.11 85.93
vertex 19.40 8.41 83.74
endloop
endfacet
facet normal -0.21 0.74 0.64
outer loop
vertex 18.22 5.83 86.97
vertex 19.60 7.11 85.93
vertex 18.19 7.96 84.49
endloop
endfacet
facet normal 0.07 0.58 0.81
outer loop
vertex 18.22 5.83 86.97
vertex 19.64 4.31 87.94
vertex 19.60 7.11 85.93
endloop
endfacet
facet normal 0.78 0.62 0.07
outer loop
vertex 18.49 4.60 58.18
vertex 19.46 3.33 58.61
vertex 20.33 2.84 53.04
endloop
endfacet
facet normal -0.32 0.29 -0.90
outer loop
vertex 18.54 7.21 74.10
vertex 19.93 5.01 72.90
vertex 19.78 1.87 71.95
endloop
endfacet
facet normal -0.67 -0.10 -0.74
outer loop
vertex 18.93 2.50 23.81
vertex 20.26 3.48 22.48
vertex 19.99 1.49 22.99
endloop
endfacet
facet normal -0.71 0.19 -0.68
outer loop
vertex 18.75 -0.34 29.66
vertex 19.81 4.08 29.79
vertex 22.22 3.87 27.21
endloop
endfacet
facet normal -0.33 0.94 0.04
outer loop
vertex 19.40 8.41 83.74
vertex 19.89 8.80 78.04
vertex 18.19 7.96 84.49
endloop
endfacet
facet normal -0.29 0.96 0.05
outer loop
vertex 18.19 7.96 84.49
vertex 19.89 8.80 78.04
vertex 18.42 8.44 76.34
endloop
endfacet
facet normal -0.09 0.99 -0.13
outer loop
vertex 19.89 8.80 78.04
vertex 19.58 8.54 76.35
vertex 18.42 8.44 76.34
endloop
endfacet
facet normal -0.07 0.87 -0.48
outer loop
vertex 18.42 8.44 76.34
vertex 19.58 8.54 76.35
vertex 18.54 7.21 74.10
endloop
endfacet
facet normal 0.64 0.75 -0.15
outer loop
vertex 17.68 5.59 55.51
vertex 20.33 2.84 53.04
vertex 18.43 4.21 51.70
endloop
endfacet
facet normal -0.75 0.15 -0.64
outer loop
vertex 18.93 2.50 23.81
vertex 19.00 3.74 24.02
vertex 20.26 3.48 22.48
endloop
endfacet
facet normal -0.90 0.22 0.37
outer loop
vertex 19.80 0.58 24.64
vertex 18.84 0.12 22.57
vertex 18.46 -1.70 22.74
endloop
endfacet
facet normal 0.73 0.68 0.03
outer loop
vertex 18.49 4.60 58.18
vertex 20.33 2.84 53.04
vertex 17.68 5.59 55.51
endloop
endfacet
facet normal -0.89 0.44 0.07
outer loop
vertex 19.31 4.42 43.53
vertex 19.67 6.58 34.61
vertex 17.76 1.94 39.51
endloop
endfacet
facet normal 0.04 -0.02 -1.00
outer loop
vertex 19.30 -4.41 0.13
vertex 18.35 -9.34 0.20
vertex 16.62 -11.67 0.18
endloop
endfacet
facet normal -0.87 0.49 -0.07
outer loop
vertex 17.94 3.99 37.76
vertex 19.67 6.58 34.61
vertex 16.93 2.01 36.18
endloop
endfacet
facet normal -0.87 0.50 -0.06
outer loop
vertex 16.93 2.01 36.18
vertex 19.67 6.58 34.61
vertex 18.70 4.53 31.50
endloop
endfacet
facet normal -0.26 0.97 0.00
outer loop
vertex 16.55 3.65 50.29
vertex 22.17 5.19 44.80
vertex 19.31 4.42 43.53
endloop
endfacet
facet normal 0.44 0.56 0.70
outer loop
vertex 17.76 1.94 39.51
vertex 19.67 6.58 34.61
vertex 17.94 3.99 37.76
endloop
endfacet
facet normal -0.16 0.04 -0.99
outer loop
vertex 17.94 3.99 37.76
vertex 18.27 2.91 37.66
vertex 17.57 2.80 37.77
endloop
endfacet
facet normal -0.20 0.45 -0.87
outer loop
vertex 17.57 2.80 37.77
vertex 18.27 2.91 37.66
vertex 17.95 2.20 37.37
endloop
endfacet
facet normal -0.95 0.15 0.27
outer loop
vertex 19.31 4.42 43.53
vertex 17.76 1.94 39.51
vertex 18.20 -0.42 42.36
endloop
endfacet
facet normal -0.02 0.94 0.35
outer loop
vertex 13.97 4.61 57.95
vertex 18.49 4.60 58.18
vertex 17.68 5.59 55.51
endloop
endfacet
facet normal -0.27 0.96 -0.01
outer loop
vertex 18.43 4.21 51.70
vertex 22.17 5.19 44.80
vertex 16.55 3.65 50.29
endloop
endfacet
facet normal -0.92 0.30 0.25
outer loop
vertex 17.76 1.94 39.51
vertex 17.94 3.99 37.76
vertex 17.57 2.80 37.77
endloop
endfacet
facet normal 0.06 0.58 -0.81
outer loop
vertex 17.57 2.80 37.77
vertex 17.95 2.20 37.37
vertex 17.25 1.97 37.15
endloop
endfacet
facet normal -0.36 0.92 0.16
outer loop
vertex 17.25 1.97 37.15
vertex 17.95 2.20 37.37
vertex 16.93 2.01 36.18
endloop
endfacet
facet normal -0.18 0.98 -0.01
outer loop
vertex 16.93 2.01 36.18
vertex 17.95 2.20 37.37
vertex 17.73 2.15 36.16
endloop
endfacet
facet normal -0.85 0.30 -0.44
outer loop
vertex 16.72 0.23 45.64
vertex 19.31 4.42 43.53
vertex 18.20 -0.42 42.36
endloop
endfacet
facet normal -0.98 0.05 0.19
outer loop
vertex 18.20 -0.42 42.36
vertex 17.76 1.94 39.51
vertex 17.46 -0.51 38.61
endloop
endfacet
facet normal 0.54 -0.05 -0.84
outer loop
vertex 18.75 -0.34 29.66
vertex 19.02 -1.97 29.92
vertex 15.24 -1.91 27.51
endloop
endfacet
facet normal -0.89 -0.38 0.25
outer loop
vertex 17.46 -0.51 38.61
vertex 17.26 -1.34 36.63
vertex 18.38 -3.05 38.01
endloop
endfacet
facet normal -0.82 -0.58 -0.06
outer loop
vertex 18.38 -3.05 38.01
vertex 17.26 -1.34 36.63
vertex 17.89 -1.75 31.72
endloop
endfacet
facet normal 0.12 0.94 -0.32
outer loop
vertex 17.68 5.59 55.51
vertex 18.43 4.21 51.70
vertex 15.39 5.36 54.00
endloop
endfacet
facet normal 0.04 0.91 -0.41
outer loop
vertex 15.39 5.36 54.00
vertex 18.43 4.21 51.70
vertex 16.55 3.65 50.29
endloop
endfacet
facet normal -0.81 0.53 -0.27
outer loop
vertex 19.31 4.42 43.53
vertex 16.56 2.63 48.23
vertex 16.55 3.65 50.29
endloop
endfacet
facet normal -0.92 0.36 -0.15
outer loop
vertex 16.93 2.01 36.18
vertex 18.70 4.53 31.50
vertex 17.47 1.45 31.57
endloop
endfacet
facet normal -0.86 0.34 -0.37
outer loop
vertex 16.56 2.63 48.23
vertex 19.31 4.42 43.53
vertex 16.72 0.23 45.64
endloop
endfacet
facet normal -0.96 0.21 0.21
outer loop
vertex 17.76 1.94 39.51
vertex 17.57 2.80 37.77
vertex 17.25 1.97 37.15
endloop
endfacet
facet normal 0.46 -0.02 -0.89
outer loop
vertex 16.22 3.38 28.24
vertex 18.75 -0.34 29.66
vertex 16.40 -0.17 28.42
endloop
endfacet
facet normal -0.96 -0.03 -0.26
outer loop
vertex 16.80 -0.54 34.28
vertex 17.47 1.45 31.57
vertex 17.47 -0.77 31.82
endloop
endfacet
facet normal 0.47 0.14 -0.87
outer loop
vertex 16.40 -0.17 28.42
vertex 18.75 -0.34 29.66
vertex 15.24 -1.91 27.51
endloop
endfacet
facet normal -0.61 -0.74 -0.28
outer loop
vertex 18.20 -0.42 42.36
vertex 21.60 -3.52 43.21
vertex 17.09 -2.77 50.96
endloop
endfacet
facet normal -0.45 -0.85 -0.29
outer loop
vertex 16.50 -1.52 48.21
vertex 18.20 -0.42 42.36
vertex 17.09 -2.77 50.96
endloop
endfacet
facet normal -0.04 0.01 -1.00
outer loop
vertex 18.74 3.81 0.23
vertex 19.30 -4.41 0.13
vertex 16.62 -11.67 0.18
endloop
endfacet
facet normal 0.78 0.62 0.06
outer loop
vertex 11.40 16.58 83.07
vertex 18.19 7.96 84.49
vertex 18.42 8.44 76.34
endloop
endfacet
facet normal 0.30 0.51 0.81
outer loop
vertex 19.46 3.33 58.61
vertex 18.49 4.60 58.18
vertex 15.61 3.83 59.72
endloop
endfacet
facet normal 0.01 0.97 -0.25
outer loop
vertex 18.70 4.53 31.50
vertex 19.81 4.08 29.79
vertex 16.06 3.93 29.05
endloop
endfacet
facet normal -0.98 0.15 -0.13
outer loop
vertex 16.80 -0.54 34.28
vertex 16.93 2.01 36.18
vertex 17.47 1.45 31.57
endloop
endfacet
facet normal 0.27 0.96 -0.05
outer loop
vertex 17.76 1.94 39.51
vertex 17.25 1.97 37.15
vertex 16.93 2.01 36.18
endloop
endfacet
facet normal -0.97 0.03 0.24
outer loop
vertex 17.76 1.94 39.51
vertex 16.93 2.01 36.18
vertex 17.46 -0.51 38.61
endloop
endfacet
facet normal -0.88 -0.36 -0.32
outer loop
vertex 16.50 -1.52 48.21
vertex 16.72 0.23 45.64
vertex 18.20 -0.42 42.36
endloop
endfacet
facet normal -0.90 -0.37 -0.21
outer loop
vertex 16.80 -0.54 34.28
vertex 17.47 -0.77 31.82
vertex 17.89 -1.75 31.72
endloop
endfacet
facet normal -0.98 -0.13 0.15
outer loop
vertex 17.46 -0.51 38.61
vertex 16.80 -0.54 34.28
vertex 17.26 -1.34 36.63
endloop
endfacet
facet normal -0.79 -0.61 -0.05
outer loop
vertex 17.26 -1.34 36.63
vertex 16.80 -0.54 34.28
vertex 17.89 -1.75 31.72
endloop
endfacet
facet normal -0.18 0.98 0.12
outer loop
vertex 13.97 4.61 57.95
vertex 17.68 5.59 55.51
vertex 15.39 5.36 54.00
endloop
endfacet
facet normal -0.62 0.58 0.53
outer loop
vertex 16.29 2.09 31.35
vertex 18.70 4.53 31.50
vertex 16.06 3.93 29.05
endloop
endfacet
facet normal -0.99 -0.06 0.15
outer loop
vertex 17.46 -0.51 38.61
vertex 16.93 2.01 36.18
vertex 16.80 -0.54 34.28
endloop
endfacet
facet normal 0.80 0.54 -0.26
outer loop
vertex 18.42 8.44 76.34
vertex 18.54 7.21 74.10
vertex 13.55 12.96 70.78
endloop
endfacet
facet normal 0.75 0.66 0.05
outer loop
vertex 15.56 8.35 4.24
vertex 18.00 5.61 3.97
vertex 15.98 8.19 0.20
endloop
endfacet
facet normal -0.02 0.91 0.42
outer loop
vertex 13.97 4.61 57.95
vertex 15.61 3.83 59.72
vertex 18.49 4.60 58.18
endloop
endfacet
facet normal 0.08 0.83 -0.55
outer loop
vertex 16.06 3.93 29.05
vertex 19.81 4.08 29.79
vertex 16.22 3.38 28.24
endloop
endfacet
facet normal -0.91 0.24 -0.34
outer loop
vertex 16.06 3.93 29.05
vertex 16.22 3.38 28.24
vertex 15.35 2.03 29.63
endloop
endfacet
facet normal -0.39 -0.07 -0.92
outer loop
vertex 16.22 3.38 28.24
vertex 16.40 -0.17 28.42
vertex 15.35 -1.50 28.96
endloop
endfacet
facet normal 0.91 0.32 -0.25
outer loop
vertex 13.24 10.02 39.97
vertex 15.68 7.10 45.14
vertex 15.23 2.48 37.71
endloop
endfacet
facet normal -0.80 0.43 0.42
outer loop
vertex 16.29 2.09 31.35
vertex 16.06 3.93 29.05
vertex 15.35 2.03 29.63
endloop
endfacet
facet normal -0.75 -0.05 0.66
outer loop
vertex 17.07 -2.53 31.23
vertex 17.47 -0.77 31.82
vertex 15.35 2.03 29.63
endloop
endfacet
facet normal -0.80 0.59 -0.11
outer loop
vertex 15.35 -1.50 28.96
vertex 16.40 -0.17 28.42
vertex 15.24 -1.91 27.51
endloop
endfacet
facet normal -0.88 0.09 -0.47
outer loop
vertex 15.35 2.03 29.63
vertex 16.22 3.38 28.24
vertex 15.35 -1.50 28.96
endloop
endfacet
facet normal -0.82 -0.11 0.57
outer loop
vertex 17.07 -2.53 31.23
vertex 15.35 2.03 29.63
vertex 15.35 -1.50 28.96
endloop
endfacet
facet normal -0.72 -0.65 0.25
outer loop
vertex 15.35 -1.50 28.96
vertex 15.24 -1.91 27.51
vertex 17.07 -2.53 31.23
endloop
endfacet
facet normal 0.42 0.76 0.49
outer loop
vertex 12.96 7.02 8.53
vertex 15.15 6.32 7.73
vertex 15.56 8.35 4.24
endloop
endfacet
facet normal 0.64 0.68 0.36
outer loop
vertex 10.53 13.41 90.66
vertex 16.06 10.04 87.13
vertex 11.40 16.58 83.07
endloop
endfacet
facet normal 0.17 0.97 0.18
outer loop
vertex 15.56 8.35 4.24
vertex 12.94 9.56 0.15
vertex 8.64 9.52 4.44
endloop
endfacet
facet normal 0.76 0.64 0.02
outer loop
vertex 11.40 16.58 83.07
vertex 18.42 8.44 76.34
vertex 11.03 17.19 77.10
endloop
endfacet
facet normal 0.75 0.65 -0.16
outer loop
vertex 11.03 17.19 77.10
vertex 18.42 8.44 76.34
vertex 10.93 16.12 72.25
endloop
endfacet
facet normal 0.16 0.91 0.38
outer loop
vertex 12.96 7.02 8.53
vertex 15.56 8.35 4.24
vertex 8.64 9.52 4.44
endloop
endfacet
facet normal 0.68 0.12 -0.73
outer loop
vertex 9.23 3.47 62.37
vertex 14.22 8.62 67.90
vertex 19.78 1.87 71.95
endloop
endfacet
facet normal 0.50 0.36 -0.79
outer loop
vertex 8.79 4.45 62.54
vertex 14.22 8.62 67.90
vertex 9.23 3.47 62.37
endloop
endfacet
facet normal 0.54 0.10 0.84
outer loop
vertex 13.27 -2.78 94.19
vertex 15.35 3.82 92.08
vertex 5.89 5.28 98.02
endloop
endfacet
facet normal 0.66 0.66 0.35
outer loop
vertex 10.53 13.41 90.66
vertex 11.40 16.58 83.07
vertex 9.16 16.61 87.23
endloop
endfacet
facet normal 0.80 0.40 -0.44
outer loop
vertex 13.24 10.02 39.97
vertex 9.34 6.54 29.76
vertex 9.42 11.73 34.65
endloop
endfacet
facet normal 0.02 0.00 -1.00
outer loop
vertex 12.94 9.56 0.15
vertex 15.98 8.19 0.20
vertex 4.81 7.61 0.01
endloop
endfacet
facet normal 0.00 -0.01 -1.00
outer loop
vertex 1.35 -4.79 0.11
vertex 16.62 -11.67 0.18
vertex 3.71 -10.68 0.19
endloop
endfacet
facet normal 0.69 0.70 0.19
outer loop
vertex 8.93 13.86 54.71
vertex 13.91 9.95 51.03
vertex 11.78 13.01 47.59
endloop
endfacet
facet normal 0.48 0.53 -0.69
outer loop
vertex 5.72 14.33 66.35
vertex 13.55 12.96 70.78
vertex 14.22 8.62 67.90
endloop
endfacet
facet normal 0.37 0.91 0.17
outer loop
vertex 12.96 7.02 8.53
vertex 8.64 9.52 4.44
vertex 12.72 6.52 11.74
endloop
endfacet
facet normal 0.47 0.40 -0.79
outer loop
vertex 5.10 8.89 62.54
vertex 14.22 8.62 67.90
vertex 8.79 4.45 62.54
endloop
endfacet
facet normal 0.65 -0.07 -0.75
outer loop
vertex 8.71 -4.02 62.58
vertex 9.23 3.47 62.37
vertex 14.47 -7.07 67.83
endloop
endfacet
facet normal 0.74 0.64 0.22
outer loop
vertex 8.93 13.86 54.71
vertex 11.78 13.01 47.59
vertex 9.98 14.42 49.55
endloop
endfacet
facet normal 0.54 0.84 -0.11
outer loop
vertex 9.98 14.42 49.55
vertex 11.78 13.01 47.59
vertex 6.05 15.65 39.41
endloop
endfacet
facet normal 0.54 0.83 -0.11
outer loop
vertex 6.05 15.65 39.41
vertex 11.78 13.01 47.59
vertex 9.14 13.41 37.70
endloop
endfacet
facet normal 0.70 0.65 -0.29
outer loop
vertex 9.42 11.73 34.65
vertex 9.14 13.41 37.70
vertex 13.24 10.02 39.97
endloop
endfacet
facet normal 0.00 0.04 -1.00
outer loop
vertex 3.71 -10.68 0.19
vertex 16.62 -11.67 0.18
vertex 7.19 -12.90 0.11
endloop
endfacet
facet normal 0.00 0.03 -1.00
outer loop
vertex 7.19 -12.90 0.11
vertex 16.62 -11.67 0.18
vertex 12.07 -13.56 0.11
endloop
endfacet
facet normal 0.01 0.00 -1.00
outer loop
vertex 1.35 -4.79 0.11
vertex 18.74 3.81 0.23
vertex 16.62 -11.67 0.18
endloop
endfacet
facet normal 0.03 1.00 0.04
outer loop
vertex 8.64 9.52 4.44
vertex 12.94 9.56 0.15
vertex 8.79 9.68 0.57
endloop
endfacet
facet normal 0.61 0.54 -0.58
outer loop
vertex 6.17 9.88 29.54
vertex 9.42 11.73 34.65
vertex 9.34 6.54 29.76
endloop
endfacet
facet normal 0.46 0.47 -0.75
outer loop
vertex 5.72 14.33 66.35
vertex 14.22 8.62 67.90
vertex 5.10 8.89 62.54
endloop
endfacet
facet normal 0.78 0.62 -0.03
outer loop
vertex 9.34 6.54 29.76
vertex 11.73 3.63 31.66
vertex 10.41 5.14 28.48
endloop
endfacet
facet normal 0.02 0.00 -1.00
outer loop
vertex 4.81 7.61 0.01
vertex 15.98 8.19 0.20
vertex 18.74 3.81 0.23
endloop
endfacet
facet normal 0.48 -0.42 -0.77
outer loop
vertex 8.71 -4.02 62.58
vertex 14.47 -7.07 67.83
vertex 8.91 -13.34 67.77
endloop
endfacet
facet normal 0.37 0.91 -0.21
outer loop
vertex 3.62 20.17 77.07
vertex 11.03 17.19 77.10
vertex 10.93 16.12 72.25
endloop
endfacet
facet normal 0.16 0.98 0.10
outer loop
vertex 6.45 6.00 26.34
vertex 10.41 5.14 28.48
vertex 12.72 6.52 11.74
endloop
endfacet
facet normal 0.48 -0.42 -0.77
outer loop
vertex 8.71 -4.02 62.58
vertex 8.91 -13.34 67.77
vertex 5.18 -8.44 62.81
endloop
endfacet
facet normal -0.08 0.40 -0.91
outer loop
vertex 8.79 9.68 0.57
vertex 12.94 9.56 0.15
vertex 4.81 7.61 0.01
endloop
endfacet
facet normal 0.45 0.66 -0.60
outer loop
vertex 10.93 16.12 72.25
vertex 13.55 12.96 70.78
vertex 5.72 14.33 66.35
endloop
endfacet
facet normal 0.71 0.55 0.45
outer loop
vertex 7.52 13.06 57.90
vertex 12.49 5.31 59.51
vertex 8.93 13.86 54.71
endloop
endfacet
facet normal 0.23 0.86 -0.45
outer loop
vertex 9.14 13.41 37.70
vertex 9.42 11.73 34.65
vertex 6.17 9.88 29.54
endloop
endfacet
facet normal -0.22 0.85 0.47
outer loop
vertex 7.32 7.15 8.11
vertex 12.72 6.52 11.74
vertex 8.64 9.52 4.44
endloop
endfacet
facet normal 0.07 1.00 0.07
outer loop
vertex 7.32 7.15 8.11
vertex 6.45 6.00 26.34
vertex 12.72 6.52 11.74
endloop
endfacet
facet normal 0.43 0.77 -0.48
outer loop
vertex 9.34 6.54 29.76
vertex 10.41 5.14 28.48
vertex 6.45 6.00 26.34
endloop
endfacet
facet normal 0.37 0.93 0.07
outer loop
vertex 11.40 16.58 83.07
vertex 11.03 17.19 77.10
vertex 3.62 20.17 77.07
endloop
endfacet
facet normal 0.25 0.21 0.94
outer loop
vertex 5.10 8.89 62.54
vertex 8.79 4.45 62.54
vertex 8.00 5.87 62.43
endloop
endfacet
facet normal 0.63 0.40 0.66
outer loop
vertex 8.00 5.87 62.43
vertex 8.79 4.45 62.54
vertex 8.51 5.03 62.46
endloop
endfacet
facet normal 0.33 0.82 -0.47
outer loop
vertex 6.05 15.65 39.41
vertex 9.14 13.41 37.70
vertex 6.17 9.88 29.54
endloop
endfacet
facet normal 0.52 0.75 0.42
outer loop
vertex 7.52 13.06 57.90
vertex 8.93 13.86 54.71
vertex 6.61 14.70 56.07
endloop
endfacet
facet normal 0.36 0.76 -0.54
outer loop
vertex 3.91 18.32 70.74
vertex 10.93 16.12 72.25
vertex 5.72 14.33 66.35
endloop
endfacet
facet normal 0.45 0.87 0.19
outer loop
vertex 3.58 16.93 53.18
vertex 8.93 13.86 54.71
vertex 9.98 14.42 49.55
endloop
endfacet
facet normal 0.44 0.87 0.21
outer loop
vertex 6.61 14.70 56.07
vertex 8.93 13.86 54.71
vertex 3.58 16.93 53.18
endloop
endfacet
facet normal -0.46 0.89 0.02
outer loop
vertex 8.64 9.52 4.44
vertex 8.79 9.68 0.57
vertex 4.81 7.61 0.01
endloop
endfacet
facet normal 0.35 0.93 0.10
outer loop
vertex 3.84 19.07 86.31
vertex 11.40 16.58 83.07
vertex 3.62 20.17 77.07
endloop
endfacet
facet normal 0.32 0.75 0.57
outer loop
vertex 1.24 17.51 90.53
vertex 10.53 13.41 90.66
vertex 9.16 16.61 87.23
endloop
endfacet
facet normal 0.16 0.63 -0.76
outer loop
vertex 6.17 9.88 29.54
vertex 6.45 6.00 26.34
vertex 5.64 8.22 28.03
endloop
endfacet
facet normal -0.47 0.81 0.35
outer loop
vertex 7.32 7.15 8.11
vertex 8.64 9.52 4.44
vertex 3.74 6.63 4.57
endloop
endfacet
facet normal -0.31 0.95 0.04
outer loop
vertex 4.26 5.30 25.65
vertex 6.45 6.00 26.34
vertex 7.32 7.15 8.11
endloop
endfacet
facet normal 0.39 -0.51 -0.76
outer loop
vertex 4.25 -8.01 27.88
vertex 9.13 -4.19 27.78
vertex 7.41 -7.74 29.29
endloop
endfacet
facet normal 0.38 0.90 0.20
outer loop
vertex 9.16 16.61 87.23
vertex 11.40 16.58 83.07
vertex 3.84 19.07 86.31
endloop
endfacet
facet normal 0.35 0.93 -0.02
outer loop
vertex 9.98 14.42 49.55
vertex 6.05 15.65 39.41
vertex 3.58 16.93 53.18
endloop
endfacet
facet normal 0.41 0.77 0.49
outer loop
vertex 7.52 13.06 57.90
vertex 6.61 14.70 56.07
vertex 4.47 14.69 57.92
endloop
endfacet
facet normal 0.34 0.91 -0.25
outer loop
vertex 3.62 20.17 77.07
vertex 10.93 16.12 72.25
vertex 3.91 18.32 70.74
endloop
endfacet
facet normal -0.50 0.86 0.07
outer loop
vertex 3.74 6.63 4.57
vertex 8.64 9.52 4.44
vertex 4.81 7.61 0.01
endloop
endfacet
facet normal -0.62 0.78 -0.03
outer loop
vertex 4.26 5.30 25.65
vertex 7.32 7.15 8.11
vertex 4.46 4.88 8.05
endloop
endfacet
facet normal 0.87 0.46 0.14
outer loop
vertex 5.28 6.14 98.93
vertex 7.22 2.42 99.14
vertex 5.89 5.28 98.02
endloop
endfacet
facet normal 0.30 0.82 0.49
outer loop
vertex 1.24 17.51 90.53
vertex 9.16 16.61 87.23
vertex 3.84 19.07 86.31
endloop
endfacet
facet normal 0.30 0.88 0.36
outer loop
vertex 4.47 14.69 57.92
vertex 6.61 14.70 56.07
vertex 3.58 16.93 53.18
endloop
endfacet
facet normal 0.34 0.57 -0.75
outer loop
vertex 3.30 9.18 27.69
vertex 6.17 9.88 29.54
vertex 5.64 8.22 28.03
endloop
endfacet
facet normal 0.01 -0.01 -1.00
outer loop
vertex 4.81 7.61 0.01
vertex 18.74 3.81 0.23
vertex 1.35 -4.79 0.11
endloop
endfacet
facet normal -0.56 0.69 0.46
outer loop
vertex 7.32 7.15 8.11
vertex 3.74 6.63 4.57
vertex 4.46 4.88 8.05
endloop
endfacet
facet normal 0.19 -0.57 -0.80
outer loop
vertex 1.41 -9.92 62.96
vertex 5.18 -8.44 62.81
vertex 2.12 -14.63 66.51
endloop
endfacet
facet normal 0.23 0.54 -0.81
outer loop
vertex 2.02 10.41 62.69
vertex 5.72 14.33 66.35
vertex 5.10 8.89 62.54
endloop
endfacet
facet normal 0.05 0.62 -0.79
outer loop
vertex 5.64 8.22 28.03
vertex 6.45 6.00 26.34
vertex 4.26 5.30 25.65
endloop
endfacet
facet normal 0.02 0.96 -0.28
outer loop
vertex 3.62 20.17 77.07
vertex 3.91 18.32 70.74
vertex -4.89 19.79 75.21
endloop
endfacet
facet normal -0.64 0.77 0.02
outer loop
vertex 3.74 6.63 4.57
vertex 4.81 7.61 0.01
vertex 3.75 6.74 0.41
endloop
endfacet
facet normal 0.23 0.78 -0.59
outer loop
vertex -1.73 7.66 98.23
vertex 5.28 6.14 98.93
vertex 5.89 5.28 98.02
endloop
endfacet
facet normal -0.55 0.31 -0.78
outer loop
vertex 3.75 6.74 0.41
vertex 4.81 7.61 0.01
vertex 1.72 2.35 0.11
endloop
endfacet
facet normal -0.90 0.44 -0.02
outer loop
vertex 4.26 5.30 25.65
vertex 4.46 4.88 8.05
vertex 3.05 2.00 8.46
endloop
endfacet
facet normal -0.94 -0.33 -0.04
outer loop
vertex 3.98 -2.59 25.51
vertex 3.05 2.00 8.46
vertex 5.03 -3.78 9.66
endloop
endfacet
facet normal 0.41 0.79 -0.46
outer loop
vertex 6.05 15.65 39.41
vertex 6.17 9.88 29.54
vertex 1.81 14.84 34.24
endloop
endfacet
facet normal -0.80 0.45 0.39
outer loop
vertex 3.05 2.00 8.46
vertex 4.46 4.88 8.05
vertex 3.74 6.63 4.57
endloop
endfacet
facet normal -0.94 0.33 0.00
outer loop
vertex 4.26 5.30 25.65
vertex 3.05 2.00 8.46
vertex 2.61 0.61 25.39
endloop
endfacet
facet normal 0.13 0.99 0.11
outer loop
vertex 3.84 19.07 86.31
vertex 3.62 20.17 77.07
vertex -0.50 19.72 85.66
endloop
endfacet
facet normal -0.04 0.90 0.43
outer loop
vertex 4.47 14.69 57.92
vertex 3.58 16.93 53.18
vertex -2.31 17.73 51.04
endloop
endfacet
facet normal -0.91 0.42 0.01
outer loop
vertex 3.74 6.63 4.57
vertex 3.75 6.74 0.41
vertex 1.72 2.35 0.11
endloop
endfacet
facet normal -0.82 0.44 0.37
outer loop
vertex 3.05 2.00 8.46
vertex 3.74 6.63 4.57
vertex 1.75 2.91 4.54
endloop
endfacet
facet normal -0.92 -0.39 -0.06
outer loop
vertex 3.98 -2.59 25.51
vertex 2.61 0.61 25.39
vertex 3.05 2.00 8.46
endloop
endfacet
facet normal -0.03 0.00 -1.00
outer loop
vertex 1.72 2.35 0.11
vertex 4.81 7.61 0.01
vertex 1.35 -4.79 0.11
endloop
endfacet
facet normal 0.09 0.81 -0.59
outer loop
vertex -1.30 16.56 67.53
vertex 3.91 18.32 70.74
vertex 1.37 15.37 66.30
endloop
endfacet
facet normal 0.22 0.97 -0.05
outer loop
vertex -2.37 17.86 45.38
vertex 3.58 16.93 53.18
vertex 6.05 15.65 39.41
endloop
endfacet
facet normal 0.22 0.77 -0.60
outer loop
vertex 1.81 14.84 34.24
vertex 6.17 9.88 29.54
vertex -0.41 11.27 28.85
endloop
endfacet
facet normal 0.22 0.75 -0.63
outer loop
vertex -0.41 11.27 28.85
vertex 6.17 9.88 29.54
vertex 3.30 9.18 27.69
endloop
endfacet
facet normal -0.90 -0.34 0.29
outer loop
vertex 3.08 -6.57 8.03
vertex 1.18 -4.54 4.53
vertex 3.13 -9.26 5.00
endloop
endfacet
facet normal -0.92 -0.38 0.00
outer loop
vertex 3.13 -9.26 5.00
vertex 1.18 -4.54 4.53
vertex 3.71 -10.68 0.19
endloop
endfacet
facet normal 0.13 -0.60 -0.79
outer loop
vertex 4.54 -16.54 90.43
vertex 5.49 -18.55 92.12
vertex -0.42 -17.31 90.18
endloop
endfacet
facet normal 0.65 0.62 -0.44
outer loop
vertex 1.56 -18.21 47.79
vertex 2.77 -19.64 47.53
vertex 2.32 -19.76 46.71
endloop
endfacet
facet normal 0.09 0.97 -0.23
outer loop
vertex -2.37 17.86 45.38
vertex 6.05 15.65 39.41
vertex 1.81 14.84 34.24
endloop
endfacet
facet normal 0.15 0.59 -0.79
outer loop
vertex 1.37 15.37 66.30
vertex 5.72 14.33 66.35
vertex 2.02 10.41 62.69
endloop
endfacet
facet normal -0.88 0.47 -0.05
outer loop
vertex 3.74 6.63 4.57
vertex 1.72 2.35 0.11
vertex 1.75 2.91 4.54
endloop
endfacet
facet normal -0.94 0.07 0.33
outer loop
vertex 3.05 2.00 8.46
vertex 1.75 2.91 4.54
vertex 1.18 -4.54 4.53
endloop
endfacet
facet normal -0.88 -0.03 0.46
outer loop
vertex 3.08 -6.57 8.03
vertex 3.05 2.00 8.46
vertex 1.18 -4.54 4.53
endloop
endfacet
facet normal 0.04 -0.78 -0.62
outer loop
vertex -0.42 -17.31 90.18
vertex 5.49 -18.55 92.12
vertex -5.05 -19.03 92.04
endloop
endfacet
facet normal -0.05 1.00 0.03
outer loop
vertex -0.50 19.72 85.66
vertex 3.62 20.17 77.07
vertex -4.89 19.79 75.21
endloop
endfacet
facet normal 0.08 0.92 0.39
outer loop
vertex 1.24 17.51 90.53
vertex 3.84 19.07 86.31
vertex -0.50 19.72 85.66
endloop
endfacet
facet normal -0.93 -0.37 -0.01
outer loop
vertex 1.18 -4.54 4.53
vertex 1.35 -4.79 0.11
vertex 3.71 -10.68 0.19
endloop
endfacet
facet normal 0.18 0.36 -0.92
outer loop
vertex 1.59 -16.58 51.07
vertex 2.07 -16.61 51.15
vertex 1.83 -16.79 51.03
endloop
endfacet
facet normal 0.16 0.62 -0.77
outer loop
vertex 0.85 -18.52 47.39
vertex 1.56 -18.21 47.79
vertex 2.32 -19.76 46.71
endloop
endfacet
facet normal -0.76 -0.59 -0.26
outer loop
vertex 0.75 -18.84 51.61
vertex 1.56 -18.21 47.79
vertex 2.77 -19.64 47.53
endloop
endfacet
facet normal 0.21 0.64 -0.74
outer loop
vertex 0.45 7.94 99.10
vertex 5.28 6.14 98.93
vertex -1.73 7.66 98.23
endloop
endfacet
facet normal -0.67 -0.72 -0.15
outer loop
vertex 1.53 -16.71 51.99
vertex 1.59 -16.58 51.07
vertex 1.83 -16.79 51.03
endloop
endfacet
facet normal -0.94 0.34 0.01
outer loop
vertex 1.55 -16.68 52.71
vertex 1.53 -16.71 51.99
vertex 0.75 -18.84 51.61
endloop
endfacet
facet normal -0.87 0.38 -0.31
outer loop
vertex 0.75 -18.84 51.61
vertex 1.53 -16.71 51.99
vertex 1.83 -16.79 51.03
endloop
endfacet
facet normal -0.05 0.91 -0.41
outer loop
vertex -4.89 19.79 75.21
vertex 3.91 18.32 70.74
vertex -1.30 16.56 67.53
endloop
endfacet
facet normal -0.07 0.84 -0.53
outer loop
vertex -4.81 14.51 34.56
vertex 1.81 14.84 34.24
vertex -0.41 11.27 28.85
endloop
endfacet
facet normal -1.00 0.05 0.00
outer loop
vertex 1.75 2.91 4.54
vertex 1.72 2.35 0.11
vertex 1.35 -4.79 0.11
endloop
endfacet
facet normal -1.00 0.08 -0.04
outer loop
vertex 1.18 -4.54 4.53
vertex 1.75 2.91 4.54
vertex 1.35 -4.79 0.11
endloop
endfacet
facet normal -0.16 -0.61 -0.78
outer loop
vertex -7.43 -7.32 62.69
vertex 1.41 -9.92 62.96
vertex 2.12 -14.63 66.51
endloop
endfacet
facet normal -0.05 -1.00 0.04
outer loop
vertex 1.55 -16.68 52.71
vertex -2.34 -16.42 54.14
vertex 1.53 -16.71 51.99
endloop
endfacet
facet normal 0.13 0.99 0.02
outer loop
vertex 3.58 16.93 53.18
vertex -2.37 17.86 45.38
vertex -2.31 17.73 51.04
endloop
endfacet
facet normal -0.02 0.59 -0.81
outer loop
vertex -3.30 10.28 62.69
vertex 1.37 15.37 66.30
vertex 2.02 10.41 62.69
endloop
endfacet
facet normal 0.32 0.50 -0.80
outer loop
vertex 3.30 9.18 27.69
vertex 5.64 8.22 28.03
vertex 4.26 5.30 25.65
endloop
endfacet
facet normal -0.89 0.44 -0.12
outer loop
vertex 0.75 -18.84 51.61
vertex 1.83 -16.79 51.03
vertex 1.56 -18.21 47.79
endloop
endfacet
facet normal -0.14 0.88 0.45
outer loop
vertex -2.27 16.05 92.35
vertex 1.24 17.51 90.53
vertex -0.50 19.72 85.66
endloop
endfacet
facet normal 0.12 0.95 0.30
outer loop
vertex -2.04 15.54 57.89
vertex 4.47 14.69 57.92
vertex -2.31 17.73 51.04
endloop
endfacet
facet normal -0.02 0.46 -0.89
outer loop
vertex 0.85 -18.52 47.39
vertex 2.32 -19.76 46.71
vertex -2.38 -19.98 46.68
endloop
endfacet
facet normal 0.08 -1.00 0.00
outer loop
vertex -2.60 -18.49 72.85
vertex 9.15 -17.53 80.47
vertex -6.10 -18.81 79.30
endloop
endfacet
facet normal -0.05 0.92 0.39
outer loop
vertex -2.38 -19.98 46.68
vertex 2.32 -19.76 46.71
vertex -1.20 -19.75 46.28
endloop
endfacet
facet normal 0.12 0.26 -0.96
outer loop
vertex -1.20 -19.75 46.28
vertex 2.32 -19.76 46.71
vertex -0.63 -20.17 46.23
endloop
endfacet
facet normal -0.18 0.73 -0.66
outer loop
vertex -2.50 -18.07 48.82
vertex 0.85 -18.52 47.39
vertex -2.38 -19.98 46.68
endloop
endfacet
facet normal -0.06 0.96 -0.28
outer loop
vertex -2.37 17.86 45.38
vertex 1.81 14.84 34.24
vertex -4.81 14.51 34.56
endloop
endfacet
facet normal -0.10 0.99 -0.06
outer loop
vertex -2.98 7.58 98.98
vertex 0.45 7.94 99.10
vertex -1.73 7.66 98.23
endloop
endfacet
facet normal 0.02 -0.03 -1.00
outer loop
vertex -4.70 -2.57 25.36
vertex 2.61 0.61 25.39
vertex 3.98 -2.59 25.51
endloop
endfacet
facet normal 0.01 0.50 -0.87
outer loop
vertex -0.41 11.27 28.85
vertex 3.30 9.18 27.69
vertex -3.59 9.38 27.73
endloop
endfacet
facet normal 0.01 0.43 -0.90
outer loop
vertex -3.59 9.38 27.73
vertex 3.30 9.18 27.69
vertex -4.89 5.24 25.72
endloop
endfacet
facet normal -0.01 0.46 -0.89
outer loop
vertex -4.89 5.24 25.72
vertex 3.30 9.18 27.69
vertex 4.26 5.30 25.65
endloop
endfacet
facet normal -0.01 0.11 -0.99
outer loop
vertex -4.89 5.24 25.72
vertex 4.26 5.30 25.65
vertex -3.25 2.37 25.40
endloop
endfacet
facet normal 0.28 -0.92 0.26
outer loop
vertex -0.44 -14.78 57.91
vertex -1.62 -15.60 56.27
vertex -2.34 -16.42 54.14
endloop
endfacet
facet normal 0.01 0.05 -1.00
outer loop
vertex 4.26 5.30 25.65
vertex 2.61 0.61 25.39
vertex -3.25 2.37 25.40
endloop
endfacet
facet normal 0.00 0.01 -1.00
outer loop
vertex -3.25 2.37 25.40
vertex 2.61 0.61 25.39
vertex -4.70 -2.57 25.36
endloop
endfacet
facet normal -0.27 -0.26 -0.93
outer loop
vertex -2.38 -19.98 46.68
vertex -1.20 -19.75 46.28
vertex -0.63 -20.17 46.23
endloop
endfacet
facet normal -0.09 0.76 -0.64
outer loop
vertex -2.58 -16.92 50.22
vertex -1.98 -16.83 50.25
vertex -2.45 -17.49 49.52
endloop
endfacet
facet normal -0.13 0.77 -0.62
outer loop
vertex -2.45 -17.49 49.52
vertex -1.98 -16.83 50.25
vertex -2.50 -18.07 48.82
endloop
endfacet
facet normal -0.03 -0.33 -0.94
outer loop
vertex -6.18 -3.24 26.07
vertex 3.98 -2.59 25.51
vertex -3.63 -8.61 27.84
endloop
endfacet
facet normal -0.80 0.60 0.01
outer loop
vertex -2.83 -17.27 50.32
vertex -2.29 -16.60 52.89
vertex -2.58 -16.92 50.22
endloop
endfacet
facet normal -0.77 0.42 -0.49
outer loop
vertex -2.83 -17.27 50.32
vertex -2.58 -16.92 50.22
vertex -2.45 -17.49 49.52
endloop
endfacet
facet normal 0.10 0.97 -0.22
outer loop
vertex -2.83 -17.27 50.32
vertex -2.45 -17.49 49.52
vertex -2.78 -17.54 49.15
endloop
endfacet
facet normal -0.93 -0.27 0.27
outer loop
vertex -1.89 -18.33 52.52
vertex -2.29 -16.60 52.89
vertex -2.83 -17.27 50.32
endloop
endfacet
facet normal -0.63 0.14 -0.77
outer loop
vertex -2.78 -17.54 49.15
vertex -2.50 -18.07 48.82
vertex -2.98 -17.87 49.25
endloop
endfacet
facet normal -0.29 0.71 -0.65
outer loop
vertex -2.98 -17.87 49.25
vertex -2.50 -18.07 48.82
vertex -2.38 -19.98 46.68
endloop
endfacet
facet normal -0.12 0.88 0.45
outer loop
vertex -6.89 17.20 88.92
vertex -2.27 16.05 92.35
vertex -0.50 19.72 85.66
endloop
endfacet
facet normal -0.87 0.47 -0.15
outer loop
vertex -2.83 -17.27 50.32
vertex -2.78 -17.54 49.15
vertex -2.98 -17.87 49.25
endloop
endfacet
facet normal -0.93 -0.07 0.36
outer loop
vertex -1.89 -18.33 52.52
vertex -2.83 -17.27 50.32
vertex -2.93 -19.65 49.60
endloop
endfacet
facet normal -0.64 0.51 -0.57
outer loop
vertex -2.98 -17.87 49.25
vertex -2.38 -19.98 46.68
vertex -3.00 -19.92 47.43
endloop
endfacet
facet normal -0.11 0.90 -0.43
outer loop
vertex -4.89 19.79 75.21
vertex -1.30 16.56 67.53
vertex -6.98 16.73 69.35
endloop
endfacet
facet normal -0.33 0.67 0.67
outer loop
vertex -2.15 14.69 93.77
vertex -2.27 16.05 92.35
vertex -6.89 17.20 88.92
endloop
endfacet
facet normal 0.01 -0.74 -0.68
outer loop
vertex -4.70 -2.57 25.36
vertex 3.98 -2.59 25.51
vertex -6.18 -3.24 26.07
endloop
endfacet
facet normal -0.20 -0.42 -0.88
outer loop
vertex -6.55 -15.83 90.85
vertex -0.42 -17.31 90.18
vertex -5.05 -19.03 92.04
endloop
endfacet
facet normal -0.99 0.00 0.13
outer loop
vertex -2.83 -17.27 50.32
vertex -2.98 -17.87 49.25
vertex -2.93 -19.65 49.60
endloop
endfacet
facet normal -1.00 -0.02 0.03
outer loop
vertex -2.93 -19.65 49.60
vertex -2.98 -17.87 49.25
vertex -3.00 -19.92 47.43
endloop
endfacet
facet normal -0.15 0.83 -0.54
outer loop
vertex -6.98 16.73 69.35
vertex -1.30 16.56 67.53
vertex -5.65 15.83 67.62
endloop
endfacet
facet normal -0.11 0.58 -0.81
outer loop
vertex -1.30 16.56 67.53
vertex 1.37 15.37 66.30
vertex -5.65 15.83 67.62
endloop
endfacet
facet normal -0.30 0.71 -0.63
outer loop
vertex -4.81 14.51 34.56
vertex -0.41 11.27 28.85
vertex -8.47 12.84 34.39
endloop
endfacet
facet normal -0.31 0.85 -0.42
outer loop
vertex -4.39 7.10 99.05
vertex -2.98 7.58 98.98
vertex -1.73 7.66 98.23
endloop
endfacet
facet normal -0.08 1.00 0.04
outer loop
vertex -0.50 19.72 85.66
vertex -4.89 19.79 75.21
vertex -6.85 19.38 81.09
endloop
endfacet
facet normal -0.10 0.64 -0.77
outer loop
vertex 1.37 15.37 66.30
vertex -3.30 10.28 62.69
vertex -5.65 15.83 67.62
endloop
endfacet
facet normal -0.25 0.77 -0.58
outer loop
vertex -8.47 12.84 34.39
vertex -0.41 11.27 28.85
vertex -3.59 9.38 27.73
endloop
endfacet
facet normal -0.34 0.74 -0.59
outer loop
vertex -4.39 7.10 99.05
vertex -1.73 7.66 98.23
vertex -6.39 5.33 97.97
endloop
endfacet
facet normal -0.11 -0.74 -0.66
outer loop
vertex -3.63 -8.61 27.84
vertex 1.59 -10.60 29.18
vertex -5.36 -9.63 29.27
endloop
endfacet
facet normal -0.07 0.01 -1.00
outer loop
vertex -1.88 -2.03 0.05
vertex -2.47 -7.15 0.06
vertex -4.42 6.78 0.28
endloop
endfacet
facet normal -0.35 0.50 -0.79
outer loop
vertex -3.59 9.38 27.73
vertex -4.89 5.24 25.72
vertex -6.20 6.81 27.28
endloop
endfacet
facet normal -0.81 0.22 0.55
outer loop
vertex -4.81 3.04 24.13
vertex -5.04 3.35 23.67
vertex -6.74 -3.37 23.83
endloop
endfacet
facet normal -0.98 0.21 0.00
outer loop
vertex -6.18 -3.24 26.07
vertex -5.15 1.51 26.30
vertex -4.81 3.04 24.13
endloop
endfacet
facet normal -0.94 0.27 0.22
outer loop
vertex -6.18 -3.24 26.07
vertex -4.81 3.04 24.13
vertex -6.74 -3.37 23.83
endloop
endfacet
facet normal -0.19 0.52 0.83
outer loop
vertex -1.73 7.66 98.23
vertex -2.15 14.69 93.77
vertex -7.89 11.69 94.30
endloop
endfacet
facet normal 0.56 0.83 0.01
outer loop
vertex -4.41 6.70 4.63
vertex -4.42 6.78 0.28
vertex -7.92 9.13 0.18
endloop
endfacet
facet normal -0.82 -0.40 -0.41
outer loop
vertex -6.85 4.90 26.37
vertex -4.81 3.04 24.13
vertex -5.15 1.51 26.30
endloop
endfacet
facet normal -0.56 -0.27 -0.78
outer loop
vertex -6.85 4.90 26.37
vertex -5.15 1.51 26.30
vertex -7.13 0.37 28.12
endloop
endfacet
facet normal -0.72 0.19 -0.67
outer loop
vertex -7.13 0.37 28.12
vertex -5.15 1.51 26.30
vertex -6.18 -3.24 26.07
endloop
endfacet
facet normal 0.05 -0.33 -0.94
outer loop
vertex -6.55 -15.83 90.85
vertex -5.05 -19.03 92.04
vertex -6.32 -18.30 91.72
endloop
endfacet
facet normal -0.29 -0.90 -0.31
outer loop
vertex -10.22 -16.21 73.43
vertex -4.93 -16.80 70.13
vertex -2.60 -18.49 72.85
endloop
endfacet
facet normal 0.02 0.72 -0.70
outer loop
vertex -6.20 6.81 27.28
vertex -4.89 5.24 25.72
vertex -6.80 5.93 26.36
endloop
endfacet
facet normal -0.33 -0.43 -0.84
outer loop
vertex -6.18 -3.24 26.07
vertex -3.63 -8.61 27.84
vertex -7.18 -8.10 28.96
endloop
endfacet
facet normal -0.32 -0.54 -0.78
outer loop
vertex -3.63 -8.61 27.84
vertex -5.36 -9.63 29.27
vertex -7.18 -8.10 28.96
endloop
endfacet
facet normal -0.32 -0.61 -0.73
outer loop
vertex -7.43 -7.32 62.69
vertex -2.39 -15.22 67.10
vertex -9.83 -15.05 70.23
endloop
endfacet
facet normal -0.30 0.69 0.65
outer loop
vertex -7.89 11.69 94.30
vertex -2.15 14.69 93.77
vertex -6.89 17.20 88.92
endloop
endfacet
facet normal 0.34 0.94 0.00
outer loop
vertex -6.80 5.93 26.36
vertex -4.89 5.24 25.72
vertex -5.83 5.66 8.21
endloop
endfacet
facet normal -0.72 0.56 0.42
outer loop
vertex -7.83 2.62 99.10
vertex -4.39 7.10 99.05
vertex -6.39 5.33 97.97
endloop
endfacet
facet normal -0.69 -0.73 -0.03
outer loop
vertex -6.85 4.90 26.37
vertex -6.86 5.01 23.63
vertex -4.81 3.04 24.13
endloop
endfacet
facet normal -0.53 0.27 -0.80
outer loop
vertex -8.42 -4.04 27.29
vertex -6.18 -3.24 26.07
vertex -8.97 -4.39 27.54
endloop
endfacet
facet normal 0.00 0.02 -1.00
outer loop
vertex -4.42 6.78 0.28
vertex -2.47 -7.15 0.06
vertex -4.36 -10.61 0.00
endloop
endfacet
facet normal -0.31 -0.88 -0.35
outer loop
vertex -7.14 -14.79 40.16
vertex -8.85 -13.38 38.12
vertex -7.96 -12.04 34.02
endloop
endfacet
facet normal -0.46 0.77 -0.44
outer loop
vertex -11.75 4.56 29.17
vertex -6.20 6.81 27.28
vertex -6.80 5.93 26.36
endloop
endfacet
facet normal -0.18 -0.60 0.78
outer loop
vertex -0.40 -15.90 95.49
vertex -8.45 -16.09 93.50
vertex -5.05 -19.03 92.04
endloop
endfacet
facet normal -0.35 0.88 -0.33
outer loop
vertex -4.89 19.79 75.21
vertex -6.98 16.73 69.35
vertex -11.01 15.75 70.96
endloop
endfacet
facet normal -0.41 0.64 -0.65
outer loop
vertex -6.98 16.73 69.35
vertex -5.65 15.83 67.62
vertex -11.01 15.75 70.96
endloop
endfacet
facet normal -0.43 0.56 -0.71
outer loop
vertex -10.14 8.83 31.24
vertex -3.59 9.38 27.73
vertex -6.20 6.81 27.28
endloop
endfacet
facet normal -0.79 0.18 -0.58
outer loop
vertex -7.83 2.62 99.10
vertex -6.39 5.33 97.97
vertex -8.07 -1.79 98.06
endloop
endfacet
facet normal -0.54 0.30 -0.79
outer loop
vertex -8.42 -4.04 27.29
vertex -7.13 0.37 28.12
vertex -6.18 -3.24 26.07
endloop
endfacet
facet normal -0.77 -0.27 -0.58
outer loop
vertex -8.45 -16.09 93.50
vertex -6.55 -15.83 90.85
vertex -6.32 -18.30 91.72
endloop
endfacet
facet normal -0.42 0.90 -0.08
outer loop
vertex -6.85 19.38 81.09
vertex -4.89 19.79 75.21
vertex -12.91 16.08 75.22
endloop
endfacet
facet normal -0.40 0.90 -0.19
outer loop
vertex -2.37 17.86 45.38
vertex -4.81 14.51 34.56
vertex -11.90 12.77 41.17
endloop
endfacet
facet normal -0.26 -0.45 -0.85
outer loop
vertex -8.97 -4.39 27.54
vertex -6.18 -3.24 26.07
vertex -7.18 -8.10 28.96
endloop
endfacet
facet normal -0.03 0.02 -1.00
outer loop
vertex -4.42 6.78 0.28
vertex -4.36 -10.61 0.00
vertex -9.38 -13.35 0.12
endloop
endfacet
facet normal -0.41 0.88 -0.25
outer loop
vertex -12.91 16.08 75.22
vertex -4.89 19.79 75.21
vertex -11.01 15.75 70.96
endloop
endfacet
facet normal -0.40 0.92 0.03
outer loop
vertex -9.42 14.54 53.79
vertex -2.31 17.73 51.04
vertex -2.37 17.86 45.38
endloop
endfacet
facet normal -0.29 0.91 0.30
outer loop
vertex -2.04 15.54 57.89
vertex -2.31 17.73 51.04
vertex -9.42 14.54 53.79
endloop
endfacet
facet normal -0.31 0.55 -0.77
outer loop
vertex -5.65 15.83 67.62
vertex -3.30 10.28 62.69
vertex -7.62 7.47 62.40
endloop
endfacet
facet normal -0.40 0.66 -0.63
outer loop
vertex -8.47 12.84 34.39
vertex -3.59 9.38 27.73
vertex -10.14 8.83 31.24
endloop
endfacet
facet normal 0.39 0.90 0.18
outer loop
vertex -4.41 6.70 4.63
vertex -7.92 9.13 0.18
vertex -11.11 9.65 4.59
endloop
endfacet
facet normal 0.37 0.84 0.39
outer loop
vertex -5.83 5.66 8.21
vertex -4.41 6.70 4.63
vertex -11.11 9.65 4.59
endloop
endfacet
facet normal -0.99 0.02 0.15
outer loop
vertex -7.84 -1.66 99.47
vertex -7.83 2.62 99.10
vertex -8.07 -1.79 98.06
endloop
endfacet
facet normal -0.98 -0.07 0.16
outer loop
vertex -7.84 -1.66 99.47
vertex -8.07 -1.79 98.06
vertex -7.97 -4.57 97.40
endloop
endfacet
facet normal -0.95 0.21 -0.24
outer loop
vertex -7.84 -1.66 99.47
vertex -7.97 -4.57 97.40
vertex -8.74 -7.99 97.41
endloop
endfacet
facet normal -0.99 0.11 0.10
outer loop
vertex -8.63 -7.67 98.10
vertex -7.84 -1.66 99.47
vertex -8.74 -7.99 97.41
endloop
endfacet
facet normal -1.00 0.00 0.03
outer loop
vertex -8.01 -7.78 96.02
vertex -7.97 -4.57 97.40
vertex -8.05 -10.91 94.29
endloop
endfacet
facet normal -0.91 0.22 -0.36
outer loop
vertex -8.01 -7.78 96.02
vertex -8.05 -10.91 94.29
vertex -8.96 -12.01 95.91
endloop
endfacet
facet normal -0.79 -0.38 -0.48
outer loop
vertex -6.52 -18.38 92.11
vertex -8.45 -16.09 93.50
vertex -6.32 -18.30 91.72
endloop
endfacet
facet normal -0.46 0.89 -0.03
outer loop
vertex -9.42 14.54 53.79
vertex -2.37 17.86 45.38
vertex -11.90 12.77 41.17
endloop
endfacet
facet normal -0.39 0.68 0.62
outer loop
vertex -7.89 11.69 94.30
vertex -6.89 17.20 88.92
vertex -12.11 13.09 90.10
endloop
endfacet
facet normal -0.40 0.90 -0.19
outer loop
vertex -4.81 14.51 34.56
vertex -8.47 12.84 34.39
vertex -11.90 12.77 41.17
endloop
endfacet
facet normal 0.34 0.84 0.42
outer loop
vertex -10.97 7.74 8.25
vertex -5.83 5.66 8.21
vertex -11.11 9.65 4.59
endloop
endfacet
facet normal -0.24 0.25 -0.94
outer loop
vertex -7.13 0.37 28.12
vertex -8.42 -4.04 27.29
vertex -11.40 -1.67 28.68
endloop
endfacet
facet normal -0.88 0.20 -0.44
outer loop
vertex -8.74 -7.99 97.41
vertex -7.97 -4.57 97.40
vertex -8.01 -7.78 96.02
endloop
endfacet
facet normal -0.88 0.21 -0.43
outer loop
vertex -8.74 -7.99 97.41
vertex -8.01 -7.78 96.02
vertex -8.96 -12.01 95.91
endloop
endfacet
facet normal -0.88 0.05 -0.46
outer loop
vertex -8.96 -12.01 95.91
vertex -8.05 -10.91 94.29
vertex -6.55 -15.83 90.85
endloop
endfacet
facet normal -0.80 0.22 -0.55
outer loop
vertex -8.96 -12.01 95.91
vertex -6.55 -15.83 90.85
vertex -8.45 -16.09 93.50
endloop
endfacet
facet normal -0.44 -0.90 0.05
outer loop
vertex -5.37 -15.24 54.69
vertex -8.25 -13.82 54.92
vertex -5.58 -15.84 42.39
endloop
endfacet
facet normal 0.08 0.57 -0.82
outer loop
vertex -8.42 -4.04 27.29
vertex -8.75 -4.06 27.24
vertex -11.40 -1.67 28.68
endloop
endfacet
facet normal -0.99 0.00 0.15
outer loop
vertex -8.63 -7.67 98.10
vertex -8.74 -7.99 97.41
vertex -8.96 -12.01 95.91
endloop
endfacet
facet normal -0.39 -0.58 -0.72
outer loop
vertex -7.43 -7.32 62.69
vertex -9.83 -15.05 70.23
vertex -13.37 -8.49 66.89
endloop
endfacet
facet normal -0.66 -0.65 0.37
outer loop
vertex -7.95 -12.32 58.07
vertex -12.29 -7.75 58.25
vertex -8.25 -13.82 54.92
endloop
endfacet
facet normal -0.42 0.87 0.24
outer loop
vertex -6.89 17.20 88.92
vertex -6.85 19.38 81.09
vertex -13.21 15.25 84.88
endloop
endfacet
facet normal -0.42 0.63 -0.65
outer loop
vertex -11.01 15.75 70.96
vertex -5.65 15.83 67.62
vertex -13.05 11.16 67.84
endloop
endfacet
facet normal -0.38 0.78 0.49
outer loop
vertex -10.31 12.71 56.01
vertex -2.04 15.54 57.89
vertex -9.42 14.54 53.79
endloop
endfacet
facet normal -0.01 -0.06 -1.00
outer loop
vertex -12.77 9.74 0.21
vertex -7.92 9.13 0.18
vertex -4.42 6.78 0.28
endloop
endfacet
facet normal 0.38 0.75 -0.55
outer loop
vertex -11.40 -1.67 28.68
vertex -8.75 -4.06 27.24
vertex -8.91 -4.39 26.69
endloop
endfacet
facet normal -0.38 0.79 0.48
outer loop
vertex -9.91 11.76 57.90
vertex -2.04 15.54 57.89
vertex -10.31 12.71 56.01
endloop
endfacet
facet normal -0.58 0.34 -0.74
outer loop
vertex -10.14 8.83 31.24
vertex -6.20 6.81 27.28
vertex -11.02 5.99 30.63
endloop
endfacet
facet normal -0.47 0.74 -0.49
outer loop
vertex -11.02 5.99 30.63
vertex -6.20 6.81 27.28
vertex -11.75 4.56 29.17
endloop
endfacet
facet normal 0.12 0.99 -0.03
outer loop
vertex -11.11 9.65 4.59
vertex -7.92 9.13 0.18
vertex -12.77 9.74 0.21
endloop
endfacet
facet normal 0.37 0.93 0.01
outer loop
vertex -10.97 7.74 8.25
vertex -6.80 5.93 26.36
vertex -5.83 5.66 8.21
endloop
endfacet
facet normal 0.04 -0.78 -0.62
outer loop
vertex -12.76 3.29 28.01
vertex -6.85 4.90 26.37
vertex -12.19 3.09 28.30
endloop
endfacet
facet normal -0.22 -0.34 -0.92
outer loop
vertex -12.19 3.09 28.30
vertex -6.85 4.90 26.37
vertex -7.13 0.37 28.12
endloop
endfacet
facet normal -0.64 -0.56 -0.53
outer loop
vertex -13.23 -7.86 35.98
vertex -7.18 -8.10 28.96
vertex -7.96 -12.04 34.02
endloop
endfacet
facet normal -0.37 0.55 -0.75
outer loop
vertex -5.65 15.83 67.62
vertex -7.62 7.47 62.40
vertex -13.05 11.16 67.84
endloop
endfacet
facet normal -0.65 -0.52 -0.55
outer loop
vertex -13.23 -7.86 35.98
vertex -8.97 -4.39 27.54
vertex -7.18 -8.10 28.96
endloop
endfacet
facet normal -0.52 0.85 0.06
outer loop
vertex -13.21 15.25 84.88
vertex -6.85 19.38 81.09
vertex -12.91 16.08 75.22
endloop
endfacet
facet normal -0.50 0.76 0.42
outer loop
vertex -12.11 13.09 90.10
vertex -6.89 17.20 88.92
vertex -13.21 15.25 84.88
endloop
endfacet
facet normal -0.65 0.36 0.67
outer loop
vertex -9.91 11.76 57.90
vertex -13.56 8.97 55.86
vertex -7.62 7.47 62.40
endloop
endfacet
facet normal -0.57 0.30 -0.77
outer loop
vertex -13.05 11.16 67.84
vertex -7.62 7.47 62.40
vertex -10.45 1.82 62.30
endloop
endfacet
facet normal -0.09 -0.09 -0.99
outer loop
vertex -12.19 3.09 28.30
vertex -7.13 0.37 28.12
vertex -11.40 -1.67 28.68
endloop
endfacet
facet normal 0.55 0.80 -0.24
outer loop
vertex -11.55 -2.11 28.27
vertex -8.91 -4.39 26.69
vertex -10.00 -4.25 24.66
endloop
endfacet
facet normal -0.80 -0.28 -0.52
outer loop
vertex -13.23 -7.86 35.98
vertex -12.03 -3.20 31.61
vertex -8.97 -4.39 27.54
endloop
endfacet
facet normal -0.60 0.29 0.74
outer loop
vertex -14.50 4.74 57.87
vertex -10.45 1.82 62.30
vertex -7.62 7.47 62.40
endloop
endfacet
facet normal 0.70 0.71 -0.12
outer loop
vertex -11.55 -2.11 28.27
vertex -10.00 -4.25 24.66
vertex -12.01 -2.43 23.75
endloop
endfacet
facet normal -0.46 -0.88 0.12
outer loop
vertex -8.97 -4.39 27.54
vertex -11.97 -2.57 29.42
vertex -10.00 -4.25 24.66
endloop
endfacet
facet normal -0.53 -0.85 -0.03
outer loop
vertex -10.45 -16.84 82.95
vertex -12.10 -15.80 82.23
vertex -12.23 -15.52 75.67
endloop
endfacet
facet normal -0.43 0.90 -0.04
outer loop
vertex -12.86 12.63 48.33
vertex -9.42 14.54 53.79
vertex -11.90 12.77 41.17
endloop
endfacet
facet normal -0.15 0.83 0.53
outer loop
vertex -14.37 6.39 8.79
vertex -11.11 9.65 4.59
vertex -14.73 9.02 4.55
endloop
endfacet
facet normal -0.27 0.85 0.45
outer loop
vertex -14.37 6.39 8.79
vertex -10.97 7.74 8.25
vertex -11.11 9.65 4.59
endloop
endfacet
facet normal -0.19 0.97 0.14
outer loop
vertex -11.75 4.56 29.17
vertex -6.80 5.93 26.36
vertex -10.97 7.74 8.25
endloop
endfacet
facet normal 0.62 0.40 -0.67
outer loop
vertex -12.80 -0.60 28.02
vertex -11.40 -1.67 28.68
vertex -11.55 -2.11 28.27
endloop
endfacet
facet normal -0.61 0.68 0.41
outer loop
vertex -15.33 11.84 87.33
vertex -12.11 13.09 90.10
vertex -13.21 15.25 84.88
endloop
endfacet
facet normal -0.52 0.63 -0.58
outer loop
vertex -14.02 13.14 70.83
vertex -11.01 15.75 70.96
vertex -13.05 11.16 67.84
endloop
endfacet
facet normal -0.17 0.98 0.08
outer loop
vertex -14.73 9.02 4.55
vertex -11.11 9.65 4.59
vertex -12.77 9.74 0.21
endloop
endfacet
facet normal -0.01 -0.04 -1.00
outer loop
vertex -12.77 9.74 0.21
vertex -4.42 6.78 0.28
vertex -16.43 8.45 0.29
endloop
endfacet
facet normal -0.35 0.93 0.13
outer loop
vertex -14.37 6.39 8.79
vertex -11.75 4.56 29.17
vertex -10.97 7.74 8.25
endloop
endfacet
facet normal -0.60 0.18 0.78
outer loop
vertex -10.45 1.82 62.30
vertex -13.64 1.69 59.87
vertex -14.53 -1.69 59.96
endloop
endfacet
facet normal -0.94 -0.31 -0.11
outer loop
vertex -11.97 -2.57 29.42
vertex -12.03 -3.20 31.61
vertex -13.14 0.36 31.23
endloop
endfacet
facet normal -0.54 -0.21 -0.82
outer loop
vertex -10.45 1.82 62.30
vertex -7.43 -7.32 62.69
vertex -13.37 -8.49 66.89
endloop
endfacet
facet normal -0.73 0.64 0.24
outer loop
vertex -10.31 12.71 56.01
vertex -9.42 14.54 53.79
vertex -12.86 12.63 48.33
endloop
endfacet
facet normal -0.67 0.67 -0.33
outer loop
vertex -11.90 12.77 41.17
vertex -8.47 12.84 34.39
vertex -13.73 9.33 37.92
endloop
endfacet
facet normal -0.84 0.24 -0.48
outer loop
vertex -16.11 2.47 37.71
vertex -11.02 5.99 30.63
vertex -12.77 2.80 32.07
endloop
endfacet
facet normal -0.88 0.47 -0.03
outer loop
vertex -12.77 2.80 32.07
vertex -11.02 5.99 30.63
vertex -11.75 4.56 29.17
endloop
endfacet
facet normal 0.44 0.00 -0.90
outer loop
vertex -12.76 3.29 28.01
vertex -12.19 3.09 28.30
vertex -11.40 -1.67 28.68
endloop
endfacet
facet normal 0.42 -0.01 -0.91
outer loop
vertex -12.76 3.29 28.01
vertex -11.40 -1.67 28.68
vertex -12.80 -0.60 28.02
endloop
endfacet
facet normal -0.89 -0.18 -0.43
outer loop
vertex -13.23 -7.86 35.98
vertex -16.11 2.47 37.71
vertex -12.03 -3.20 31.61
endloop
endfacet
facet normal -0.73 0.63 0.27
outer loop
vertex -13.56 8.97 55.86
vertex -10.31 12.71 56.01
vertex -14.69 9.91 50.51
endloop
endfacet
facet normal -0.68 0.61 -0.41
outer loop
vertex -13.73 9.33 37.92
vertex -8.47 12.84 34.39
vertex -10.14 8.83 31.24
endloop
endfacet
facet normal -0.83 0.35 -0.42
outer loop
vertex -16.11 2.47 37.71
vertex -10.14 8.83 31.24
vertex -11.02 5.99 30.63
endloop
endfacet
facet normal -0.86 0.48 0.15
outer loop
vertex -14.03 4.90 15.33
vertex -11.75 4.56 29.17
vertex -14.37 6.39 8.79
endloop
endfacet
facet normal -0.58 0.33 0.75
outer loop
vertex -10.45 1.82 62.30
vertex -14.50 4.74 57.87
vertex -13.64 1.69 59.87
endloop
endfacet
facet normal -0.95 0.22 -0.21
outer loop
vertex -12.77 2.80 32.07
vertex -11.75 4.56 29.17
vertex -13.14 0.36 31.23
endloop
endfacet
facet normal -0.66 0.52 0.54
outer loop
vertex -15.12 8.50 90.79
vertex -12.11 13.09 90.10
vertex -15.33 11.84 87.33
endloop
endfacet
facet normal -0.69 -0.14 0.71
outer loop
vertex -12.03 -3.20 31.61
vertex -12.77 2.80 32.07
vertex -13.14 0.36 31.23
endloop
endfacet
facet normal -0.86 -0.07 -0.51
outer loop
vertex -16.11 2.47 37.71
vertex -12.77 2.80 32.07
vertex -12.03 -3.20 31.61
endloop
endfacet
facet normal -0.61 0.72 -0.33
outer loop
vertex -12.91 16.08 75.22
vertex -11.01 15.75 70.96
vertex -14.02 13.14 70.83
endloop
endfacet
facet normal -0.77 0.39 -0.51
outer loop
vertex -19.21 6.95 73.84
vertex -14.02 13.14 70.83
vertex -13.05 11.16 67.84
endloop
endfacet
facet normal -0.71 0.66 0.23
outer loop
vertex -14.69 9.91 50.51
vertex -10.31 12.71 56.01
vertex -12.86 12.63 48.33
endloop
endfacet
facet normal -0.86 0.49 -0.11
outer loop
vertex -14.69 9.91 50.51
vertex -12.86 12.63 48.33
vertex -11.90 12.77 41.17
endloop
endfacet
facet normal -0.67 -0.72 0.15
outer loop
vertex -12.89 -2.83 21.72
vertex -16.08 -2.33 9.99
vertex -10.52 -5.32 20.44
endloop
endfacet
facet normal 0.00 0.01 -1.00
outer loop
vertex -19.07 -9.21 0.19
vertex -4.42 6.78 0.28
vertex -9.38 -13.35 0.12
endloop
endfacet
facet normal -0.84 0.53 -0.09
outer loop
vertex -14.69 9.91 50.51
vertex -11.90 12.77 41.17
vertex -13.73 9.33 37.92
endloop
endfacet
facet normal -0.91 0.32 0.25
outer loop
vertex -13.56 8.97 55.86
vertex -14.69 9.91 50.51
vertex -14.50 4.74 57.87
endloop
endfacet
facet normal -0.48 0.73 0.49
outer loop
vertex -17.30 6.34 6.02
vertex -14.37 6.39 8.79
vertex -14.73 9.02 4.55
endloop
endfacet
facet normal -0.97 -0.11 0.21
outer loop
vertex -11.97 -2.57 29.42
vertex -16.70 2.03 9.70
vertex -13.92 -1.70 20.75
endloop
endfacet
facet normal -0.82 -0.49 0.31
outer loop
vertex -12.29 -7.75 58.25
vertex -15.22 -4.36 55.87
vertex -12.56 -11.44 51.73
endloop
endfacet
facet normal -0.71 0.70 0.04
outer loop
vertex -13.21 15.25 84.88
vertex -12.91 16.08 75.22
vertex -15.84 13.10 74.66
endloop
endfacet
facet normal -0.65 0.70 -0.30
outer loop
vertex -15.84 13.10 74.66
vertex -12.91 16.08 75.22
vertex -14.02 13.14 70.83
endloop
endfacet
facet normal 0.00 0.01 -1.00
outer loop
vertex -4.42 6.78 0.28
vertex -20.05 0.39 0.21
vertex -16.43 8.45 0.29
endloop
endfacet
facet normal -0.90 0.39 0.18
outer loop
vertex -13.14 0.36 31.23
vertex -11.75 4.56 29.17
vertex -16.70 2.03 9.70
endloop
endfacet
facet normal -0.85 0.50 0.15
outer loop
vertex -11.75 4.56 29.17
vertex -14.03 4.90 15.33
vertex -16.70 2.03 9.70
endloop
endfacet
facet normal -0.90 -0.43 0.11
outer loop
vertex -11.97 -2.57 29.42
vertex -13.14 0.36 31.23
vertex -16.70 2.03 9.70
endloop
endfacet
facet normal 0.00 0.00 -1.00
outer loop
vertex -20.05 0.39 0.21
vertex -4.42 6.78 0.28
vertex -19.07 -9.21 0.19
endloop
endfacet
facet normal -0.80 -0.57 0.19
outer loop
vertex -16.08 -2.33 9.99
vertex -12.89 -2.83 21.72
vertex -13.92 -1.70 20.75
endloop
endfacet
facet normal -0.82 -0.48 0.33
outer loop
vertex -12.29 -7.75 58.25
vertex -14.70 -2.97 59.17
vertex -15.22 -4.36 55.87
endloop
endfacet
facet normal -0.65 -0.59 -0.48
outer loop
vertex -13.37 -8.49 66.89
vertex -9.83 -15.05 70.23
vertex -17.70 -8.75 73.10
endloop
endfacet
facet normal -0.74 0.31 0.60
outer loop
vertex -14.36 6.90 92.53
vertex -15.12 8.50 90.79
vertex -16.37 3.81 91.66
endloop
endfacet
facet normal -0.83 0.30 -0.47
outer loop
vertex -13.73 9.33 37.92
vertex -10.14 8.83 31.24
vertex -16.11 2.47 37.71
endloop
endfacet
facet normal -0.66 -0.63 -0.42
outer loop
vertex -15.72 -12.56 75.72
vertex -17.70 -8.75 73.10
vertex -9.83 -15.05 70.23
endloop
endfacet
facet normal -0.97 -0.12 0.20
outer loop
vertex -16.70 2.03 9.70
vertex -16.08 -2.33 9.99
vertex -13.92 -1.70 20.75
endloop
endfacet
facet normal -0.89 -0.42 0.15
outer loop
vertex -15.22 -4.36 55.87
vertex -16.89 -2.78 50.33
vertex -12.56 -11.44 51.73
endloop
endfacet
facet normal -0.89 -0.41 0.21
outer loop
vertex -12.56 -11.44 51.73
vertex -16.89 -2.78 50.33
vertex -16.37 -5.98 46.30
endloop
endfacet
facet normal -0.76 -0.64 -0.11
outer loop
vertex -12.56 -11.44 51.73
vertex -16.37 -5.98 46.30
vertex -13.23 -7.86 35.98
endloop
endfacet
facet normal -0.69 0.72 0.03
outer loop
vertex -13.21 15.25 84.88
vertex -15.84 13.10 74.66
vertex -17.64 11.25 78.33
endloop
endfacet
facet normal -0.79 0.48 -0.37
outer loop
vertex -19.21 6.95 73.84
vertex -15.84 13.10 74.66
vertex -14.02 13.14 70.83
endloop
endfacet
facet normal -0.83 0.37 0.41
outer loop
vertex -15.12 8.50 90.79
vertex -15.33 11.84 87.33
vertex -18.99 2.53 88.43
endloop
endfacet
facet normal -0.79 0.31 0.52
outer loop
vertex -15.12 8.50 90.79
vertex -18.99 2.53 88.43
vertex -16.37 3.81 91.66
endloop
endfacet
facet normal -0.86 0.49 0.16
outer loop
vertex -14.03 4.90 15.33
vertex -14.37 6.39 8.79
vertex -16.70 2.03 9.70
endloop
endfacet
facet normal -0.67 -0.13 -0.73
outer loop
vertex -20.54 -1.47 72.24
vertex -10.45 1.82 62.30
vertex -13.37 -8.49 66.89
endloop
endfacet
facet normal -0.73 -0.31 0.61
outer loop
vertex -11.35 -8.86 93.74
vertex -12.38 -3.37 95.27
vertex -19.06 -1.54 88.25
endloop
endfacet
facet normal -0.76 -0.36 -0.54
outer loop
vertex -20.54 -1.47 72.24
vertex -13.37 -8.49 66.89
vertex -17.70 -8.75 73.10
endloop
endfacet
facet normal -0.75 0.17 -0.64
outer loop
vertex -13.05 11.16 67.84
vertex -10.45 1.82 62.30
vertex -19.21 6.95 73.84
endloop
endfacet
facet normal -0.91 0.34 0.26
outer loop
vertex -17.02 3.99 50.02
vertex -14.50 4.74 57.87
vertex -14.69 9.91 50.51
endloop
endfacet
facet normal 0.09 0.99 0.07
outer loop
vertex -17.53 4.98 58.45
vertex -14.50 4.74 57.87
vertex -18.83 5.38 54.74
endloop
endfacet
facet normal -0.78 0.60 0.16
outer loop
vertex -15.33 11.84 87.33
vertex -13.21 15.25 84.88
vertex -17.64 11.25 78.33
endloop
endfacet
facet normal -0.92 0.37 -0.09
outer loop
vertex -17.02 3.99 50.02
vertex -14.69 9.91 50.51
vertex -13.73 9.33 37.92
endloop
endfacet
facet normal 0.27 0.95 -0.18
outer loop
vertex -18.83 5.38 54.74
vertex -14.50 4.74 57.87
vertex -17.02 3.99 50.02
endloop
endfacet
facet normal 0.07 0.74 0.67
outer loop
vertex -17.55 3.97 59.55
vertex -15.24 3.84 59.44
vertex -17.53 4.98 58.45
endloop
endfacet
facet normal -0.94 0.33 -0.11
outer loop
vertex -17.02 3.99 50.02
vertex -13.73 9.33 37.92
vertex -16.11 2.47 37.71
endloop
endfacet
facet normal -0.72 0.13 -0.68
outer loop
vertex -20.54 -1.47 72.24
vertex -19.29 4.03 72.02
vertex -10.45 1.82 62.30
endloop
endfacet
facet normal -0.62 0.43 -0.66
outer loop
vertex -19.21 6.95 73.84
vertex -10.45 1.82 62.30
vertex -19.29 4.03 72.02
endloop
endfacet
facet normal 0.03 0.96 -0.27
outer loop
vertex -18.83 5.38 54.74
vertex -17.02 3.99 50.02
vertex -18.73 4.45 51.46
endloop
endfacet
facet normal -0.97 0.21 -0.10
outer loop
vertex -16.11 2.47 37.71
vertex -17.34 0.41 45.58
vertex -17.02 3.99 50.02
endloop
endfacet
facet normal -0.95 -0.23 -0.21
outer loop
vertex -17.34 0.41 45.58
vertex -16.11 2.47 37.71
vertex -13.23 -7.86 35.98
endloop
endfacet
facet normal -0.95 -0.26 -0.19
outer loop
vertex -17.20 -1.49 47.50
vertex -17.34 0.41 45.58
vertex -13.23 -7.86 35.98
endloop
endfacet
facet normal -0.73 -0.02 0.69
outer loop
vertex -19.06 -1.54 88.25
vertex -12.38 -3.37 95.27
vertex -18.99 2.53 88.43
endloop
endfacet
facet normal -0.96 -0.11 -0.27
outer loop
vertex -17.20 -1.49 47.50
vertex -13.23 -7.86 35.98
vertex -16.37 -5.98 46.30
endloop
endfacet
facet normal -0.98 -0.19 0.02
outer loop
vertex -16.89 -2.78 50.33
vertex -17.20 -1.49 47.50
vertex -16.37 -5.98 46.30
endloop
endfacet
facet normal -0.77 -0.64 0.01
outer loop
vertex -15.80 -11.01 86.17
vertex -19.23 -7.00 77.87
vertex -12.79 -14.66 84.76
endloop
endfacet
facet normal -0.81 -0.57 0.13
outer loop
vertex -12.79 -14.66 84.76
vertex -19.23 -7.00 77.87
vertex -15.72 -12.56 75.72
endloop
endfacet
facet normal -0.01 0.00 -1.00
outer loop
vertex -19.07 -9.21 0.19
vertex -9.38 -13.35 0.12
vertex -17.09 -11.83 0.17
endloop
endfacet
facet normal -0.77 0.62 0.16
outer loop
vertex -18.88 8.29 83.81
vertex -15.33 11.84 87.33
vertex -17.64 11.25 78.33
endloop
endfacet
facet normal -0.64 0.75 0.15
outer loop
vertex -18.00 7.02 0.73
vertex -14.73 9.02 4.55
vertex -16.43 8.45 0.29
endloop
endfacet
facet normal -0.88 -0.48 -0.04
outer loop
vertex -15.72 -12.56 75.72
vertex -19.21 -6.14 75.07
vertex -17.70 -8.75 73.10
endloop
endfacet
facet normal -0.85 0.49 -0.17
outer loop
vertex -17.64 11.25 78.33
vertex -15.84 13.10 74.66
vertex -19.21 6.95 73.84
endloop
endfacet
facet normal -0.66 0.73 0.18
outer loop
vertex -17.30 6.34 6.02
vertex -14.73 9.02 4.55
vertex -18.00 7.02 0.73
endloop
endfacet
facet normal 0.13 0.99 0.02
outer loop
vertex -19.35 3.82 29.10
vertex -17.26 3.52 30.88
vertex -16.83 3.51 28.37
endloop
endfacet
facet normal -0.10 0.96 0.28
outer loop
vertex -18.71 3.17 31.60
vertex -17.26 3.52 30.88
vertex -19.35 3.82 29.10
endloop
endfacet
facet normal 0.90 0.31 -0.32
outer loop
vertex -19.66 3.89 42.46
vertex -17.02 3.99 50.02
vertex -17.34 0.41 45.58
endloop
endfacet
facet normal -0.56 0.08 -0.82
outer loop
vertex -16.83 3.51 28.37
vertex -16.22 -2.44 27.38
vertex -18.78 -0.21 29.33
endloop
endfacet
facet normal -0.65 -0.39 0.65
outer loop
vertex -16.78 -10.65 6.36
vertex -15.10 -8.08 9.59
vertex -19.13 -6.49 6.49
endloop
endfacet
facet normal -0.87 0.49 0.06
outer loop
vertex -18.88 8.29 83.81
vertex -17.64 11.25 78.33
vertex -18.98 8.87 78.06
endloop
endfacet
facet normal -0.81 0.37 0.44
outer loop
vertex -18.99 2.53 88.43
vertex -15.33 11.84 87.33
vertex -18.88 8.29 83.81
endloop
endfacet
facet normal -0.95 0.28 0.16
outer loop
vertex -17.30 6.34 6.02
vertex -18.00 7.02 0.73
vertex -20.05 0.39 0.21
endloop
endfacet
facet normal -0.43 0.20 -0.88
outer loop
vertex -18.00 7.02 0.73
vertex -16.43 8.45 0.29
vertex -20.05 0.39 0.21
endloop
endfacet
facet normal -0.29 -0.10 -0.95
outer loop
vertex -19.35 3.82 29.10
vertex -16.83 3.51 28.37
vertex -18.78 -0.21 29.33
endloop
endfacet
facet normal -0.84 -0.15 -0.52
outer loop
vertex -19.35 3.82 29.10
vertex -18.78 -0.21 29.33
vertex -19.28 1.12 29.76
endloop
endfacet
facet normal -0.99 0.12 0.10
outer loop
vertex -18.61 -0.12 30.83
vertex -18.48 0.70 31.08
vertex -18.78 -0.21 29.33
endloop
endfacet
facet normal -0.83 -0.43 0.36
outer loop
vertex -18.48 0.70 31.08
vertex -19.28 1.12 29.76
vertex -18.78 -0.21 29.33
endloop
endfacet
facet normal -0.50 0.87 0.00
outer loop
vertex -18.61 -0.12 30.83
vertex -18.78 -0.21 29.33
vertex -19.53 -0.65 29.62
endloop
endfacet
facet normal -0.46 0.23 -0.86
outer loop
vertex -19.53 -0.65 29.62
vertex -18.78 -0.21 29.33
vertex -16.22 -2.44 27.38
endloop
endfacet
facet normal -0.91 -0.38 -0.20
outer loop
vertex -19.21 -6.14 75.07
vertex -20.54 -1.47 72.24
vertex -17.70 -8.75 73.10
endloop
endfacet
facet normal -0.84 -0.48 0.26
outer loop
vertex -16.78 -10.65 6.36
vertex -19.13 -6.49 6.49
vertex -18.27 -10.94 1.02
endloop
endfacet
facet normal -0.92 -0.36 0.15
outer loop
vertex -18.27 -10.94 1.02
vertex -19.13 -6.49 6.49
vertex -19.07 -9.21 0.19
endloop
endfacet
facet normal -0.85 0.50 -0.18
outer loop
vertex -18.98 8.87 78.06
vertex -17.64 11.25 78.33
vertex -19.21 6.95 73.84
endloop
endfacet
facet normal -0.54 0.79 0.28
outer loop
vertex -17.53 4.98 58.45
vertex -18.83 5.38 54.74
vertex -21.02 3.14 56.84
endloop
endfacet
facet normal 0.84 -0.08 -0.54
outer loop
vertex -19.28 1.12 29.76
vertex -18.48 0.70 31.08
vertex -19.53 -0.65 29.62
endloop
endfacet
facet normal -0.87 -0.47 0.14
outer loop
vertex -15.80 -11.01 86.17
vertex -19.20 -4.59 86.36
vertex -19.23 -7.00 77.87
endloop
endfacet
facet normal 0.27 0.96 0.09
outer loop
vertex -18.88 8.29 83.81
vertex -18.98 8.87 78.06
vertex -20.00 8.70 82.78
endloop
endfacet
facet normal -0.13 0.90 -0.40
outer loop
vertex -18.98 8.87 78.06
vertex -19.21 6.95 73.84
vertex -20.20 9.03 78.80
endloop
endfacet
facet normal -0.79 0.59 -0.19
outer loop
vertex -21.02 3.14 56.84
vertex -18.83 5.38 54.74
vertex -18.73 4.45 51.46
endloop
endfacet
facet normal -0.90 0.43 -0.01
outer loop
vertex -19.35 2.04 6.79
vertex -17.30 6.34 6.02
vertex -20.05 0.39 0.21
endloop
endfacet
facet normal -0.48 0.18 -0.86
outer loop
vertex -19.53 -0.65 29.62
vertex -16.22 -2.44 27.38
vertex -20.34 -2.74 29.64
endloop
endfacet
facet normal -0.80 0.00 0.61
outer loop
vertex -19.13 -6.49 6.49
vertex -16.70 2.03 9.70
vertex -20.19 -1.76 5.11
endloop
endfacet
facet normal 0.17 0.98 0.07
outer loop
vertex -20.00 8.70 82.78
vertex -18.98 8.87 78.06
vertex -20.20 9.03 78.80
endloop
endfacet
facet normal -0.10 0.88 0.47
outer loop
vertex -18.88 8.29 83.81
vertex -20.00 8.70 82.78
vertex -20.02 6.73 86.49
endloop
endfacet
facet normal 0.27 0.96 0.01
outer loop
vertex -18.73 4.45 51.46
vertex -17.02 3.99 50.02
vertex -21.37 5.31 42.77
endloop
endfacet
facet normal 0.23 -0.23 -0.95
outer loop
vertex -20.84 3.52 28.81
vertex -19.35 3.82 29.10
vertex -19.28 1.12 29.76
endloop
endfacet
facet normal -0.98 0.19 0.06
outer loop
vertex -20.19 -1.76 5.11
vertex -19.35 2.04 6.79
vertex -20.05 0.39 0.21
endloop
endfacet
facet normal -0.17 0.00 -0.99
outer loop
vertex -19.29 4.03 72.02
vertex -20.54 -1.47 72.24
vertex -20.58 2.86 72.24
endloop
endfacet
facet normal -0.73 -0.13 0.67
outer loop
vertex -16.70 2.03 9.70
vertex -19.35 2.04 6.79
vertex -20.19 -1.76 5.11
endloop
endfacet
facet normal 0.65 0.04 -0.76
outer loop
vertex -19.20 -0.81 22.66
vertex -19.19 -2.35 22.59
vertex -20.16 -2.53 21.76
endloop
endfacet
facet normal -0.25 0.88 -0.42
outer loop
vertex -20.20 9.03 78.80
vertex -19.21 6.95 73.84
vertex -20.53 6.48 73.62
endloop
endfacet
facet normal 0.95 0.31 -0.04
outer loop
vertex -19.66 3.89 42.46
vertex -20.94 6.69 33.09
vertex -20.74 6.70 37.98
endloop
endfacet
facet normal -0.05 0.53 -0.85
outer loop
vertex -20.53 6.48 73.62
vertex -19.21 6.95 73.84
vertex -19.29 4.03 72.02
endloop
endfacet
facet normal -0.75 0.64 -0.17
outer loop
vertex -21.41 1.72 53.15
vertex -21.02 3.14 56.84
vertex -18.73 4.45 51.46
endloop
endfacet
facet normal -0.99 -0.10 -0.07
outer loop
vertex -20.19 -1.76 5.11
vertex -20.05 0.39 0.21
vertex -19.07 -9.21 0.19
endloop
endfacet
facet normal -0.98 -0.20 0.08
outer loop
vertex -19.13 -6.49 6.49
vertex -20.19 -1.76 5.11
vertex -19.07 -9.21 0.19
endloop
endfacet
facet normal -0.99 0.12 0.06
outer loop
vertex -20.02 6.73 86.49
vertex -20.00 8.70 82.78
vertex -20.20 9.03 78.80
endloop
endfacet
facet normal 0.64 0.71 0.29
outer loop
vertex -21.37 5.31 42.77
vertex -19.66 3.89 42.46
vertex -20.74 6.70 37.98
endloop
endfacet
facet normal -0.44 0.33 -0.84
outer loop
vertex -20.53 6.48 73.62
vertex -19.29 4.03 72.02
vertex -20.58 2.86 72.24
endloop
endfacet
facet normal -0.51 0.76 0.41
outer loop
vertex -21.41 1.72 53.15
vertex -18.73 4.45 51.46
vertex -24.67 6.09 41.03
endloop
endfacet
facet normal 0.74 0.23 -0.63
outer loop
vertex -20.84 3.52 28.81
vertex -19.28 1.12 29.76
vertex -22.25 3.63 27.18
endloop
endfacet
facet normal -0.78 0.05 0.63
outer loop
vertex -20.03 -1.56 58.80
vertex -19.56 3.41 59.03
vertex -21.62 1.41 56.63
endloop
endfacet
facet normal 0.04 0.58 -0.81
outer loop
vertex -21.34 5.38 30.11
vertex -19.35 3.82 29.10
vertex -20.84 3.52 28.81
endloop
endfacet
facet normal 0.21 0.98 0.03
outer loop
vertex -24.67 6.09 41.03
vertex -18.73 4.45 51.46
vertex -21.37 5.31 42.77
endloop
endfacet
facet normal 0.03 1.00 -0.05
outer loop
vertex -22.88 3.81 26.88
vertex -19.29 3.54 23.82
vertex -22.07 3.56 22.34
endloop
endfacet
facet normal -0.94 0.33 -0.03
outer loop
vertex -21.62 1.41 56.63
vertex -21.02 3.14 56.84
vertex -21.41 1.72 53.15
endloop
endfacet
facet normal -0.82 0.22 0.52
outer loop
vertex -19.56 3.41 59.03
vertex -21.02 3.14 56.84
vertex -21.62 1.41 56.63
endloop
endfacet
facet normal -0.80 -0.56 0.23
outer loop
vertex -20.03 -1.56 58.80
vertex -21.54 -0.26 56.64
vertex -19.78 -3.38 55.19
endloop
endfacet
facet normal -0.98 -0.16 0.08
outer loop
vertex -20.20 -7.07 80.73
vertex -20.04 -5.86 85.22
vertex -20.72 -6.12 75.99
endloop
endfacet
facet normal -1.00 0.05 0.04
outer loop
vertex -20.02 6.73 86.49
vertex -20.20 9.03 78.80
vertex -20.53 6.48 73.62
endloop
endfacet
facet normal 0.13 0.99 0.07
outer loop
vertex -19.50 3.46 25.45
vertex -19.29 3.54 23.82
vertex -22.88 3.81 26.88
endloop
endfacet
facet normal -1.00 -0.01 0.06
outer loop
vertex -20.53 6.48 73.62
vertex -20.58 2.86 72.24
vertex -20.54 -1.47 72.24
endloop
endfacet
facet normal -1.00 0.02 0.04
outer loop
vertex -20.17 -2.21 88.21
vertex -20.02 6.73 86.49
vertex -20.72 -6.12 75.99
endloop
endfacet
facet normal -1.00 0.02 0.04
outer loop
vertex -20.72 -6.12 75.99
vertex -20.02 6.73 86.49
vertex -20.53 6.48 73.62
endloop
endfacet
facet normal 0.26 -0.04 -0.96
outer loop
vertex -22.07 3.56 22.34
vertex -19.80 1.66 23.05
vertex -22.19 1.65 22.40
endloop
endfacet
facet normal 0.69 0.07 -0.72
outer loop
vertex -22.25 3.63 27.18
vertex -19.28 1.12 29.76
vertex -22.62 1.50 26.64
endloop
endfacet
facet normal -1.00 0.08 -0.05
outer loop
vertex -21.62 1.41 56.63
vertex -21.41 1.72 53.15
vertex -21.50 0.68 53.23
endloop
endfacet
facet normal -1.00 -0.05 -0.02
outer loop
vertex -21.54 -0.26 56.64
vertex -21.62 1.41 56.63
vertex -21.50 0.68 53.23
endloop
endfacet
facet normal 0.66 -0.26 -0.71
outer loop
vertex -22.55 -0.69 26.86
vertex -19.53 -0.65 29.62
vertex -20.34 -2.74 29.64
endloop
endfacet
facet normal -0.89 -0.40 -0.21
outer loop
vertex -19.78 -3.38 55.19
vertex -21.54 -0.26 56.64
vertex -19.28 -2.69 51.78
endloop
endfacet
facet normal -0.85 -0.50 -0.15
outer loop
vertex -19.28 -2.69 51.78
vertex -21.54 -0.26 56.64
vertex -21.50 0.68 53.23
endloop
endfacet
facet normal -0.09 0.50 -0.86
outer loop
vertex -23.49 -0.32 23.41
vertex -19.20 -0.81 22.66
vertex -20.16 -2.53 21.76
endloop
endfacet
facet normal 0.60 -0.46 -0.65
outer loop
vertex -22.69 -2.60 27.34
vertex -20.34 -2.74 29.64
vertex -22.52 -4.42 28.80
endloop
endfacet
facet normal -0.99 -0.10 0.08
outer loop
vertex -20.04 -5.86 85.22
vertex -20.17 -2.21 88.21
vertex -20.72 -6.12 75.99
endloop
endfacet
facet normal -1.00 0.01 -0.04
outer loop
vertex -20.53 6.48 73.62
vertex -20.54 -1.47 72.24
vertex -20.72 -6.12 75.99
endloop
endfacet
facet normal 0.07 0.96 0.29
outer loop
vertex -21.37 5.31 42.77
vertex -20.74 6.70 37.98
vertex -24.67 6.09 41.03
endloop
endfacet
facet normal 0.41 0.59 -0.69
outer loop
vertex -23.46 5.52 28.98
vertex -21.34 5.38 30.11
vertex -20.84 3.52 28.81
endloop
endfacet
facet normal 0.19 0.96 0.20
outer loop
vertex -22.25 3.63 27.18
vertex -19.50 3.46 25.45
vertex -22.88 3.81 26.88
endloop
endfacet
facet normal 0.53 0.74 -0.42
outer loop
vertex -23.46 5.52 28.98
vertex -20.84 3.52 28.81
vertex -22.25 3.63 27.18
endloop
endfacet
facet normal -0.68 -0.62 0.40
outer loop
vertex -19.28 -2.69 51.78
vertex -21.50 0.68 53.23
vertex -23.86 0.76 49.34
endloop
endfacet
facet normal 0.67 -0.23 -0.70
outer loop
vertex -22.55 -0.69 26.86
vertex -20.34 -2.74 29.64
vertex -22.69 -2.60 27.34
endloop
endfacet
facet normal 0.36 0.72 -0.59
outer loop
vertex -22.34 6.69 31.09
vertex -21.34 5.38 30.11
vertex -23.46 5.52 28.98
endloop
endfacet
facet normal -0.66 0.64 0.41
outer loop
vertex -21.41 1.72 53.15
vertex -24.67 6.09 41.03
vertex -28.52 3.53 38.82
endloop
endfacet
facet normal -0.36 0.00 -0.93
outer loop
vertex -22.07 3.56 22.34
vertex -22.19 1.65 22.40
vertex -23.54 1.62 22.92
endloop
endfacet
facet normal 0.13 0.99 0.07
outer loop
vertex -22.55 -0.69 26.86
vertex -19.20 -0.81 22.66
vertex -23.49 -0.32 23.41
endloop
endfacet
facet normal 0.72 -0.39 -0.57
outer loop
vertex -23.38 -3.50 27.08
vertex -22.69 -2.60 27.34
vertex -22.52 -4.42 28.80
endloop
endfacet
facet normal 0.00 1.00 0.00
outer loop
vertex -20.74 6.70 37.98
vertex -20.94 6.69 33.09
vertex -22.34 6.69 31.09
endloop
endfacet
facet normal 0.48 0.25 -0.84
outer loop
vertex -22.96 5.60 27.37
vertex -22.25 3.63 27.18
vertex -22.88 3.81 26.88
endloop
endfacet
facet normal -0.22 0.35 -0.91
outer loop
vertex -23.49 -0.32 23.41
vertex -20.16 -2.53 21.76
vertex -23.70 -2.14 22.77
endloop
endfacet
facet normal 0.15 0.26 -0.95
outer loop
vertex -25.25 4.91 26.83
vertex -22.96 5.60 27.37
vertex -22.88 3.81 26.88
endloop
endfacet
facet normal -0.02 1.00 -0.06
outer loop
vertex -26.51 3.72 26.38
vertex -22.88 3.81 26.88
vertex -22.07 3.56 22.34
endloop
endfacet
facet normal -0.65 0.65 0.40
outer loop
vertex -21.41 1.72 53.15
vertex -28.52 3.53 38.82
vertex -24.17 1.94 48.37
endloop
endfacet
facet normal -0.85 0.19 0.50
outer loop
vertex -21.41 1.72 53.15
vertex -24.17 1.94 48.37
vertex -23.86 0.76 49.34
endloop
endfacet
facet normal 0.24 -0.09 -0.97
outer loop
vertex -22.62 1.50 26.64
vertex -22.55 -0.69 26.86
vertex -24.93 -0.42 26.24
endloop
endfacet
facet normal 0.09 0.99 0.08
outer loop
vertex -24.93 -0.42 26.24
vertex -22.55 -0.69 26.86
vertex -23.49 -0.32 23.41
endloop
endfacet
facet normal -0.18 -0.94 -0.28
outer loop
vertex -23.70 -2.14 22.77
vertex -20.16 -2.53 21.76
vertex -23.38 -3.50 27.08
endloop
endfacet
facet normal 0.04 1.00 -0.01
outer loop
vertex -25.72 6.88 34.20
vertex -20.74 6.70 37.98
vertex -22.34 6.69 31.09
endloop
endfacet
facet normal -0.64 0.28 -0.72
outer loop
vertex -26.51 3.72 26.38
vertex -22.07 3.56 22.34
vertex -23.54 1.62 22.92
endloop
endfacet
facet normal 0.18 -0.01 -0.98
outer loop
vertex -25.03 1.54 26.19
vertex -22.62 1.50 26.64
vertex -24.93 -0.42 26.24
endloop
endfacet
facet normal -0.79 0.28 -0.54
outer loop
vertex -25.37 -0.95 25.83
vertex -23.49 -0.32 23.41
vertex -23.70 -2.14 22.77
endloop
endfacet
facet normal 0.53 0.59 -0.61
outer loop
vertex -22.34 6.69 31.09
vertex -23.46 5.52 28.98
vertex -25.25 4.91 26.83
endloop
endfacet
facet normal -0.28 0.96 -0.04
outer loop
vertex -25.25 4.91 26.83
vertex -23.46 5.52 28.98
vertex -22.96 5.60 27.37
endloop
endfacet
facet normal 0.13 0.23 -0.96
outer loop
vertex -25.25 4.91 26.83
vertex -22.88 3.81 26.88
vertex -26.51 3.72 26.38
endloop
endfacet
facet normal -0.78 -0.50 -0.37
outer loop
vertex -25.03 1.54 26.19
vertex -26.51 3.72 26.38
vertex -23.54 1.62 22.92
endloop
endfacet
facet normal -0.36 -0.04 -0.93
outer loop
vertex -25.87 0.02 26.59
vertex -25.03 1.54 26.19
vertex -24.93 -0.42 26.24
endloop
endfacet
facet normal -0.61 0.74 -0.29
outer loop
vertex -24.93 -0.42 26.24
vertex -23.49 -0.32 23.41
vertex -25.37 -0.95 25.83
endloop
endfacet
facet normal -0.91 0.09 0.40
outer loop
vertex -24.17 1.94 48.37
vertex -28.70 -1.83 38.84
vertex -23.86 0.76 49.34
endloop
endfacet
facet normal 0.00 0.61 -0.79
outer loop
vertex -25.87 0.02 26.59
vertex -24.93 -0.42 26.24
vertex -25.37 -0.95 25.83
endloop
endfacet
facet normal -0.73 0.40 -0.56
outer loop
vertex -26.05 -1.96 25.98
vertex -25.37 -0.95 25.83
vertex -23.70 -2.14 22.77
endloop
endfacet
facet normal -0.91 0.03 0.42
outer loop
vertex -24.17 1.94 48.37
vertex -28.52 3.53 38.82
vertex -28.70 -1.83 38.84
endloop
endfacet
facet normal -0.27 -0.10 -0.96
outer loop
vertex -26.51 3.72 26.38
vertex -25.03 1.54 26.19
vertex -25.87 0.02 26.59
endloop
endfacet
facet normal -0.61 -0.66 0.44
outer loop
vertex -23.86 0.76 49.34
vertex -28.70 -1.83 38.84
vertex -23.72 -3.30 43.51
endloop
endfacet
facet normal -0.59 0.29 -0.75
outer loop
vertex -25.87 0.02 26.59
vertex -25.37 -0.95 25.83
vertex -26.05 -1.96 25.98
endloop
endfacet
facet normal -0.40 -0.73 -0.55
outer loop
vertex -27.39 -2.41 28.54
vertex -23.38 -3.50 27.08
vertex -25.37 -4.24 29.49
endloop
endfacet
facet normal -0.38 0.80 -0.47
outer loop
vertex -28.90 3.82 31.60
vertex -25.72 6.88 34.20
vertex -22.34 6.69 31.09
endloop
endfacet
facet normal -0.52 0.80 -0.30
outer loop
vertex -28.90 3.82 31.60
vertex -28.13 5.02 33.46
vertex -25.72 6.88 34.20
endloop
endfacet
facet normal -0.63 0.75 0.18
outer loop
vertex -24.67 6.09 41.03
vertex -25.72 6.88 34.20
vertex -28.13 5.02 33.46
endloop
endfacet
facet normal -0.40 0.91 -0.10
outer loop
vertex -22.34 6.69 31.09
vertex -25.25 4.91 26.83
vertex -28.90 3.82 31.60
endloop
endfacet
facet normal -0.67 -0.16 -0.72
outer loop
vertex -26.51 3.72 26.38
vertex -25.87 0.02 26.59
vertex -27.39 -2.41 28.54
endloop
endfacet
facet normal -0.88 0.21 -0.43
outer loop
vertex -27.39 -2.41 28.54
vertex -25.87 0.02 26.59
vertex -26.05 -1.96 25.98
endloop
endfacet
facet normal -0.70 -0.33 0.64
outer loop
vertex -25.82 -4.07 40.81
vertex -23.72 -3.30 43.51
vertex -28.70 -1.83 38.84
endloop
endfacet
facet normal -0.60 0.75 -0.29
outer loop
vertex -28.90 3.82 31.60
vertex -25.25 4.91 26.83
vertex -26.51 3.72 26.38
endloop
endfacet
facet normal -0.59 -0.77 -0.24
outer loop
vertex -28.69 -2.83 33.06
vertex -27.39 -2.41 28.54
vertex -25.37 -4.24 29.49
endloop
endfacet
facet normal -0.88 0.47 0.06
outer loop
vertex -28.52 3.53 38.82
vertex -28.13 5.02 33.46
vertex -28.90 3.82 31.60
endloop
endfacet
facet normal -0.96 0.04 -0.27
outer loop
vertex -28.69 -2.83 33.06
vertex -26.51 3.72 26.38
vertex -27.39 -2.41 28.54
endloop
endfacet
facet normal -0.90 -0.12 -0.41
outer loop
vertex -28.69 -2.83 33.06
vertex -28.90 3.82 31.60
vertex -26.51 3.72 26.38
endloop
endfacet
facet normal -1.00 -0.02 0.05
outer loop
vertex -28.52 3.53 38.82
vertex -28.90 3.82 31.60
vertex -28.69 -2.83 33.06
endloop
endfacet
facet normal -1.00 0.03 -0.01
outer loop
vertex -28.70 -1.83 38.84
vertex -28.52 3.53 38.82
vertex -28.69 -2.83 33.06
endloop
endfacet
endsolid threews_avatar
```
<sub>Want your own? `npx readme-3d your-model.glb` converts any GLB into a paste-ready markdown block. [How it works →](packages/readme-3d)</sub>
### $THREE
`$THREE` is the native token of the three.ws ecosystem — the one and only coin of the platform.
| | |
| --- | --- |
| **Token** | `$THREE` |
| **Contract Address (CA)** | `FeMbDoX7R1Psc4GEcvJdsbNbZA3bfztcyDCatJVJpump` |
| **Network** | Solana |
| **Trade** | [pump.fun](https://pump.fun/FeMbDoX7R1Psc4GEcvJdsbNbZA3bfztcyDCatJVJpump) |
| **Explorer** | [Solscan](https://solscan.io/token/FeMbDoX7R1Psc4GEcvJdsbNbZA3bfztcyDCatJVJpump) |
| **In the product** | [/pulse](https://three.ws/pulse) (live platform economy) · [/launches](https://three.ws/launches) (launch directory) |
> Always verify the contract address above before trading. `$THREE` is the only token associated with three.ws.
---
## Table of Contents
- [What is three.ws?](#what-is-threews)
- [Key Features](#key-features)
- [Screenshots](#screenshots)
- [Forge — Text & Image to 3D](#forge--text--image-to-3d)
- [Platform Pages](#platform-pages)
- [Getting Started](#getting-started)
- [Examples](#examples)
- [Tutorials](#tutorials)
- [Architecture](#architecture)
- [Design Docs & Specs](#design-docs--specs)
- [Tech Stack](#tech-stack)
- [Browser Support](#browser-support)
- [Project Structure](#project-structure)
- [The Agent System](#the-agent-system)
- [Event Bus (Agent Protocol)](#event-bus-agent-protocol)
- [LLM Runtime](#llm-runtime)
- [Empathy Layer](#empathy-layer)
- [Skills](#skills)
- [Memory](#memory)
- [Animation System](#animation-system)
- [Web Component & Embedding](#web-component--embedding)
- [Widget System](#widget-system)
- [Embed Editor](#embed-editor)
- [Pose Studio](#pose-studio)
- [Avatar Accessories & Coin Launchpad](#avatar-accessories--coin-launchpad)
- [Launchpad](#launchpad)
- [The Club](#the-club)
- [Walk & Multiplayer](#walk--multiplayer)
- [Coin Communities](#coin-communities)
- [Coin Wars & Live Events](#coin-wars--live-events)
- [City](#city)
- [Friends, Presence & Social](#friends-presence--social)
- [In-Game Economy](#in-game-economy)
- [Voice Lab & Mocap Studio](#voice-lab--mocap-studio)
- [Talk Mode & Lip-Sync](#talk-mode--lip-sync)
- [Demos Hub](#demos-hub)
- [Skill Library](#skill-library)
- [Developer SDKs](#developer-sdks)
- [API Reference](#api-reference)
- [Authentication & OAuth 2.1](#authentication--oauth-21)
- [MCP Server](#mcp-server)
- [Brain Proxy & LLM Routing](#brain-proxy--llm-routing)
- [Claude Code Integration](#claude-code-integration)
- [Install in Claude Code](#install-in-claude-code)
- [Cloud Marketplaces](#cloud-marketplaces)
- [Ecosystem Directories](#ecosystem-directories)
- [IBM watsonx & Granite](#ibm-watsonx--granite)
- [x402 Payments](#x402-payments)
- [A2A — Agent-to-Agent Protocol](#a2a--agent-to-agent-protocol)
- [On-Chain Identity (ERC-8004 + Metaplex Core)](#on-chain-identity-erc-8004--metaplex-core)
- [Pump.fun Integration](#pumpfun-integration)
- [WASM Vanity Grinder](#wasm-vanity-grinder)
- [Solana Mobile (Seeker)](#solana-mobile-seeker)
- [Vision](#vision)
- [Roadmap](#roadmap)
- [Selfie Reconstruction Pipeline (Phase 1)](#selfie-reconstruction-pipeline-phase-1)
- [Voice & Persona Hub (Phase 2)](#voice--persona-hub-phase-2)
- [Livepeer Inference Network (Phase 4)](#livepeer-inference-network-phase-4)
- [News CMS & Syndication](#news-cms--syndication)
- [Security Hardening](#security-hardening)
- [Database Schema](#database-schema)
- [Build & Deployment](#build--deployment)
- [Versioning & Compatibility](#versioning--compatibility)
- [Environment Variables](#environment-variables)
- [Testing](#testing)
- [FAQ & Troubleshooting](#faq--troubleshooting)
- [Contributing](#contributing)
- [Contributors](#contributors)
- [License](#license)
---
## What is three.ws?
three.ws is a full-stack system for creating, deploying, and embedding 3D AI agents. It combines a WebGL model viewer, an LLM-driven agent runtime, on-chain identity contracts, and a distributable web component into one cohesive platform.
At its core, it does five things:
1. **Generate**: turns a text prompt, up to 6 photos, or a sketch into a textured, downloadable GLB via [Forge](https://three.ws/forge). Free draft tier, no account required; auto-rigging, restyling, and retexturing in the same flow.
2. **Render** — loads and validates glTF 2.0 / GLB models in WebGL 2.0 with zero server-side processing. Drag a file onto the browser and it renders instantly with full Draco, KTX2, and Meshopt decompression.
3. **Embody** — wraps any avatar with an LLM brain. The agent listens to the user, thinks with Claude, executes tools (animations, gestures, memory operations, skill calls), and expresses emotion through morph-target blending on the 3D model in real time.
4. **Register** — optionally mints the agent on-chain: as an **ERC-8004 token on any EVM chain**, or as a **Metaplex Core NFT on Solana**. Either path gives the agent a stable on-chain identity, a wallet address, signed action history, and a reputation score that cannot be forged.
5. **Embed** — distributes the agent as an `<agent-3d>` web component that anyone can drop into a page, or as one of five purpose-built widget types (turntable, animation gallery, talking agent, passport card, hotspot tour) with Open Graph and oEmbed support built in.
The backend is a set of serverless-style handlers (in `api/`) served in production by a single Google Cloud Run container ([server/index.mjs](server/index.mjs)), backed by Neon Postgres for metadata, Cloudflare R2 for model storage, and Upstash Redis for rate limiting. It exposes a full OAuth 2.1 authorization server and an MCP (Model Context Protocol) endpoint so external AI systems can drive avatars programmatically.
three.ws is production-ready and serves [three.ws](https://three.ws) live on Google Cloud Run: `GET https://three.ws/api/version` returns the exact commit the site is running right now. The entire stack (viewer, agent runtime, contracts, backend, and web component) is source-available in this repository; see [LICENSE](LICENSE) for terms.
---
## Key Features
**Text → 3D Generation (Forge)**
- Prompt-to-3D at [three.ws/forge](https://three.ws/forge) — describe an object in a sentence and download a textured GLB
- Image→3D (one to six photos) and sketch→3D in the same composer
- Multiple generation engines with live health checks: self-hosted lanes plus bring-your-own-key Meshy and Tripo (keys stay in the browser)
- Prompt-to-avatar at [three.ws/create/prompt](https://three.ws/create/prompt) — a description becomes a rigged, animatable 3D avatar
- Generated models carry straight into Scene Studio, embeds, worlds, and on-chain deployment
**3D Viewer**
- WebGL 2.0 rendering via three.js r184
- glTF 2.0 and GLB with Draco geometry compression, KTX2 texture compression, and Meshopt mesh optimization
- Khronos-spec glTF validation with line-level error reporting
- HDR environment maps, PBR materials, skinned mesh animations, morph targets, and embedded cameras
- OrbitControls (pan, zoom, rotate) with configurable auto-rotation
- Real-time parameter tweaking (lights, exposure, morph weights) via dat.GUI
**Agent Runtime**
- LLM brain powered by Claude (Anthropic API) with a structured tool-loop architecture
- Up to 8 tool iterations per turn before returning final output
- Built-in tools: `wave`, `lookAt`, `play_clip`, `setExpression`, `speak`, `remember`
- Composable skill system — install skills from IPFS, Arweave, or HTTP; each skill is a self-contained bundle with a description, tool definitions, and async handlers
- Weighted emotion blending (celebration, concern, curiosity, empathy, patience) driven by protocol events, not a finite-state machine
- Web Speech API for STT/TTS out of the box; ElevenLabs integration for production-quality voice
- **Talk mode** with audio-driven ARKit-52 lip-sync — TTS audio is analysed in real time and drives 52 standard blendshapes on the avatar
- Anonymous Groq-powered chat for unauthenticated visitors; owner-card gating when an agent has a paying author
**x402 Payments & Bazaar**
- Native [x402](https://x402.org) paid endpoints on Base, BSC, and Solana — agents pay other agents in USDC for API calls, asset downloads, and skill royalties
- Coinbase CDP facilitator on Base mainnet; direct-scheme payments on BSC
- Permit2 gas-sponsoring siblings on every CDP-settled endpoint (buyer signs, relayer pays gas)
- **Pay-by-name** — `/api/x402/pay-by-name` resolves `@username`, `*.sol` (incl. subdomains), or raw base58 to a recipient and builds an unsigned USDC transfer for the payer's wallet. Every 402 manifest emitted by a named agent advertises `recipient_name` next to the wallet, so payers verify a human-readable name before signing
- SKU catalog + Stripe-style checkout at `/dashboard/x402`; receipts ledger
- Subscriptions, idempotency tokens, offer receipts, paid asset download, and a bazaar listing/search API
- SIWX (Sign-In with X-chain) server for auth-gated paid endpoints
- Listed on [x402scan](https://www.x402scan.com/server/17cbd874-52ac-4920-a020-b22ff2489a07) and the [MCP Registry](https://registry.modelcontextprotocol.io/?q=three.ws)
**SNS / `*.threews.sol` subdomains**
- `/threews/claim` lets any signed-in user mint `[username].threews.sol` in a single atomic Solana transaction — `createSubdomain` → URL record → `transferSubdomain` to the user's wallet, with three.ws absorbing gas
- Brave Browser resolves the subdomain directly to the user's `/u/[username]` showcase via the SNS URL record
- Agents can bind a `.sol` name (theirs or a fresh registration) via `/api/agents/:id/sns`; once bound, every public surface — agent page, x402 manifest, MCP listing, marketplace card — displays the name in place of the raw wallet
**A2A — Agent-to-Agent Protocol**
- A2A client + server, MCP bridge, DID resolution, spending ledger, receipts storage
- Agents transact autonomously via their delegated signer wallets and EIP-7710 permissions
**Identity & On-Chain**
- ERC-8004 smart contracts (IdentityRegistry, ReputationRegistry, ValidationRegistry) deployable on any EVM chain — plus a **program-free Metaplex Core analog on Solana** (asset pubkey = agent ID, SPL Memo–anchored reputation + validation attestations)
- Each agent is an ERC-721 token with a stable `agentId`, owner wallet, delegated signer (EIP-712), and IPFS-pinned manifest
- Signed action log — every `speak`, `remember`, `skill-done`, and `validate` event is recorded on-chain-optionally or in the database with a cryptographic signature
- EIP-7710 delegated permissions for composable agent-to-agent authorization
- Solana support (SIWS sign-in, Solana wallet linking, Metaplex NFT option)
**Embedding & Distribution**
- `<agent-3d>` custom element — drop it anywhere with no framework dependency
- Five widget variants: turntable, animation gallery, talking agent, ERC-8004 passport card, hotspot tour
- Widget Studio + WYSIWYG **Embed editor** at `/embed` — pick an avatar, embed mode, environment, and size, copy the snippet
- **Launchpad** at `/launchpad` — hosted public launch pages at `/p/[slug]` for tokens, agents, and drops
- Open Graph metadata and oEmbed support for rich social previews when links are shared
- Versioned CDN bundles at `/agent-3d/x.y.z/agent-3d.js`
**Social & Multiplayer 3D**
- **Coin Communities** at `/communities` + `/play` — every Solana token gets a live 3D world; pick the same coin and land together, with peer avatars, chat, emotes, voxel building, and a live market-cap screen
- **City** at `/city` — free-roam walkable 3D city scene
- **Friends, presence & DMs** — account-level social graph with live presence ("Online · Mainland"), direct messages, and a per-account realtime delivery hub
- **The Club** at `/club` — multiplayer venue with rigged dancers, audio tracks, tips, leaderboard, payouts cron, perf-aware renderer that auto-downgrades on slow frames
- **Walk** at `/walk` — authoritative multiplayer walk scene backed by a Colyseus server in `multiplayer/` (deployable on Google Cloud Run)
- **Pose Studio** at `/pose`, **Voice Lab** at `/voice`, **Mocap Studio** at `/mocap-studio` — author poses, bind voices, and capture/retarget motion into reusable clips
**Backend & Integrations**
- OAuth 2.1 server (RFC 6749 + PKCE, RFC 7591 dynamic registration, RFC 7009 revocation, RFC 7662 introspection, RFC 8414 discovery)
- Developer API keys with scope and expiry
- MCP (Model Context Protocol) over HTTP with JSON-RPC 2.0 for tool-calling from external AI systems; A2A bridge exposes paid tools as x402 endpoints
- Avaturn (photo-to-avatar), Character Studio (in-browser builder), Avatar Studio (rebranded marketplace), and Privy (embedded wallet) integrations
- Replicate-backed avatar regeneration provider for photo-to-avatar workflows
- Native selfie reconstruction pipeline (Phase 1) + Livepeer inference network (Phase 4) wired into the agent runtime
- DCA strategy execution and on-chain subscription scheduling via cron jobs
- Solana Mobile (Seeker) MWA wallet wired into the web app + Solana Mobile dApp Store release pipeline
- Hardened API surface: SSRF guard, CSRF gates, header-origin pinning, fail-closed crons
- OpenAPI 3.1 spec generated at `/openapi.json`
---
## Screenshots
Every image below is a real capture of the live production site. Click any caption to open that page.
| [Landing](https://three.ws) | [Forge: text → 3D](https://three.ws/forge) |
| ---------------------------------------------- | ---------------------------------------------- |
|  |  |
| [Viewer at /app](https://three.ws/app) | [Avatar creation](https://three.ws/create) |
| ---------------------------------------------- | ---------------------------------------------- |
|  |  |
| [Agent discovery](https://three.ws/discover) | [Marketplace](https://three.ws/marketplace) |
| ---------------------------------------------- | ---------------------------------------------- |
|  |  |
| [The Club (multiplayer venue)](https://three.ws/club) | [Coin Communities](https://three.ws/communities) |
| ---------------------------------------------- | ---------------------------------------------- |
|  |  |
| [x402 Bazaar](https://three.ws/x402) | [The Money Pulse](https://three.ws/pulse) |
| ---------------------------------------------- | ---------------------------------------------- |
|  |  |
More captures appear inline in the sections below: [Widget Studio](#widget-system), [Embed Editor](#embed-editor), [Pose Studio](#pose-studio), [City](#city), [Walk](#walk--multiplayer), [Launchpad](#launchpad), [vanity grinder](#wasm-vanity-grinder), [Demos Hub](#demos-hub), and [Chat](#brain-proxy--llm-routing).
---
## Forge — Text & Image to 3D
Type a sentence, get a 3D model. [**Forge**](https://three.ws/forge) turns a text prompt, one to six photos, or a rough sketch into a textured, downloadable GLB, in the browser, with a free draft tier and no account required.
| Input | How it works | Typical time |
| --- | --- | --- |
| **Text** | Describe the object — *"a brass steampunk owl, full body"* | ~30–90 s |
| **Image** | Upload 1 to 6 reference views (front/back/left/right/top/three-quarter); multi-view removes back-of-object hallucination | ~30 to 90 s |
| **Sketch** | Draw it and name it — TripoSG-scribble reconstructs the geometry | ~30–90 s |
Three quality tiers — `draft` (~12k polygons), `standard` (~30k, default), `high` (~200k + PBR textures) — and two generation paths: the platform-keyed image pipeline (FLUX → TRELLIS) that works with no key at all, and bring-your-own-key native geometry via **Meshy** or **Tripo** for the cleanest quad topology (your key stays in your browser).
Forge is not a dead end. Every generated model carries straight into the rest of the platform: open it in **Scene Studio**, **auto-rig** it into an animatable character, restyle it (voxel / brick / voronoi / low-poly), retexture it from a prompt, embed it with `<agent-3d>`, give it an LLM brain, or deploy it on-chain. Prompt-to-avatar lives at [three.ws/create/prompt](https://three.ws/create/prompt) — a description becomes a rigged, animatable agent body.
### REST API
The same engine is one HTTP call, free and auth-free:
```bash
# Submit a text→3D job
curl -X POST https://three.ws/api/forge \
-H 'content-type: application/json' \
-d '{"prompt": "a brass steampunk owl, full body", "tier": "standard"}'
# → { "job_id": "…", … }
# Poll until done
curl 'https://three.ws/api/forge?job=<job_id>'
# → { "status": "done", "glb_url": "https://…/model.glb", … }
```
Image→3D is the same endpoint with `image_urls: ["https://…/front.png", …]` (1 to 6 views) instead of a prompt. `GET /api/forge?catalog` returns the live tier/backend/cost matrix.
### From Claude, Cursor, or any MCP client
The **3D Studio MCP server** at `https://three.ws/api/mcp-3d` exposes the full pipeline as 15 tools — `text_to_3d`, `image_to_3d`, `auto_rig_model`, `apply_animation`, `stylize_model`, `retexture_model`, `segment_model`, and more — so an AI assistant can generate, rig, and animate a model mid-conversation and render it as an inline interactive artifact. See [docs/mcp-3d-studio.md](docs/mcp-3d-studio.md).
### Pay-per-call for autonomous agents (x402)
`POST /api/x402/forge` is the monetized twin: agents pay per generation in USDC on Solana mainnet, with no API key and no account. Draft $0.05, standard $0.15, high $0.50; polling is free; retried payments are idempotent and never double-charge. See [docs/api/forge-x402.md](docs/api/forge-x402.md).
### Learn more
- [Tutorial: Turn a Text Prompt into a 3D Model](docs/tutorials/text-to-3d.md) — first model in about a minute
- [Tutorial: Turn Photos into a 3D Model](docs/tutorials/image-to-3d.md): reconstruct a real object from up to 6 photos
- [3D Studio MCP server](docs/mcp-3d-studio.md) — generate from inside Claude or Cursor
- [Paid generation API (x402)](docs/api/forge-x402.md) — autonomous agent-to-agent generation
---
## Platform Pages
A map of every user-facing route. [`STRUCTURE.md`](STRUCTURE.md) maps each product surface to the directory that implements it, and [`data/pages.json`](data/pages.json) is the registry every public route is generated from (sitemap, `llms.txt`, `features.json`, changelog).
| Section | Key URLs | What it does |
| -------------------- | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| **Landing** | `/`, `/features`, `/discover` | Marketing, public agent directory |
| **Forge (Text→3D)** | `/forge`, `/create/prompt` | Prompt / photo / sketch → textured GLB; prompt → rigged, animatable avatar |
| **App / Core** | `/app`, `/create`, `/first-meet` | 3D viewer, agent creation wizard, onboarding |
| **Marketplace** | `/marketplace`, `/marketplace/agents/[id]` | Browsable agent marketplace |
| **Chat SPA** | `/chat` | Full Svelte AI chat with model selector, tools, artifacts, wallet |
| **Chat — Marketing** | `/chat#solutions/*`, `/chat#business/*` | Per-team and enterprise landing pages |
| **Chat — Features** | `/chat#features/*` | Feature detail pages (web-app, mobile-app, ai-design, ai-slides, browser-operator, wide-research, mail, skills) |
| **Chat — Resources** | `/chat#resources/*` | Blog, docs, trust center, updates, use cases |
| **Auth** | `/login`, `/register`, `/forgot-password`, `/reset-password` | Email + wallet sign-in/up |
| **Agent (Platform)** | `/agent/[id]`, `/agent/[id]/embed`, `/agent/[id]/edit` | Agent chat, chromeless embed, manifest editor |
| **Agent (On-Chain)** | `/a/[chain]/[id]`, `/a/sol/[asset]` | ERC-8004 and Metaplex Core passports |
| **Profile** | `/profile`, `/u/[username]`, `/avatars/[id]` | User and avatar public pages — SNS badge + pay-by-name modal when `[username].threews.sol` is claimed |
| **SNS Subdomain** | `/threews/claim` | Mint `[label].threews.sol`, set the URL record to your showcase, transfer ownership — single tx, platform pays |
| **Dashboard** | `/dashboard`, `/dashboard/actions`, `/dashboard/wallets`, `/dashboard/usage`, `/dashboard/x402` | Account management, settings, and x402 receipts/payouts |
| **Studio / Tools** | `/studio`, `/embed`, `/pose`, `/gestures`, `/choreograph`, `/voice`, `/mocap-studio`, `/hydrate`, `/validation`, `/strategy-lab` | Widget Studio, WYSIWYG embed editor, pose authoring, gesture vocabulary + override builder, routine choreographer, Voice Lab, Mocap Studio, on-chain import, glTF validator, DCA |
| **Widgets** | `/widgets`, `/w/[id]` | Widget gallery and public widget pages (OG + oEmbed) |
| **Launchpad** | `/launchpad`, `/p/[slug]` | Launchpad Studio + hosted launch pages (token, agent, drop campaigns) |
| **Club** | `/club` | Multiplayer 3D venue — tips, leaderboard, audio tracks, perf-aware renderer |
| **Walk** | `/walk` | Authoritative multiplayer walk scene (Colyseus on Fly.io) |
| **Coin Communities** | `/communities`, `/communities/[mint]`, `/worlds`, `/play`, `/crews` | Live 3D world per Solana token: lobby, coin profile, the shared coin-keyed world, and crew HQ |
| **City** | `/city` | Free-roam walkable 3D city scene |
| **Bazaar (x402)** | `/x402`, `/x402/studio`, `/x402-revenue` | Paid-API marketplace, listing studio, revenue dashboard |
| **Artifacts** | `/artifact`, `/artifact/snippet`, `/artifact-example` | Claude Artifact viewer |
| **Solana / DeFi** | `/pumpfun`, `/pump-visualizer`, `/vanity-wallet` | pump.fun launcher, live token visualizer, WASM vanity grinder |
| **Mobile (Seeker)** | Solana Mobile dApp Store | MWA wallet wired into the web app + Seeker release pipeline |
| **News / Blog** | `/news` | News feed, syndicated outward via RSS (HackerNoon auto-import) |
| **Reputation** | `/reputation`, `/monitor` | Reputation registry, fleet ops-room dashboard |
| **Experiments** | `/rider`, `/holo` | A-Frame WebVR music visualization, procedural holographic sticker |
| **Integrations** | `/cz`, `/lobehub/iframe` | CZ demo, LobeHub plugin |
| **IBM / Granite** | `/galaxy`, `/ibm/x402-demo`, `/ibm/hello` | Granite on watsonx.ai: semantic agent galaxy, pay-per-call Granite demo, hello-world embed |
| **Docs** | `/docs`, `/docs/widgets` | Developer documentation |
| **Legal** | `/legal/privacy`, `/legal/tos` | Privacy policy and terms |
---
## Getting Started
### Prerequisites
- Node.js 24+ (the project pins `"engines.node": "24.x"` in `package.json`; earlier majors are not tested)
- npm 10+
- A Neon Postgres database
- A Cloudflare R2 bucket
- An Anthropic API key
### Installation and Setup
1. **Clone the repository**:
```bash
git clone https://github.com/nirholas/three.ws.git
cd three.ws
```
2. **Install dependencies**:
```bash
npm install
```
3. **Set up environment variables**:
Copy the `.env.example` file to `.env.local` and fill in the required values. See the [Environment Variables](#environment-variables) section for more details.
```bash
cp .env.example .env.local
```
4. **Initialize the database**:
The schema is idempotent. Run it against your Postgres instance to create all tables:
```bash
psql $DATABASE_URL < api/_lib/schema.sql
```
5. **Run the development server**:
```bash
npm run dev
```
The application will be available at `http://localhost:3000`.
---
## Examples
Copy-paste ready snippets for the most common use cases. Swap in your own GLB URL and go.
> **Run these without cloning anything:** [three.ws/examples](https://three.ws/examples) renders the same snippets with a **Run** button on each. The code executes in a sandboxed frame on the page against the production CDN bundle, so what you see running is exactly what you copy. That page also lists every example that ships in [`examples/`](examples/), generated by scanning the repo so it cannot drift.
### 1. Minimal viewer (no AI)
The simplest possible setup — one script tag, one element, zero build step.
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>3D Viewer</title>
<style>
body {
margin: 0;
background: #0a0a0a;
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
}
agent-3d {
width: 400px;
height: 560px;
display: block;
}
</style>
</head>
<body>
<script type="module" src="https://three.ws/agent-3d/1.5.2/agent-3d.js"></script>
<agent-3d body="https://three.ws/avatars/default.glb"></agent-3d>
</body>
</html>
```
Drag-to-rotate, scroll-to-zoom, full PBR rendering — no API key, no account required. Swap `body=` for any publicly accessible `.glb` URL.
---
### 2. Talking agent with inline instructions
Add `brain=` and `instructions=` to turn the viewer into a conversational agent.
```html
<script type="module" src="https://three.ws/agent-3d/1.5.2/agent-3d.js"></script>
<agent-3d
body="https://three.ws/avatars/default.glb"
brain="claude-sonnet-4-6"
name="Aria"
instructions="You are Aria, a friendly AI guide. Be warm, concise, and occasionally playful.
When someone greets you, wave at them. Keep replies to 2–3 sentences."
mode="inline"
width="400px"
height="560px"
></agent-3d>
```
The chat input and mic button appear automatically when `brain` is set. No UI to build.
---
### 3. Floating bubble (support widget style)
Pin the agent to a corner of the page so it persists as users scroll.
```html
<script type="module" src="https://three.ws/agent-3d/1.5.2/agent-3d.js"></script>
<agent-3d
body="https://three.ws/avatars/default.glb"
brain="claude-sonnet-4-6"
instructions="You are a helpful product assistant. Answer questions about our features."
mode="floating"
position="bottom-right"
width="320px"
height="420px"
></agent-3d>
```
`position` accepts `bottom-right`, `bottom-left`, `top-right`, or `top-left`.
---
### 4. Load a registered agent by ID
If you've registered an agent on the platform, load it entirely from its manifest — no inline attributes needed.
```html
<!-- By platform agent ID -->
<agent-3d agent-id="a_abc123def456"></agent-3d>
<!-- By on-chain ERC-8004 ID -->
<agent-3d agent-id="42" chain-id="8453"></agent-3d>
```
The element fetches the manifest (model URL, instructions, skills, memory config) automatically.
---
### 5. Custom chat UI with JavaScript API
Hide the built-in chrome and wire in your own input using the element's JS API.
```html
<script type="module" src="https://three.ws/agent-3d/1.5.2/agent-3d.js"></script>
<agent-3d
id="agent"
body="https://three.ws/avatars/default.glb"
brain="claude-sonnet-4-6"
kiosk
style="width:400px;height:560px;display:block"
></agent-3d>
<input id="msg" type="text" placeholder="Ask something…" />
<button onclick="send()">Send</button>
<script>
const agent = document.getElementById('agent');
const input = document.getElementById('msg');
async function send() {
const text = input.value.trim();
if (!text) return;
input.value = '';
await agent.say(text);
}
input.addEventListener('keydown', (e) => {
if (e.key === 'Enter') send();
});
// Auto-greet on load
agent.addEventListener('agent:ready', () => {
setTimeout(() => agent.say('Hello! How can I help you today?'), 1200);
});
// Listen to replies
agent.addEventListener('brain:message', (e) => {
if (e.detail.role === 'assistant') console.log('Agent:', e.detail.content);
});
</script>
```
**Full JS API:**
| Method | Description |
| --------------------------------------- | --------------------------------------------------- |
| `agent.say(text)` | Send a message; agent speaks and animates the reply |
| `agent.ask(text)` | Same as `say()`, returns reply text as a string |
| `agent.wave()` | Trigger the wave gesture directly |
| `agent.lookAt(target)` | `'camera'`, `'model'`, or `'user'` |
| `agent.play(clipName)` | Play a named animation clip |
| `agent.clearConversation()` | Reset conversation history |
| `agent.expressEmotion(trigger, weight)` | Manually inject an emotion blend |
**Key events:** `agent:ready`, `brain:message`, `brain:thinking`, `skill:tool-called`, `voice:transcript`
---
### 6. iframe widget (works in Notion, Substack, Webflow)
Use a widget URL directly — no script tag needed.
```html
<iframe
src="https://three.ws/a/8453/42/embed"
width="400"
height="560"
frameborder="0"
allow="microphone"
style="border-radius:16px;"
></iframe>
```
Generate the `src` URL from [Widget Studio](https://three.ws/studio) — pick an avatar, choose a widget type, and copy the snippet.
---
### 7. Agent manifest JSON
For anything beyond a quick one-liner, define the agent in a manifest file and reference it with `manifest=`.
**agent.json:**
```json
{
"spec": "agent-manifest/0.2",
"name": "Aria",
"description": "A friendly AI guide",
"body": {
"uri": "https://three.ws/avatars/default.glb",
"format": "gltf-binary"
},
"brain": {
"provider": "anthropic",
"model": "claude-sonnet-4-6",
"instructions": "You are Aria, a warm and curious AI guide. Wave when greeted.",
"temperature": 0.8,
"maxTokens": 1024
},
"voice": {
"tts": { "provider": "browser", "rate": 1.05 },
"stt": { "provider": "browser", "language": "en-US" }
},
"memory": { "mode": "local" },
"skills": [{ "uri": "https://three.ws/cdn/skills/wave/" }]
}
```
```html
<agent-3d manifest="./agent.json" width="400px" height="560px"></agent-3d>
```
---
### 8. Dead-simple copy-paste widget
For the absolute simplest way to embed an agent, use this snippet. It requires no build tools or imports. Just copy and paste it into your HTML.
```html
<div data-agent-id="YOUR_AGENT_ID" style="width: 400px; height: 500px;"></div>
<script type="module" src="https://three.ws/artifact.js"></script>
```
The loader ([public/artifact.js](public/artifact.js)) mounts a rotatable 3D viewer into every `[data-agent-id]` element on the page. You can find your agent ID in the agent's settings page. This method is great for quick integrations on platforms like WordPress, Ghost, or any static HTML site — size it with the `style` attribute. For a configurable snippet (chat mode, environments, size presets), use the [Embed editor](#embed-editor) at `/embed`.
---
## Tutorials
66 step-by-step guides ship in [`docs/tutorials/`](docs/tutorials/), and every one is published live at [three.ws/tutorials](https://three.ws/tutorials). If you would rather run code than read, [three.ws/examples](https://three.ws/examples) executes each snippet on the page. The core path:
| Tutorial | What you'll build | Time | Live |
| -------------------------------------------------------------- | -------------------------------------------------------------------- | ------- | ---- |
| [Turn a Text Prompt into a 3D Model](docs/tutorials/text-to-3d.md) | A real, textured, downloadable 3D model from a one-line description | ~5 min | [open](https://three.ws/tutorials/text-to-3d) |
| [Turn Photos into a 3D Model](docs/tutorials/image-to-3d.md) | A GLB reconstructed from up to 6 photos of a real object | ~10 min | [open](https://three.ws/tutorials/image-to-3d) |
| [Build Your First Agent](docs/tutorials/first-agent.md) | A talking 3D character on a shareable page, from zero | ~20 min | [open](https://three.ws/tutorials/first-agent) |
| [Embed on Your Website](docs/tutorials/embed-on-website.md) | Add an agent to any page: plain HTML, React, Webflow, WordPress | ~15 min | [open](https://three.ws/tutorials/embed-on-website) |
| [Write a Custom Skill](docs/tutorials/custom-skill.md) | A new tool the agent can call (e.g., fetch live weather data) | ~30 min | [open](https://three.ws/tutorials/custom-skill) |
| [Register On-Chain](docs/tutorials/register-onchain.md) | Mint your agent onchain: ERC-8004 on EVM or Metaplex Core on Solana | ~20 min | [open](https://three.ws/tutorials/register-onchain) |
| [Build a Personal AI Site](docs/tutorials/personal-ai-site.md) | A full personal site with an embedded AI version of yourself | ~45 min | [open](https://three.ws/tutorials/personal-ai-site) |
Beyond the core path, the catalog covers every surface in this README. A sampler, grouped by what you want to do:
- **Embed & integrate:** [Embed in 30 seconds](https://three.ws/tutorials/embed-in-30-seconds) · [Add a 3D assistant to your app](https://three.ws/tutorials/add-a-3d-assistant) · [Build a site concierge](https://three.ws/tutorials/build-a-site-concierge) · [Shopify shopping assistant](https://three.ws/tutorials/shopify-shopping-assistant) · [JS API and events](https://three.ws/tutorials/js-api-events) · [Trigger from page events](https://three.ws/tutorials/trigger-from-page-events)
- **Avatars & 3D:** [Selfie to avatar](https://three.ws/tutorials/selfie-to-avatar) · [Animate your avatar](https://three.ws/tutorials/animate-your-avatar) · [Build a 3D scene](https://three.ws/tutorials/build-a-scene) · [View in AR](https://three.ws/tutorials/view-in-ar) · [Upload a custom GLB](https://three.ws/tutorials/upload-custom-glb) · [Voice and lip-sync](https://three.ws/tutorials/voice-and-lipsync)
- **Agents & AI:** [Connect an AI brain](https://three.ws/tutorials/connect-ai-brain) · [Agent personality](https://three.ws/tutorials/agent-personality) · [Create and edit memory](https://three.ws/tutorials/create-and-edit-memory) · [Multi-agent coordination](https://three.ws/tutorials/multi-agent-coordination) · [MCP server for your agent](https://three.ws/tutorials/mcp-server-for-your-agent)
- **On-chain & payments:** [Claim your threews.sol name](https://three.ws/tutorials/claim-threews-name) · [Mint a pump.fun token](https://three.ws/tutorials/mint-pumpfun-token) · [Mine a vanity address](https://three.ws/tutorials/mine-vanity-address) · [x402 server SDK](https://three.ws/tutorials/x402-server-sdk) · [Solana agent reputation](https://three.ws/tutorials/solana-agent-reputation)
### Common gotchas
**CORS** — if your GLB is hosted on a different domain, the server must send `Access-Control-Allow-Origin: *`. Without it the fetch is blocked and the canvas stays blank. Uploading via the platform's storage sets this automatically.
**File size** — models over ~50 MB load slowly. Compress with Draco:
```bash
npx gltf-transform draco input.glb output.glb
```
**Voice on HTTPS** — `getUserMedia` (microphone) requires HTTPS. Localhost is exempt; any remote deployment needs TLS. Vercel and Netlify both provide it automatically.
**CSP** — if your page has a strict Content Security Policy, add:
```
script-src 'self' https://three.ws;
```
For sandboxed iframes use the widget embed path instead — it runs in its own browsing context.
---
## Architecture
The platform is organized into four layers. All layers communicate through a single event bus (`agent-protocol`) rather than direct calls.
```
┌────────────────────────────────────────────────────────────┐
│ Layer 4: Embed & Distribution │
│ <agent-3d> web component · CDN library · 5 widget types │
│ Widget Studio · oEmbed · Open Graph cards │
└────────────────────────────────────────────────────────────┘
↓ protocol events
┌────────────────────────────────────────────────────────────┐
│ Layer 3: Identity & Persistence │
│ Agent passport · ERC-8004 (EVM) + Metaplex Core (Solana) │
│ Signed action log · Memory store · Cross-chain SIWX │
└────────────────────────────────────────────────────────────┘
↓ protocol events
┌────────────────────────────────────────────────────────────┐
│ Layer 2: Agent Runtime │
│ LLM tool-loop · Built-in tools · Skill registry │
│ Empathy Layer (emotion blending) · TTS/STT │
└────────────────────────────────────────────────────────────┘
↓ protocol events
┌────────────────────────────────────────────────────────────┐
│ Layer 1: Viewer │
│ three.js r184 · glTF / GLB · Draco / KTX2 / Meshopt │
│ Animations · Morph targets · HDR · Validation │
└────────────────────────────────────────────────────────────┘
```
The event bus decouples every component. The avatar emotion system reacts to `speak` events without knowing the runtime exists. The identity module records actions without knowing the UI exists. This makes the system testable, embeddable in isolation, and composable across pages.
The backend is stateless serverless functions. All persistent state lives in Postgres (Neon), object storage (Cloudflare R2), or on-chain. Cron jobs handle scheduled blockchain operations (ERC-8004 crawl, DCA execution, subscription execution).
### Design Docs & Specs
The architecture above is the bird's-eye view; each load-bearing surface has a dedicated spec that defines its wire format, invariants, and extension points. New contributors should skim the spec for any subsystem they're about to change.
| Spec | What it covers |
| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| [specs/AGENT_MANIFEST.md](specs/AGENT_MANIFEST.md) | Agent manifest JSON schema — body, brain, voice, memory, skills, signing. The contract every `<agent-3d>` reads. |
| [specs/3D_AGENT_CARD.md](specs/3D_AGENT_CARD.md) | The on-chain passport card layout — fields, signing, and rendering rules. |
| [specs/SKILL_SPEC.md](specs/SKILL_SPEC.md) | Skill bundle layout (`SKILL.md`, `tools.json`, `handlers.js`), trust modes, and distribution. |
| [specs/PERMISSIONS_SPEC.md](specs/PERMISSIONS_SPEC.md) | EIP-7710 delegated permissions model — capability scopes, redemption, revocation. |
| [specs/MEMORY_SPEC.md](specs/MEMORY_SPEC.md) | Memory file format, types, salience model, and storage modes. |
| [specs/STAGE_SPEC.md](specs/STAGE_SPEC.md) | Scene/stage configuration: camera presets, lighting, environment maps, hotspots. |
| [specs/EDITOR_SPEC.md](specs/EDITOR_SPEC.md) | Widget Studio + Embed Editor configuration surface and persistence shape. |
| [specs/EMBED_SPEC.md](specs/EMBED_SPEC.md) | The `<agent-3d>` element and chromeless iframe — attributes, JS API, and lifecycle. |
| [specs/EMBED_HOST_PROTOCOL.md](specs/EMBED_HOST_PROTOCOL.md) | `postMessage` wire protocol between the iframe and its host page (origin lock, message kinds, RTT). |
| [specs/CLAUDE_ARTIFACT.md](specs/CLAUDE_ARTIFACT.md) | Claude Artifact viewer integration — snippet loading and sandbox boundaries. |
| [specs/ENS_AGENT_CLAIM.md](specs/ENS_AGENT_CLAIM.md) | ENS-based agent claim flow for verifiable owner ↔ agent binding. |
| [specs/VALIDATORS.md](specs/VALIDATORS.md) | Validator attestation rules — what gets signed, who can sign, how to read attestations. |
| [specs/SECURITY.md](specs/SECURITY.md) | Threat model, trust boundaries, and the hardening checklist for production deployments. |
Longer-form architecture and how-to documentation lives under [docs/](docs/): [docs/architecture.md](docs/architecture.md), [docs/agent-system.md](docs/agent-system.md), [docs/3d-asset-pipeline.md](docs/3d-asset-pipeline.md), [docs/animations.md](docs/animations.md), [docs/web-component.md](docs/web-component.md), [docs/api-reference.md](docs/api-reference.md), [docs/mcp.md](docs/mcp.md), [docs/permissions.md](docs/permissions.md), [docs/security.md](docs/security.md), [docs/smart-contracts.md](docs/smart-contracts.md), and more.
### 3D asset pipeline — FBX, GLB, JSON
Every avatar the site renders is a **GLB** (binary glTF 2.0 — the body, rig, and textures in one file); every shared gesture and dance is a format-light **clip JSON** (a serialized `THREE.AnimationClip` — motion only, retargeted onto any rig at runtime); and both originate as **FBX** source from Mixamo or a DCC tool. Two conversions come off one FBX — `npm run convert:fbx` for a full character GLB, `npm run build:animations` for a reusable library clip — then `npm run optimize:glb` makes it web-ready (~90% smaller). The full explainer, format specs, runtime modules, and the generate→rig→animate→export capability chain are in **[docs/3d-asset-pipeline.md](docs/3d-asset-pipeline.md)**.
---
## Tech Stack
**Frontend**
- **Main UI**: The core application, including the 3D viewer, agent creation, and marketplace, is built with vanilla JavaScript modules and Vite.
- **Chat**: The chat interface is a standalone Svelte application located in the `chat/` directory.
- **3D Rendering**: three.js (r184) is used for WebGL 2.0 rendering.
**Backend (Google Cloud Run)**
- **Runtime**: Node.js — serverless-style handlers in `api/` served by one Express container ([server/index.mjs](server/index.mjs)) on Cloud Run (`three-ws-api`, `us-central1`).
- **Database**: Neon Postgres (serverless)
- **Storage**: Cloudflare R2 for model and avatar storage.
- **Rate Limiting**: Upstash Redis.
- **LLM**: The agent's brain is powered by the Anthropic (Claude) SDK.
**Smart Contracts**
- **Language**: Solidity 0.8+
- **Framework**: Foundry for compiling, testing, and deploying the ERC-8004 contracts.
- **Standards**: ERC-721, EIP-712, EIP-7710.
### Browser Support
The viewer targets every browser that ships WebGL 2.0 on a desktop or modern mobile device. Concrete support matrix:
| Browser | Minimum | Notes |
| ------------------------ | --------- | ------------------------------------------------------------------------------------------------------------------ |
| Chrome / Edge (Chromium) | 113+ | Full feature set including WebGPU experiments behind a flag. Recommended for development. |
| Safari (macOS / iOS) | 16.4+ | WebGL 2.0, Web Speech recognition (iOS 16.4 added support behind a permission prompt). Voice input requires HTTPS. |
| Firefox | 115+ | KTX2 / Meshopt decoders all supported. Web Speech recognition is feature-gated by user-locale. |
| Mobile Safari | iOS 16.4+ | Touch controls and gyroscope mapped through `OrbitControls`. |
| Android Chrome | 113+ | Full feature set; AR button surfaces a Scene Viewer intent when present. |
**Capabilities and graceful degradation**
- **WebGL 2.0** is required; the viewer refuses to boot without it and shows a fallback message.
- **WebAssembly** is required for the Draco / KTX2 / Meshopt decoders that are copied into `public/three/draco/` and `public/three/basis/` by `scripts/copy-three-decoders.mjs` on `postinstall` (both paths are generated and gitignored, so they only exist after `npm install`), plus `node_modules/three/examples/jsm/libs/`.
- **`getUserMedia` (microphone)** requires HTTPS — see [Common gotchas](#common-gotchas). Without it the agent falls back to text input.
- **`speechSynthesis`** is detected at runtime; agents fall back to silent text replies when TTS is unavailable.
- **WebGPU** is not required and is not used yet — Phase 4 reserves it for client-side inference experiments.
---
## Project Structure
- `src/`: The core frontend JavaScript for the main application, including the 3D viewer, agent protocol, custom element, and feature modules (`club-*.js`, `walk*.js`, `pose-*.js`, `voice/`, `selfie-*.js`). Social/gameplay surfaces live in `game/` (Coin Communities: `coincommunities*`, `spin-wheel-ui`, `cosmetics-visual`, `avatar-rig`), `city/` (the `/city` world), `social/` (sentiment, X-post impact), `community/` (coin lobby/town), plus `friends.js`, `communities.js`, `marketplace*.js`, and `token-pay.js`.
- `api/`: Serverless-style handlers that form the backend API, served in production by the Cloud Run container ([server/index.mjs](server/index.mjs)) with `vercel.json`-parity routing. Subdirectories include `x402/`, `a2a/`, `club/`, `pump/`, `persona/`, `news/`, `admin/`, `agents/`, `auth/`, `oauth/`, `cron/`, plus the social/game surfaces `play/`, `token/`, `three-token/`, `friends/`, `social/`, `community/`, `marketplace/`, and `mocap/`.
- `public/`: Static assets and various sub-applications (`club/`, `seeker/`, `news/`, `persona/`, `vanity-wallet.html`, `pumpfun.html`).
- `chat/`: A standalone Svelte application for the chat interface.
- `character-studio/`: A sub-project for in-browser character creation; also serves the rebranded **Avatar Studio** marketplace.
- `rider/`: A-Frame WebVR music visualization experiment.
- `contracts/`: Solidity smart contracts for on-chain identity (ERC-8004) and the multichain payment factory.
- `multiplayer/`: Colyseus WebSocket server for `/walk` and `/play` (WalkRoom); deployable on Fly.io. Holds the authoritative world logic and single sources of truth — `items.js`, `playerStore.js`, `game-token.js`, `play-pass.js`, `holder-pass.js`, and the per-account `social-hub.js`.
- `sdk/`: `@three-ws/sdk` (the AgentKit SDK; the legacy avatar helpers live in `sdk/agent-sdk/`).
- `agent-payments-sdk/`: EVM agent payments SDK (Base / BSC / other EVM chains).
- `solana-agent-sdk/`: SDK for Solana blockchain interactions (Metaplex Core mints, SIWS, attestations).
- `pump-fun-skills/`: Skills related to the pump.fun integration.
- `scripts/`: Node.js scripts for development, build, deployment, and pump.fun launch automation.
- `workers/`: Code for background workers — includes the Cloudflare Worker mirror of the pump.fun MCP read API in [`workers/pump-fun-mcp/`](workers/pump-fun-mcp/).
- `docs/`: Public-facing developer docs.
- `docs/internal/`: Working docs (PLAN, STATUS, TODO, NEXT, PROGRESS, RELEASE_CHECKLIST, club venue notes) — not part of the published docs surface.
- `tests/`: Vitest unit tests (`tests/api/`, `tests/src/`, `tests/workers/`) and Playwright end-to-end smokes (`tests/e2e/`).
---
## The Agent System
### Event Bus (Agent Protocol)
`src/agent-protocol.js` implements a lightweight `EventTarget` subclass that is the nervous system of the platform. Every component — avatar, runtime, identity, UI — communicates exclusively through this bus. There are no direct method calls between layers.
The bus maintains a 200-action ring buffer for debugging and replay. Embed variants expose a filtered subset of events through `postMessage` to the host page.
**Core event types:**
| Event | Payload | Who emits | Who listens |
| ------------------------- | ---------------------------------------- | --------------- | ----------------------------------------- |
| `speak` | `{ text, sentiment: -1..1 }` | runtime, skills | avatar (emotion), identity (log), chat UI |
| `think` | `{ thought }` | runtime | home (timeline), avatar |
| `gesture` | `{ name, duration }` | avatar, skills | avatar (one-shot clip) |
| `emote` | `{ trigger, weight: 0..1 }` | avatar | avatar (emotion inject) |
| `look-at` | `{ target: 'user'\|'camera'\|'center' }` | skills | scene controller |
| `perform-skill` | `{ skill, args, animationHint }` | runtime | skill registry |
| `skill-done` | `{ skill, result }` | skills | avatar, identity |
| `skill-error` | `{ skill, error }` | skills | avatar, identity |
| `remember` | `{ type, content, ... }` | skills, runtime | memory, identity |
| `load-start` / `load-end` | `{ uri, error? }` | viewer | avatar (emotion) |
| `validate` | `{ errors, warnings }` | validator | avatar, identity |
| `presence` | `{ state }` | element | home UI |
Identity-relevant events (`speak`, `remember`, `sign`, `skill-done`, `validate`, `load-end`) are fire-and-forwarded to `POST /api/agent-actions` for durable logging.
### LLM Runtime
`src/runtime/index.js` implements the `Runtime` class, which drives the agent's LLM-powered brain.
**Tool-loop flow:**
1. User message (text or STT transcript) arrives
2. System prompt is assembled: manifest instructions + recalled memory + skill descriptions
3. Claude is called with the conversation history and all available tools
4. Tool calls are dispatched in order — each built-in tool or skill handler receives a rich context object:
```js
{
viewer,
memory,
llm,
speak,
listen,
fetch,
loadGLB,
loadClip,
loadJSON,
call,
stage,
agentId;
}
```
5. Tool results are appended to conversation history as `tool_result` messages
6. Steps 3–5 repeat until Claude returns with no tool calls, or the iteration limit (8) is hit
7. Final text response is optionally spoken via TTS
**Providers** (`src/runtime/providers.js`):
- `AnthropicProvider` — connects to the Anthropic API, supports streaming
- `NullProvider` — no-op for testing and offline mode
**Built-in tools** (`src/runtime/tools.js`):
| Tool | Description |
| --------------- | ----------------------------------------------------------------- |
| `wave` | Play a wave gesture animation |
| `lookAt` | Direct the agent's gaze (user, camera, or scene center) |
| `play_clip` | Play a named animation clip from the model or animation library |
| `setExpression` | Set a named morph target weight directly |
| `speak` | Emit text through TTS and the protocol bus |
| `remember` | Write a memory entry (user, feedback, project, or reference type) |
Skills can define additional tools that override or augment the built-ins. The skill registry is loaded from the agent manifest before each conversation turn.
### Empathy Layer
`src/agent-avatar.js` implements the Empathy Layer — a continuous weighted emotion blend that drives the avatar's facial morph targets and head orientation in real time.
Emotions are not a finite-state machine. Each emotion is a float (0..1) that decays linearly per frame at a different rate. Protocol events inject spikes:
| Trigger | Emotion | Spike |
| ---------------------------- | -------------------- | ----------- |
| `speak` (positive sentiment) | celebration | +0.7 |
| `speak` (negative sentiment) | concern | +0.5 |
| `skill-error` | concern + empathy | +0.6 / +0.5 |
| `load-start` | patience + curiosity | +0.4 / +0.3 |
| `validate` (clean) | celebration | +0.5 |
| `validate` (errors) | concern | +0.6 |
Decay half-lives (approximate):
- Patience: ~20s — persists during long operations
- Empathy: ~13s — lingers after emotional events
- Concern: ~12s — sustained worry
- Curiosity: ~8s — alert, fades moderately
- Celebration: ~6s — brief, upbeat
The blended emotion mix drives morph target values each frame. For example:
- Celebration → `mouthSmile 0.85`, `mouthOpen 0.2`
- Concern → `mouthFrown 0.55`, `browInnerUp 0.6`
- Empathy → `eyeSquint 0.4`, `browInnerUp 0.5`
Head tilt and lean are also driven by the blend — curiosity tilts the head, patience leans slightly back.
This architecture means the avatar feels responsive and emotionally coherent without any hand-authored animation triggers.
### Skills
Skills are self-contained capability bundles that extend the agent's tool set. Each skill lives in its own directory:
```
skills/wave/
├── SKILL.md # Human-readable description and usage instructions
├── tools.json # Tool definitions (name, description, input JSON schema)
└── handlers.js # Async handler functions (default export)
```
**tools.json example:**
```json
[
{
"name": "wave",
"description": "Plays a waving gesture on the avatar for the specified duration.",
"inputSchema": {
"type": "object",
"properties": {
"duration_ms": { "type": "integer", "minimum": 500, "maximum": 5000 }
}
}
}
]
```
**handlers.js example:**
```js
export default {
async wave(args, ctx) {
const { viewer, speak } = ctx;
await viewer.playClipByName('wave');
return { ok: true, output: 'Waved!' };
},
};
```
Skills are loaded from the agent manifest at runtime. The `SkillRegistry` supports three trust modes:
- `any` — install skills from any source (development only)
- `owned-only` — only skills the agent owner has registered
- `whitelist` — only approved skill URIs
Skills are distributed over IPFS, Arweave, or HTTP. The public skills registry is at `/public/skills-index.json`.
### Memory
`src/memory/index.js` implements a file-based memory system (mirroring this project's own Claude memory system). Memories are Markdown files with YAML frontmatter, organized by type:
```markdown
---
type: user
key: user_role
name: User's Role
created: 2024-01-15T10:30:00Z
salience: 0.95
---
User is a game developer interested in character animation.
```
A `MEMORY.md` index file is auto-maintained. At the start of each conversation turn, the memory store is scanned and high-salience entries are injected into the system prompt.
**Storage modes:**
- `local` — stored in the browser's local storage (default for development)
- `remote` — persisted per-agent via `/api/agent-memory` (owner-only)
- `ipfs` — pinned to IPFS via Pinata or Web3.Storage
- `encrypted-ipfs` — encrypted before pinning (user holds the key)
- `none` — stateless, no memory between sessions
Memory types (`user`, `feedback`, `project`, `reference`) follow the same taxonomy used by this codebase's own Claude guidelines.
#### Plugging a custom memory backend
You don't fork `Memory` to add a vector store or episodic log — register a backend and select it by name. Built-in modes are unchanged; your mode is just another option.
```js
import { Memory } from 'https://three.ws/agent-3d/latest/agent-3d.js';
Memory.registerBackend('vector', {
async load({ namespace }) {
const rows = await myVectorStore.fetchAll(namespace);
return { files: Object.fromEntries(rows.map((r) => [r.filename, r.markdown])) };
},
async persist(memory) { // after every write()/note()
await myVectorStore.replace(memory.namespace, [...memory.files]);
await myEpisodicLog.replace(memory.namespace, memory.timeline);
},
async recall(query, memory, { limit = 5 } = {}) { // real semantic search
const m = await myVectorStore.search(memory.namespace, query, limit);
return m.map((x) => ({ file: x.filename, meta: x.meta, body: x.body, score: x.score }));
},
});
```
```html
<agent-3d src="agent://…" memory="vector"></agent-3d>
```
Only `load` is required; `persist` makes it durable, `recall` makes search semantic (it falls back to substring matching if it throws). To swap *only* the ranker while keeping built-in storage, point `manifest.json → memory.retriever` at a skill instead. Full reference: [specs/MEMORY_SPEC.md → Custom backends](specs/MEMORY_SPEC.md).
#### Memory snapshot contract
`memory.snapshot()` returns a synchronous, JSON-safe `memory/0.1` object so embedded widgets can serialize/deserialize state across page reloads; `Memory.fromSnapshot(snap, { mode, namespace })` rehydrates it (rebuilding the index if absent).
```js
sessionStorage.setItem('agent-mem', JSON.stringify(agent.memory.snapshot()));
// …after reload:
const restored = Memory.fromSnapshot(JSON.parse(sessionStorage.getItem('agent-mem')));
```
---
## Animation System
The avatar runtime ships with a slot-based animation manager that decouples animation clips from rigs — a clip authored for one body can be retargeted to any other rig at load time.
| Module | Path | Role |
| ------------- | ---------------------------------------------------------------- | --------------------------------------------------------------------- |
| Manager | [src/animation-manager.js](src/animation-manager.js) | Load, blend, and crossfade clips per slot (idle, gesture, locomotion) |
| State machine | [src/animation-state-machine.js](src/animation-state-machine.js) | Drives slot transitions from protocol events |
| Idle library | [src/idle-animation.js](src/idle-animation.js) | Subtle breath / weight-shift loops that play under everything else |
| Fetcher | `npm run fetch-animations` | Downloads the canonical clip library from R2 |
| Builder | `scripts/build-animations.mjs` | Re-packs clip bundles into Meshopt + Draco-compressed GLB |
A new clip can be authored against any rig in Blender, exported as a GLB, and dropped into the animation library — the manager picks it up automatically and the agent runtime can invoke it via the `play_clip` tool.
The **`sitidle` clip** is shipped as the default seated idle for chat-mode avatars; the **gemini-jump clip** drives the hero on `/`.
---
## Web Component & Embedding
The `<agent-3d>` custom element (`src/element.js`) is the primary distribution mechanism. It lazy-boots on intersection (IntersectionObserver), so off-screen agents don't load until visible.
**Basic usage:**
```html
<script src="https://three.ws/agent-3d/latest/agent-3d.js"></script>
<agent-3d
body="https://three.ws/avatars/michelle.glb"
brain="https://example.com/manifest.json"
mode="chat"
></agent-3d>
```
**Key attributes:**
| Attribute | Type | Description |
| ------------------ | --------------------------- | ----------------------------------------------------- |
| `body` | URL | GLB model URL |
| `brain` | URL | Agent manifest JSON URL |
| `agent-id` | string | Registered agent ID (resolves manifest automatically) |
| `mode` | `view` \| `chat` \| `embed` | Interaction mode |
| `eager` | boolean | Load immediately without intersection check |
| `sandbox` | boolean | Disable network calls (offline mode) |
| `width` / `height` | number | iframe dimensions when generating embed code |
The element fires a `postMessage` API for host-page communication (documented in `specs/EMBED_HOST_PROTOCOL.md`). Hosts can send events to the agent and receive `speak`, `think`, and `skill-done` events back.
**Versioned CDN bundles** are published at `/agent-3d/x.y.z/agent-3d.js`. Use `latest` for auto-updates or pin to a version for stability:
```html
<script src="https://three.ws/agent-3d/1.5.2/agent-3d.js"></script>
```
### Iframe quickstart with the embed SDK
For when you want a chromeless iframe that you control from the parent page (rather than the `<agent-3d>` web component), drop in the embed SDK:
```html
<iframe
id="agent"
src="https://three.ws/agent/abc123/embed"
style="width:480px;height:600px;border:0"
></iframe>
<script src="https://three.ws/embed-sdk.js"></script>
<script>
const bridge = Agent3D.connect(document.getElementById('agent'), {
agentId: 'abc123',
onReady: ({ name }) => console.log('agent ready:', name),
onAction: (action) => console.log('agent action:', action),
onError: (err) => console.error('embed error:', err),
});
// Drive the agent
bridge.send({ type: 'speak', payload: { text: 'Hello!' } });
bridge.ping().then((rttMs) => console.log('rtt', rttMs, 'ms'));
</script>
```
**Origin contract.** The SDK derives the iframe's origin from `iframe.src` and refuses to start if it can't (no wildcard targets, ever). The iframe locks onto the parent's origin from the first authenticated message it sees and ignores any later messages from a different origin. See [specs/EMBED_SPEC.md](specs/EMBED_SPEC.md) §"Bridge origin model" for the full rules.
### Typed host bridge (npm-friendly)
For TypeScript/bundler workflows, import `EmbedHostBridge` directly:
```js
import { EmbedHostBridge } from 'three-ws/embed-host-bridge';
const iframe = document.getElementById('agent');
const bridge = new EmbedHostBridge({
iframe,
agentId: 'abc123',
allowedOrigin: new URL(iframe.src).origin, // required, never '*'
});
await bridge.ready;
await bridge.speak('Hello world');
const off = bridge.on('action', (a) => console.log(a));
// Clean up when done.
off();
bridge.destroy();
```
Both surfaces speak the same v1 wire protocol — pick the one that fits your stack.
---
## Widget System
The Widget Studio ([three.ws/studio](https://three.ws/studio)) lets anyone build a shareable, embeddable 3D experience without writing code. Pick an avatar, pick a widget type, configure it, and get an iframe snippet.
[](https://three.ws/studio)
**Five widget types:**
| Widget | Description |
| --------------------- | ------------------------------------------------------------------------------------------ |
| **Turntable** | Auto-rotating model showcase with configurable background, lighting, and camera |
| **Animation Gallery** | Paginated grid of named clips; click any to play it on the model |
| **Talking Agent** | Full chat interface with the LLM brain; embed a conversational agent anywhere |
| **ERC-8004 Passport** | On-chain identity card — shows agent name, owner, reputation score, and verification badge |
| **Hotspot Tour** | 3D hotspots pinned to world-space coordinates; click to reveal text annotations |
Each widget has:
- A public URL at `/w/<id>` with server-rendered Open Graph metadata for rich link previews
- An oEmbed endpoint at `/api/widgets/oembed` for WordPress, Ghost, Notion embedding
- An iframe embed URL at `/api/widgets/<id>/view`
- A view counter tracked at `/api/widgets/<id>/stats`
- A duplicate API at `/api/widgets/<id>/duplicate`
Widgets are stored as JSON config in Postgres, pointing at an avatar in R2.
---
## Embed Editor
The **Embed editor** at [three.ws/embed](https://three.ws/embed) ([src/editor/embed-editor.js](src/editor/embed-editor.js)) is a WYSIWYG configurator for embedding a three.ws avatar or agent on any website. Pick an avatar from the gallery picker, choose an embed mode, tune the environment and size, and copy a ready-to-paste snippet.
[](https://three.ws/embed)
| Feature | Description |
| -------------------- | ---------------------------------------------------------------------------------------- |
| **Four embed modes** | Static (idle pose), Idle (drifts on its own), Walking (joystick/keyboard), Chat (agent page iframe) |
| **Avatar picker** | Gallery modal (`src/avatar-gallery-picker.js`) — pick any avatar without leaving the page |
| **Live preview** | Renders the exact runtime the snippet ships — `/walk-embed` or `/a/<id>?embed=1` |
| **Environments** | Studio (transparent), Void, Beach, Sunset, Night, Grid |
| **Size presets** | S / M / L plus custom width × height |
| **Snippet UX** | Real clipboard copy of the iframe or script-tag form, with per-platform paste instructions (HTML, React, WordPress, Webflow, Shopify) |
| **Deep-linkable** | Every control reflects into the URL query, so a configured embed can be shared and re-opened |
---
## Pose Studio
[three.ws/pose](https://three.ws/pose) is a 3D pose-reference tool inspired by setpose.com. It builds a Three.js scene with an articulated mannequin, orbit camera, ground + grid, and a control panel that lets you pick presets, drag joints to pose them, fine-tune with sliders, swap body type, add floor props, change lighting and FOV, and export a PNG screenshot.
[](https://three.ws/pose)
| Module | Path | Role |
| -------------- | ---------------------------------------------- | ------------------------------------------- |
| Mannequin | [src/pose-rig.js](src/pose-rig.js) | Articulated rig with named joints + IK |
| Preset library | [src/pose-presets.js](src/pose-presets.js) | Standing, sitting, action, idle, expressive |
| Studio shell | [src/pose-studio.js](src/pose-studio.js) | Scene, controls, export, props, lighting |
Poses author cleanly into the avatar runtime via the `play_clip` tool — the agent can adopt any saved pose on demand. Exported PNGs are useful as marketing renders or as reference frames for downstream image/video pipelines.
---
## Avatar Accessories & Coin Launchpad
Avatars are not just GLB files — they're composable rigs that the runtime can decorate with onchain accessories.
### Accessories
- Hats, glasses, props attached to named bone slots via [src/agent-accessories.js](src/agent-accessories.js)
- Accessories are themselves ERC-1155 tokens, ownable and tradeable independently of the avatar
- Equipping is non-destructive — the agent's base manifest stays unchanged, the accessory is layered at runtime
### Coin Launchpad
Every agent can mint a coin alongside its avatar — turning the agent into a tradeable economic object.
| Surface | Path | Purpose |
| ---------------- | ---------------------------- | ------------------------------------------------------------------ |
| Launchpad Studio | `/launchpad` | Configure coin name, ticker, supply, fee shares |
| Hosted page | `/p/[slug]` | Public launch page with `<agent-3d>` widget + buy button |
| Avatar coin drop | `public/demo/coin/` | Demo flow — connect wallet → mint avatar + coin in one transaction |
| Pump.fun bridge | `POST /api/pump/launch-prep` | Route the launch through pump.fun's bonding curve |
| Direct mint | `contracts/script/` | Deploy a standalone ERC-20 / SPL-22 alongside the agent |
The coin's metadata points back at the agent's onchain identity — ERC-8004 token on EVM or Metaplex Core asset on Solana — and the agent's manifest references the coin. The two-way binding is read from the bazaar, marketplace, and reputation registry on either chain.
---
## Launchpad
The **Launchpad** at [three.ws/launchpad](https://three.ws/launchpad) is a hosted-page builder for token launches, agent debuts, and drop campaigns. Each published page lives at a public URL like `/p/<slug>` with full Open Graph metadata for sharing. The live launch directory is at [three.ws/launches](https://three.ws/launches).
[](https://three.ws/launchpad)
| Surface | Path | Purpose |
| ----------- | ------------------------- | -------------------------------------------------------------------- |
| Studio | `/launchpad` | Authoring UI — pick a template, configure copy, avatar, mint targets |
| Public page | `/p/[slug]` | Hosted landing page rendered server-side with OG card |
| Publish API | `POST /api/launchpad/...` | Versioned publish + revert for the page bundle |
Launchpad templates are JSON-configured and can embed any combination of `<agent-3d>` widget, x402 paid endpoint, or pump.fun launch button. Pages are stored in Postgres and served as static HTML with hydration for interactive elements.
---
## The Club
[three.ws/club](https://three.ws/club) is a multiplayer 3D venue: a club scene with rigged dancers, audio tracks, spotlights, mirror-ball cube cam, and on-chain tips (screenshot in the [gallery above](#screenshots)).
**Stack:**
- Venue GLB + HDRI lit by four spotlights; bloom + chromatic aberration on the high tier
- Audio tracks streamed from R2 with synchronized playback across clients
- Camera state machine — DJ booth, overhead, dance-floor, follow-cam — sequenced per track
- Performance profile detector picks `high` / `medium` / `low` from `navigator.deviceMemory`, `hardwareConcurrency`, `pointer: coarse`, and the UA string
- Frame-budget watchdog auto-downgrades the profile if sustained slow frames are detected
**Economics:**
- Tips API at `/api/club/tips` — viewers tip dancers in USDC via x402 (CDP-settled, Permit2-gasless sibling available)
- Leaderboard at `/api/club/leaderboard` with windowed top-tipper rankings, memoized for 15s so a full room costs one aggregate per window rather than one per viewer, and answering `503` with a retry hint when the database is over capacity instead of a bare failure
- Live tip feed at `/api/club/tips-stream` (SSE); a cold stream rewinds its cursor to the moment the first viewer arrives, so a room that went quiet does not replay the banked backlog as if it were live
- Hourly payouts cron sweeps the tips ledger into the dancers' treasury wallets
**Detail:** performance notes, venue plan, and release checklist live in `docs/internal/` alongside other internal working docs.
---
## Walk & Multiplayer
[three.ws/walk](https://three.ws/walk) is an authoritative multiplayer walk scene. Players join a shared 3D space, see each other's avatars in real time, and emit gestures over a WebSocket connection.
[](https://three.ws/walk)
The serverless-style request/response layer can't hold long-lived WebSockets, so the multiplayer server lives in its own workspace at [`multiplayer/`](multiplayer/) — a [Colyseus](https://colyseus.io) server packaged with a Fly.io `fly.toml` and Dockerfile. The Vite client at `/walk` autodiscovers the server (`ws://localhost:2567` in dev, your deployed host in prod).
```bash
# Run both servers together
npm run dev:walk-all # Vite (:3000) + Colyseus (:2567)
```
**WalkRoom** (`multiplayer/src/rooms/WalkRoom.js`) is the authoritative state container — position, rotation, gesture, presence. Origin allow-listing is enforced at the WS upgrade (`ALLOWED_ORIGINS` env, with `*.vercel.app` and `*.three.ws` always permitted for preview deploys). The same Colyseus server also runs a per-account **social hub** (`multiplayer/src/social-hub.js`) for presence and live event delivery.
---
## Coin Communities
Every Solana token gets a **live 3D world**. Coin Communities ([three.ws/communities](https://three.ws/communities), screenshot in the [gallery above](#screenshots)) turns a mint address into a shared multiplayer space: pick the same coin as someone else and you land together, walk around, emote, voice-chat, build with voxels, and watch the live market-cap chart on an in-world screen.
| Surface | Route | What it does |
| ----------------- | --------------------------- | --------------------------------------------------------------------------------------------------- |
| Lobby | `/communities`, `/worlds` | Browse real pump.fun trending coins + search, pick an avatar, drop into a world |
| Coin profile | `/communities/[mint]` | Deep-linkable coin page — metadata, bonding-curve price, graduation progress, recent trades |
| 3D world | `/play` | The shared coin-keyed world — peer avatars, name labels, chat, emotes, voxel building, market screen |
**How it works**
- **Real pump.fun data, no mocks.** The lobby and coin profiles pull live trending coins, search results, bonding-curve pricing, and recent trades from the pump.fun feed.
- **Bring any avatar.** Use a default, an uploaded GLB/VRM, or paste a model URL. The same rig (`src/game/avatar-rig.js`) drives `/play`, `/walk`, and `/city` with no drift.
- **Realtime presence + chat.** Each coin is its own room. Town chat is backed by the [CoinCommunities](https://coin-communities.xyz) service — reads work out of the box; posting unlocks behind X-OAuth sign-in + a linked wallet. If `CC_API_KEY` is unset, chat renders its designed locked state.
- **Voxel building & spatial voice.** Collaborative block placement (server-capped) and optional geofenced WebRTC voice (`src/game/voice-chat.js`).
- **Holder-gated rooms.** A coin can require token holders (tier `holders` vs general); gating is enforced server-side via a sealed play-pass.
**Key files:** `src/communities.js` (lobby), `src/game/coincommunities.js` + `coincommunities-ui.js` (3D scene + HUD), `src/game/community-net.js` (socket bridge), `api/community/*` (worlds, messages, ws-ticket, capabilities, me), `api/_lib/coin-communities.js` (CoinCommunities SDK client). Coin art comes through the platform image proxy rather than straight off a launch metadata URI, so a hot-linked image that blocks cross-origin reads still renders instead of leaving a broken tile.
---
## Coin Wars & Live Events
Two coin communities can meet in one arena and fight for their coin. Every world on `/play` carries a **war portal** in its plaza (`src/game/war-portal.js`): walk up to it and the board shows the community's Elo rating, rank, record, K/D, and its last battles. Press `E` to queue; when a second community queues, both sides are handed the same battle and the arena opens at [three.ws/play/war](https://three.ws/play/war).
The gate is server-side, not cosmetic: the arena will not seat you under a community whose coin you do not hold, and the pairing itself is sealed into a signed war ticket so a fighter cannot open an arena against a community that never agreed to fight. Results are written to a battle ledger and the league is folded from that ledger by `multiplayer/src/war-standings.js`, the same module the arena's own league reads, so a portal board is never a second opinion. One endpoint serves all of it: `GET /api/wars` (board), `GET /api/wars?action=live` (spectator poll), `POST /api/wars?action=queue|leave`, and the game server's HMAC-signed `?action=report` write ([api/wars.js](api/wars.js)). Full reference: [docs/coin-wars.md](docs/coin-wars.md).
Live events run in the same world. A countdown, an agenda, per-segment banners, and a synchronized fireworks show are driven from one config file, so an event exists (or stops existing) without a code change (`src/game/meetup-event.js`, `src/game/event-countdown.js`, [docs/play-live-events.md](docs/play-live-events.md)). Everyone who walks into the event world while it is live is handed a free commemorative wearable that is never granted again afterwards and is never purchasable: see [docs/event-souvenirs.md](docs/event-souvenirs.md).
---
## City
[three.ws/city](https://three.ws/city) is a free-roam 3D city scene: a walkable urban world (real Manhattan map data) with a follow camera, map, and player controller, built on the same Three.js stack as the rest of the platform.
[](https://three.ws/city)
**Key files:** `src/city/city-world.js` (scene + render loop), `city-map.js` (layout), `city-player.js` (movement/controller), `city-camera.js` (follow cam), `city.css`.
---
## Friends, Presence & Social
A full account-level social layer spans the multiplayer surfaces. Friendships are durable; presence is volatile — and both are keyed to the account, not the ephemeral session, so they survive reconnects and realm changes.
| Capability | Backed by |
| -------------- | --------------------------------------------------------------------------------------------------------------- |
| **Friends graph** | `POST /api/friends` (request, accept, decline, remove, mute, unmute), `GET /api/friends` (graph + live presence) |
| **User search** | `GET /api/friends/search?q=` — find accounts by display name, relationship status inline |
| **Direct messages** | `GET`/`POST /api/friends/messages` — DM threads, live delivery when online + durable queue for offline |
| **Presence** | Short-lived signed ticket (`GET /api/friends/presence-ticket`) → multiplayer server writes `presence:<uid>` to Redis (75s TTL, 30s heartbeat) |
| **Live delivery** | The social hub (`multiplayer/src/social-hub.js`) pushes DM + friend events to every open socket for an account |
Friends are stored in Postgres (`friendships`, `direct_messages`, `user_mutes` — see migration `api/_lib/migrations/2026-06-01-friends.sql`); presence lives in Upstash Redis and self-heals if a process dies. Muting is send-side only — a muted account is never told it was muted. The friends panel UI (`src/friends.js`, `src/game/friends-panel.js`) surfaces requests, DM threads, and "Online" / "Offline" status inside `/play`. The `src/social/` module adds sentiment + X-post-impact scoring used by community surfaces.
---
## In-Game Economy
The [three.ws/play](https://three.ws/play) open world runs on two currencies that are kept strictly separate, and the separation is the whole design. **Cash** (the carried purse) is a pure game resource: earned by gathering, fishing, and combat, spent at vendors, never on-chain and never a token. **`$THREE`** is the platform's only coin, spent on-chain from the player's connected Solana wallet to unlock premium cosmetics. Price tables live in one module (`multiplayer/src/shop.js`) that the authoritative server and the client both import, so the price a player is shown is exactly the price the server charges.
| Surface | Walk up to | What it does |
| --- | --- | --- |
| **General Store** | a clerk NPC (`E`) | Sell gathered goods (wood, stone, coal, fish, cooked fish, bones, hide) at fixed vendor rates, or buy tools, consumables, ammo, and the armor vest with cash. Only gathered and looted items are sellable: tools, weapons, mounts, and the starter kit are deliberately excluded so no player can dump their kit or farm a buy-then-sell arbitrage. |
| **Bank Teller / ATM** | a teller NPC (`E`) | Move cash between the carried purse and a protected bank balance. Dying drops the carried purse and carried items into a tombstone (`dropCarried`); banked cash survives, which is the entire risk-versus-reward point of walking to the bank. |
| **`$THREE` Boutique** | the boutique | Unlock premium wardrobe cosmetics for a real on-chain `$THREE` payment. Quote, sign, settle: the server prices the charge from the catalog (never from a client-supplied number), the player signs, and the server re-fetches the confirmed transaction from Solana RPC and checks destination and amount before granting the item. Settled quote nonces are retained as a replay guard. |
| **Wheel of Fortune** | the plaza landmark (`E`) | One free spin every 12 hours on a real persisted cooldown that survives a disconnect, or a paid spin costing $3 of `$THREE`. Paid spins split 50/50 between the holder-rewards sink and the treasury, verified on-chain before any prize is granted. All 20 wedges are equal-odds by design, matching the client's fixed-angle rendering exactly. Gated behind an average skill level of 3 as a light anti-farm floor. |
USD prices convert to `$THREE` at the live rate through `fetchTokenPriceUsd`, which walks a primary-then-fallback feed chain and caches the result briefly. If every feed is unavailable the server refuses to issue a quote rather than guessing at a price. Progression backs the whole loop: five skills (combat, woodcutting, mining, fishing, cooking) to a level cap of 99, a 24-slot inventory, and a 6-slot hotbar (`multiplayer/src/economy.js`). Server config: `GAME_TOKEN_MINT`, `GAME_TOKEN_TREASURY`, `GAME_TOKEN_DECIMALS`, `GAME_TOKEN_SECRET`.
This in-game rail is distinct from two neighbours it is easy to confuse it with: the USDC [x402](#x402-payments) cosmetic rail (`api/x402/cosmetic-purchase.js`), which sells a different catalog for the standalone character creator, and the public settled-sale cosmetics ledger at `/fits`. Vendor and banking trades settle purely in the Colyseus room state; only the boutique and paid spins touch the chain.
Every catalog, gate and odds table above is published live at **[three.ws/play/economy](https://three.ws/play/economy)**, served by `GET /api/play/economy` ([api/play/economy.js](api/play/economy.js)). That endpoint imports the game's own modules rather than restating them, so the public reference cannot drift from what the server charges. Full reference: [docs/in-game-economy.md](docs/in-game-economy.md). Hands-on walkthrough: [docs/tutorials/earn-and-spend-in-play.md](docs/tutorials/earn-and-spend-in-play.md).
---
## Voice Lab & Mocap Studio
Two creator tools sit alongside [Pose Studio](#pose-studio):
- **Voice Lab** (`/voice`, `src/voice-lab.js`) — audition and bind voices to an agent, building on the [Voice & Persona Hub](#voice--persona-hub-phase-2).
- **Mocap Studio** (`/mocap-studio`, `src/mocap-studio.js`, `api/mocap/`) — capture and retarget motion onto a rigged avatar, exporting reusable animation clips.
---
## Talk Mode & Lip-Sync
The `talk` interaction mode wires together the LLM runtime, ElevenLabs TTS, and an **audio-driven ARKit-52 lip-sync driver** that maps live audio amplitude + formant analysis onto the 52 standard ARKit blendshapes.
When the agent speaks, the driver runs at ~60fps and drives `mouthClose`, `jawOpen`, `mouthSmileLeft/Right`, and the rest of the ARKit-52 set — the Empathy Layer's emotional morphs continue to blend on top, so the avatar simultaneously emotes and articulates. Unit tests for the ARKit-52 mapping live in `tests/src/arkit-morphs.test.js`.
**Activating talk mode**
Set `mode="talk"` on the `<agent-3d>` element and supply an ElevenLabs voice ID in the agent manifest:
```json
{
"voice": {
"tts": { "provider": "elevenlabs", "voiceId": "YOUR_VOICE_ID" },
"stt": { "provider": "browser", "language": "en-US" }
}
}
```
**Pipeline (step by step)**
1. User speaks → `getUserMedia` captures audio → Web Speech API produces a text transcript.
2. Transcript enters the LLM tool-loop; the final reply text is sent to ElevenLabs TTS.
3. The returned `AudioBuffer` is piped through a Web Audio API `AnalyserNode`.
4. The lip-sync driver ([`src/voice/lipsync-driver.js`](src/voice/lipsync-driver.js)) samples the analyser every animation frame, extracts amplitude and spectral centroid, and maps them to ARKit-52 blendshape weights.
5. Weights are applied directly to the loaded GLB's morph targets via [`src/voice/avatar-morph-target.js`](src/voice/avatar-morph-target.js) — no scene re-render required.
6. The Empathy Layer injects its emotional morph weights in the same frame, so articulation and emotion blend simultaneously without fighting each other.
The driver is source-agnostic: it accepts any `AudioBuffer`, so it works identically with ElevenLabs, browser TTS, or a pre-recorded clip. The canonical ARKit-52 blendshape table lives in [`src/voice/arkit-blendshapes.js`](src/voice/arkit-blendshapes.js); per-rig binding (mapping standard names to the specific morph targets in a loaded GLB) is handled by [`src/voice/avatar-morph-target.js`](src/voice/avatar-morph-target.js).
---
## Demos Hub
[three.ws/demos](https://three.ws/demos) is a curated index of sandbox pages that exercise individual platform capabilities in isolation. Each demo is a single HTML file in [`public/demos/`](public/demos/): perfect for screen recordings, bug reproductions, or showing off one feature without the rest of the app. Every path below is a live link.
[](https://three.ws/demos)
| Demo | Path | What it shows |
| ----------------------------------- | -------------------------------- | -------------------------------------------------------- |
| **USDZ & AR Quick Look** | [`/demos/usdz-ar.html`](https://three.ws/demos/usdz-ar.html) | iOS USDZ export + AR Quick Look on a real device |
| **Half-body XR** | [`/demos/halfbody-xr.html`](https://three.ws/demos/halfbody-xr.html) | Upper-body avatar in WebXR (Meta Quest, Vision Pro) |
| **Avatar SDK** | [`/demos/avatar-sdk.html`](https://three.ws/demos/avatar-sdk.html) | `@three-ws/avatar` SDK loading + animating an avatar |
| **React SDK** | [`/demos/react-sdk.html`](https://three.ws/demos/react-sdk.html) | React wrapper around the `<agent-3d>` element |
| **Audio-driven lipsync (mic)** | [`/lipsync/mic`](https://three.ws/lipsync/mic) | Live microphone → ARKit-52 lip-sync |
| **Audio-driven lipsync (TTS)** | [`/lipsync`](https://three.ws/lipsync) | ElevenLabs TTS → ARKit-52 lip-sync |
| **Multi-LLM brain** | [`/brain`](https://three.ws/brain) | Side-by-side comparison of Claude / GPT / Groq / Gemini |
| **ERC-8004 registry browser** | [`/demos/erc8004.html`](https://three.ws/demos/erc8004.html) | Browse all registered agents across chains |
| **Button jump** | [`/demos/button-jump.html`](https://three.ws/demos/button-jump.html) | Avatar reacts to a 2D button press |
| **Create v2** | [`/demos/create-v2.html`](https://three.ws/demos/create-v2.html) | Next-generation agent creation flow |
| **3D home** | [`/demos/3d-home.html`](https://three.ws/demos/3d-home.html) | Home page with overlay canvas + transparent-bg viewer |
| **Selfie fit** | [`/demos/selfie-fit.html`](https://three.ws/demos/selfie-fit.html) | Selfie reconstruction pipeline (Phase 1) |
| **Persona extract** | [`/demos/persona-extract.html`](https://three.ws/demos/persona-extract.html) | Voice & Persona Hub onboarding interview |
| **Memory seed** | [`/demos/memory-seed.html`](https://three.ws/demos/memory-seed.html) | Memory seeding from X/GitHub/Farcaster |
| **Voice clone** | [`/demos/voice-clone.html`](https://three.ws/demos/voice-clone.html) | 3-10s recording → ElevenLabs custom voice |
| **Livepeer inference** | [`/demos/livepeer-inference.html`](https://three.ws/demos/livepeer-inference.html) | Decentralized GPU inference end-to-end |
| **Skill royalty** | [`/demos/skill-royalty.html`](https://three.ws/demos/skill-royalty.html) | Per-call royalty payouts to skill authors |
| **EAS reputation** | [`/demos/eas-reputation.html`](https://three.ws/demos/eas-reputation.html) | EAS-attested reputation viewer |
| **Bonding curve** | [`/demos/bonding-curve.html`](https://three.ws/demos/bonding-curve.html) | Pre-launch bonding-curve pricing simulator |
| **Gallery picker** | [`/demos/gallery-picker.html`](https://three.ws/demos/gallery-picker.html) | Lazy 3D-thumbnail avatar picker (Embed Editor primitive) |
| **Button** | [`/demos/button.html`](https://three.ws/demos/button.html) | Minimal `<agent-3d>` embed reaction test |
The demos are intentionally separate from production routes (`/create`, `/avatars/[id]`, etc.) so the production flow keeps working while we test new ideas.
---
## Skill Library
The platform ships with a set of built-in agent skills, packaged in `src/agent-skills-*.js` and registered via [`public/skills-index.json`](public/skills-index.json).
| Skill | Module | What it does |
| ---------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------ |
| **Wave / scene** | `src/agent-skills-scene.js` | Built-in wave, lookAt, play_clip, setExpression handlers |
| **Sentiment** | `src/agent-skills-sentiment.js` | Score incoming text 0–1, drive Empathy Layer spikes |
| **Agent payments** | `src/agent-skills-agent-payments.js` | EVM A2A payments, EIP-7710 delegated signing |
| **Solana Blinks** | `src/agent-skills-blinks.js` | Compose and broadcast Solana Action / Blink links |
| **Jupiter** | `src/agent-skills-jupiter.js` | Quote + swap any SPL token via Jupiter v6 |
| **NFTs** | `src/agent-skills-nfts.js` | Mint, transfer, and look up Metaplex Core / SPL-22 NFTs |
| **Pumpfun watch** | `src/agent-skills-pumpfun-watch.js` | Subscribe to pump.fun events (`recent-claims`, `token-intel`, `watch-start`, `watch-stop`) |
| **Pumpfun compose** | `src/agent-skills-pumpfun-compose.js` | Build a pump.fun launch transaction with creator-signer split |
| **Pumpfun hooks** | `src/agent-skills-pumpfun-hooks.js` | React-style hooks for in-app pump.fun integrations |
| **Pumpfun autonomous** | `src/agent-skills-pumpfun-autonomous.js` | Autonomous trade execution against signals + sentiment |
| **Pumpfun core** | `src/agent-skills-pumpfun.js` | Shared pump.fun client utilities |
| **Accessories** | `src/agent-accessories.js` | Hat / glasses / prop slot attachment to a rigged avatar |
| **Memory** | `src/agent-memory.js` | File-based memory CRUD (see [Memory](#memory)) |
| **Reputation** | `src/agent-reputation.js` | Read on-chain reputation, surface in the chat UI |
Third-party skills are distributed over IPFS / Arweave / HTTP. See [docs/skills.md](docs/skills.md) for the full skill manifest spec and authoring guide.
---
## Developer SDKs
Fifteen packages ship from this repo, all published to npm under the **`@three-ws`** scope. Install only what you need — each has its own README with a copy-paste quick start and a full API/tools reference.
**Avatar & 3D**
| Package | Install | What it does |
| --- | --- | --- |
| [`@three-ws/avatar`](avatar-sdk/) | [`npm i @three-ws/avatar`](https://www.npmjs.com/package/@three-ws/avatar) | 3D avatar viewer, creator iframe, AR/VR runtime + React bindings (`/react`) |
| [`@three-ws/agent-ui`](agent-ui-sdk/) | [`npm i @three-ws/agent-ui`](https://www.npmjs.com/package/@three-ws/agent-ui) | Drop a 3D avatar overlay into any UI; it reacts to buttons, inputs, and navigation |
| [`@three-ws/avatar-schema`](packages/avatar-schema/) | [`npm i @three-ws/avatar-schema`](https://www.npmjs.com/package/@three-ws/avatar-schema) | JSON Schema + validator for on-chain avatar manifests |
| [`@three-ws/viewer-presets`](packages/viewer-presets/) | [`npm i @three-ws/viewer-presets`](https://www.npmjs.com/package/@three-ws/viewer-presets) | Tuned light-rig, floor-reflection, and bloom presets for avatar viewers |
| [`@three-ws/avatar-cli`](packages/avatar-cli/) | [`npm i -g @three-ws/avatar-cli`](https://www.npmjs.com/package/@three-ws/avatar-cli) | Scaffold, validate, hash, and preview avatar manifests from your shell or CI |
**Agents & payments**
| Package | Install | What it does |
| --- | --- | --- |
| [`@three-ws/sdk`](sdk/) | [`npm i @three-ws/sdk`](https://www.npmjs.com/package/@three-ws/sdk) | Ship an ERC-8004 agent: chat panel, voice I/O, on-chain registration, `.well-known` manifests |
| [`@three-ws/solana-agent`](solana-agent-sdk/) | [`npm i @three-ws/solana-agent`](https://www.npmjs.com/package/@three-ws/solana-agent) | Solana agent ops: keypair + browser wallet, transfers, swaps, x402 exact-scheme payments |
| [`@three-ws/agent-payments`](agent-payments-sdk/) | [`npm i @three-ws/agent-payments`](https://www.npmjs.com/package/@three-ws/agent-payments) | Agent-token payments: USDC/Token-2022, v2 trades, plus EVM / x402 / a2a / cross-chain |
**MCP servers** (run over stdio with one command — also in the [official MCP registry](https://registry.modelcontextprotocol.io/?q=io.github.nirholas))
| Package | Run | What it does |
| --- | --- | --- |
| [`@three-ws/mcp-server`](mcp-server/) | [`npx -y @three-ws/mcp-server`](https://www.npmjs.com/package/@three-ws/mcp-server) | 16 tools: free text→3D (`forge_free`) + 15 paid x402: text/image→3D, rigging, pose, pump.fun, ERC-8004, vanity, AgenC, aixbt |
| [`@three-ws/avatar-agent`](packages/avatar-agent-mcp/) | [`npx -y @three-ws/avatar-agent`](https://www.npmjs.com/package/@three-ws/avatar-agent) | Spawn a textured GLB avatar with a Solana wallet, a voice, and pump.fun launch powers |
| [`@three-ws/avatar-mcp`](packages/threews-avatar-mcp/) | [`npx -y @three-ws/avatar-mcp`](https://www.npmjs.com/package/@three-ws/avatar-mcp) | Render a live, rotatable on-chain avatar inline + a paste-anywhere embed (free) |
| [`@three-ws/pumpfun-mcp`](packages/pumpfun-mcp/) | [`npx -y @three-ws/pumpfun-mcp`](https://www.npmjs.com/package/@three-ws/pumpfun-mcp) | 23 free, read-only pump.fun + Solana tools: no API key |
| [`@three-ws/three-token-mcp`](packages/three-token-mcp/) | [`npx -y @three-ws/three-token-mcp`](https://www.npmjs.com/package/@three-ws/three-token-mcp) | Price, hold, and burn **$THREE** on Solana: deflation as an agent primitive |
| [`@three-ws/ibm-watsonx-mcp`](packages/ibm-watsonx-mcp/) | [`npx -y @three-ws/ibm-watsonx-mcp`](https://www.npmjs.com/package/@three-ws/ibm-watsonx-mcp) | IBM watsonx.ai Granite (chat, generate, embed, forecast) with your own IBM key |
| [`@three-ws/ibm-x402-mcp`](packages/ibm-x402-mcp/) | [`npx -y @three-ws/ibm-x402-mcp`](https://www.npmjs.com/package/@three-ws/ibm-x402-mcp) | Pay-per-use IBM Granite: USDC on Solana, no IBM account required |
| [`@three-ws/mcp-bridge`](mcp-bridge/) | [`npx -y @three-ws/mcp-bridge`](https://www.npmjs.com/package/@three-ws/mcp-bridge) | x402 universal payer: auto-pay any x402 endpoint on the open web, with Bazaar discovery + spend caps |
| [`@three-ws/x402-mcp`](packages/x402-mcp/) | [`npx -y @three-ws/x402-mcp`](https://www.npmjs.com/package/@three-ws/x402-mcp) | Self-custodial x402 wallet: discover, inspect, and pay any x402 service in USDC |
| [`@three-ws/scene-mcp`](packages/scene-mcp/) | [`npx -y @three-ws/scene-mcp`](https://www.npmjs.com/package/@three-ws/scene-mcp) | Compose a placed 3D diorama from one sentence, then browse the saved scene gallery |
| [`@three-ws/intel-mcp`](packages/intel-mcp/) | [`npx -y @three-ws/intel-mcp`](https://www.npmjs.com/package/@three-ws/intel-mcp) | Coin smart-money scores, wallet reputation, signal feeds, and KOL leaderboards |
| [`@three-ws/vanity-mcp`](packages/vanity-mcp/) | [`npx -y @three-ws/vanity-mcp`](https://www.npmjs.com/package/@three-ws/vanity-mcp) | Solana vanity-address bounty market: quote difficulty + USDC price, browse the board |
| [`@three-ws/marketplace-mcp`](packages/marketplace-mcp/) | [`npx -y @three-ws/marketplace-mcp`](https://www.npmjs.com/package/@three-ws/marketplace-mcp) | Browse the public three.ws agent marketplace + skills catalog (read-only) |
| [`@three-ws/naming-mcp`](packages/naming-mcp/) | [`npx -y @three-ws/naming-mcp`](https://www.npmjs.com/package/@three-ws/naming-mcp) | On-chain identity for agents: resolve .sol names, reverse-lookup wallets, check handles |
Per-server deep dives (every tool, argument, env var, and example): [Scenes](https://three.ws/docs/mcp-scenes) · [x402 Wallet](https://three.ws/docs/mcp-x402) · [Intel](https://three.ws/docs/mcp-intel) · [Vanity](https://three.ws/docs/mcp-vanity) · [Naming](https://three.ws/docs/mcp-naming) · [Marketplace](https://three.ws/docs/mcp-marketplace). Full catalog: [docs/mcp.md](docs/mcp.md).
**`@three-ws/sdk` quickstart:**
```js
import { AgentKit, loadAvatar } from '@three-ws/sdk';
import '@three-ws/sdk/styles';
const agent = new AgentKit({
name: 'My Agent',
description: 'Does cool stuff',
endpoint: 'https://myapp.com',
onMessage: async (text) => `You said: ${text}`,
});
agent.mount(document.body);
// Drop a three.ws agent's avatar onto the page
loadAvatar('a_abc123', document.getElementById('avatar-slot'));
```
`@three-ws/sdk` also exposes `AgentClient` (x402 paid calls), `PermissionsClient`, and ERC-8004 registry helpers. See [sdk/README.md](sdk/README.md), the [SDK guide](docs/sdk.md), and [examples](docs/examples.md).
---
## API Reference
The full OpenAPI 3.1 spec is available at `/openapi.json`. The key API surface is organized below.
### Agent API
| Method | Route | Auth | Description |
| -------- | --------------------------------- | ------- | ---------------------------------------------------------- |
| GET | `/api/agents` | session | List your agents |
| POST | `/api/agents` | session | Create an agent |
| GET | `/api/agents/:id` | — | Get agent detail |
| PATCH | `/api/agents/:id` | session | Update agent |
| DELETE | `/api/agents/:id` | session | Delete agent |
| GET | `/api/agents/:id/manifest` | — | Download manifest JSON |
| POST | `/api/agents/:id/sign` | session | Sign a message with agent wallet |
| GET/POST | `/api/agents/:id/embed-policy` | session | Manage iframe origin allowlist |
| POST | `/api/agents/register-prep` | session | Prep EVM on-chain registration (ERC-8004) |
| POST | `/api/agents/register-confirm` | session | Confirm EVM registration (ERC-8004) |
| POST | `/api/agents/register-solana` | session | Mint a Metaplex Core agent NFT on Solana |
| GET | `/api/agents/solana-attestations` | — | Read Solana feedback / validation memos for an agent |
| GET | `/api/agents/solana-card` | — | Solana agent passport card (mirrors EVM `/a/[chain]/[id]`) |
| GET | `/api/agents/solana-reputation` | — | Solana off-chain reputation snapshot |
| POST | `/api/agent-actions` | session | Record signed agent action |
### Avatar API
| Method | Route | Auth | Description |
| ------ | --------------------------- | ------- | --------------------------- |
| GET | `/api/avatars` | — | List public avatars |
| POST | `/api/avatars` | session | Create avatar record |
| GET | `/api/avatars/:id` | — | Get avatar detail |
| PATCH | `/api/avatars/:id` | session | Update metadata |
| DELETE | `/api/avatars/:id` | session | Soft-delete avatar |
| POST | `/api/avatars/:id/presign` | session | Get presigned R2 upload URL |
| POST | `/api/avatars/:id/pin-ipfs` | session | Pin to IPFS |
**Three-step upload flow:**
```
1. POST /api/avatars/:id/presign → { url, storage_key }
2. PUT <presigned_url> ← raw GLB bytes
3. POST /api/avatars → register metadata with storage_key
```
### Widget API
| Method | Route | Auth | Description |
| ------ | ---------------------------- | ------- | ----------------- |
| GET | `/api/widgets` | session | List your widgets |
| POST | `/api/widgets` | session | Create widget |
| PATCH | `/api/widgets/:id` | session | Update widget |
| DELETE | `/api/widgets/:id` | session | Delete widget |
| POST | `/api/widgets/:id/duplicate` | session | Clone widget |
| GET | `/api/widgets/:id/stats` | — | View stats |
| GET | `/api/widgets/oembed` | — | oEmbed card |
### Memory API
| Method | Route | Auth | Description |
| ------ | ----------------------- | ------- | ------------------------ |
| GET | `/api/agent-memory/:id` | session | Fetch agent memory store |
| POST | `/api/agent-memory/:id` | session | Append memory entries |
| PUT | `/api/agent-memory/:id` | session | Replace memory store |
### Chat & LLM
| Method | Route | Auth | Description |
| ------ | -------------------- | ------------------ | -------------------------------- |
| POST | `/api/chat` | session \| api-key | Chat with agent (Claude backend) |
| POST | `/api/llm/anthropic` | allowlisted embed origin \| session \| api-key | Anthropic API proxy |
### Cron Jobs
Cron schedules are declared in `vercel.json` (still the live cron/route config the server reads) and executed in production by **Google Cloud Scheduler**, which calls each endpoint on its schedule. All cron endpoints are fail-closed — a missing auth token aborts with an error rather than silently skipping (see [Security Hardening](#security-hardening)).
The 103 crons in `vercel.json` are routed through a single dynamic handler at [`api/cron/[name].js`](api/cron/[name].js); the `name` segment selects the handler function. Scheduler jobs are provisioned from the `vercel.json` cron list via [scripts/create-gcp-scheduler.mjs](scripts/create-gcp-scheduler.mjs); the schedules below match `vercel.json` verbatim.
| Schedule | Endpoint | Purpose |
| -------------------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Every minute | `/api/cron/run-x-scheduled-posts` | Publish queued X (Twitter) posts |
| Every 3 min | `/api/cron/pumpfun-monitor` | Watch for new pump.fun token creates |
| Every 5 min | `/api/cron/expire-pending-purchases` | Clear stale x402 pending purchases |
| Every 10 min | `/api/cron/solana-attestations-crawl` | Index new Solana feedback / validation memos |
| Every 5 min | `/api/cron/index-delegations` | Index EIP-7710 delegations |
| Every 5 min | `/api/cron/run-x-triggers` | Trigger-based X posts (mentions, milestones) |
| Every 5 min | `/api/cron/run-coin-cycle` | Unified coin-launch tick: holder snapshots, vault claims, lottery draws, reflections |
| Every 5 min (offset) | `/api/cron/run-coin-payouts` | Drain the coin-payouts queue; runs on a different minute from `run-coin-cycle` so a stuck payout never blocks the next cycle |
| Every 5 min (offset) | `/api/cron/club-payouts` | Sweep unpaid Pole Club tips to each dancer's wallet |
| Every 10 min | `/api/cron/pump-agent-stats` | Refresh pump-agent dashboard stats |
| Every 10 min | `/api/cron/solana-attest-event-cleanup` | Prune Solana attestation events older than ~1 hour |
| Every 15 min | `/api/cron/erc8004-crawl` | Index new ERC-8004 mints on indexed chains |
| Every 15 min | `/api/cron/pumpfun-signals` | Sweep pump.fun signals into the `pumpfun_signals` table |
| Hourly | `/api/cron/cleanup-csrf-tokens` | Expire used / stale CSRF tokens |
| Hourly | `/api/cron/process-withdrawals` | Sweep creator withdrawals (pump.fun, club tips) |
| Hourly | `/api/cron/run-dca` | Execute DCA strategy orders |
| Hourly | `/api/cron/run-subscriptions` | Execute recurring x402 subscriptions |
| Daily 03:00 UTC | `/api/cron/siwx-gc` | Prune SIWX nonces (10-min replay window) and expired payment grants |
| Every 6h | `/api/cron/fetch-x-metrics` | Pull X engagement metrics for owned accounts |
| Every 6h | `/api/cron/process-subscriptions` | Charge creator subscriptions whose period is about to end |
| Daily 03:00 UTC | `/api/cron/settle-royalties` | Settle creator and skill royalties owed |
| Daily 04:00 UTC | `/api/cron/audit-log-cleanup` | Rotate audit logs past the retention window |
---
## Authentication & OAuth 2.1
three.ws supports three authentication methods:
**1. Email + Password (Session cookie)**
```
POST /api/auth/register → create account
POST /api/auth/login → JWT session cookie
GET /api/auth/me → current user
POST /api/auth/logout → revoke session
```
**2. Wallet (SIWE / SIWS)**
```
POST /api/auth/siwe → get nonce challenge
POST /api/auth/siwe/verify → verify EIP-4361 signed message → session
POST /api/auth/siws → Solana equivalent
```
**3. Developer API Keys**
```
POST /api/api-keys → create key (set scope + expiry)
DELETE /api/api-keys/:id → revoke key
Authorization: Bearer sk-... → authenticate requests
```
**OAuth 2.1 Server (RFC 6749 + PKCE)**
For third-party apps and MCP integrations:
```
GET /oauth/authorize → consent screen
POST /oauth/authorize → submit consent → auth code
POST /oauth/token → exchange code for tokens
POST /oauth/register → RFC 7591 dynamic client reg
POST /oauth/revoke → RFC 7009 token revocation
POST /oauth/introspect → RFC 7662 token check
GET /.well-known/oauth-authorization-server → RFC 8414 discovery
GET /.well-known/oauth-protected-resource → RFC 9728 resource discovery
```
Token scopes: `avatars:read`, `avatars:write`, `agents:read`, `agents:write`, `mcp`.
Access tokens are short-lived JWTs (1 hour). Refresh tokens are opaque strings stored hashed in Postgres.
---
## MCP Server
[`api/mcp.js`](api/mcp.js) is a thin HTTP entrypoint (POST / GET-SSE / DELETE) that implements the [Model Context Protocol](https://modelcontextprotocol.io) 2025-06-18 specification over JSON-RPC 2.0. The protocol logic is split across [`api/_mcp/`](api/_mcp/): `auth.js` (Bearer/OAuth + x402 paywall), `dispatch.js` (JSON-RPC routing), `catalog.js` (dynamic tool catalog), `payments.js` (x402 paid-tool settlement), `render.js`, and `embed-policy.js`. Tools are registered per category under [`api/_mcp/tools/`](api/_mcp/tools/) (14 category modules: `avatars.js`, `models.js`, `solana.js`, `pumpfun.js`, `animations.js`, `agents.js`, `garments.js`, `memory.js`, `oracle.js`, `trader.js`, `embed.js`, `sign.js`, `crypto-data.js`, `tokenize.js`). External AI systems (including Claude Desktop, other agents, or custom integrations) can drive avatars programmatically through this surface.
**Endpoint:** `POST /api/mcp` (tools), `GET /api/mcp` (SSE), `DELETE /api/mcp` (session terminate)
**Auth:** OAuth 2.1 Bearer token with `mcp` scope; some tools additionally require x402 USDC payment
**Registry:** Listed on the [official MCP Registry](https://registry.modelcontextprotocol.io/?q=io.github.nirholas) as `io.github.nirholas/three.ws`, alongside the other three.ws servers published under the `io.github.nirholas` namespace (`threews-3d-studio`, `threews-avatar`, `threews-pumpfun`, `threews-x402-bazaar`, `three-token-mcp`, and more). Also discoverable on [Smithery](https://smithery.ai/search?q=three.ws), [Glama](https://glama.ai/mcp/servers?query=three.ws), and [PulseMCP](https://www.pulsemcp.com/servers?q=three.ws).
**x402scan:** [view on x402scan](https://www.x402scan.com/server/17cbd874-52ac-4920-a020-b22ff2489a07) — paid MCP tool calls and revenue
**Available tools:**
The catalog is assembled dynamically at request time from the per-category tool modules. Current tools:
_Avatars_ ([`api/_mcp/tools/avatars.js`](api/_mcp/tools/avatars.js))
| Tool | Description |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `list_my_avatars` | List the authenticated user's avatars with id, name, slug, size, visibility, and (when permitted) direct `model_url`. |
| `get_avatar` | Fetch a single avatar by id or owner+slug; returns metadata plus a public `model_url` or short-lived signed URL for private avatars. |
| `search_public_avatars` | Free-text + tag search across the public avatar gallery; useful for finding characters to render without prior knowledge of an id. |
| `render_avatar` | Produce an HTML `<model-viewer>` snippet that renders the given avatar, with configurable background, camera orbit, poster, and AR button. |
| `render_avatar_image` | Render a stored avatar to a real PNG/JPEG/WebP image (headless three.js) with camera framing, pose preset, and ARKit-52 expression; cached. |
| `delete_avatar` | Soft-delete an avatar you own. Requires the `avatars:delete` scope. |
_Models_ ([`api/_mcp/tools/models.js`](api/_mcp/tools/models.js))
| Tool | Description |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `validate_model` | Run the Khronos glTF-Validator against a public https GLB/glTF URL; returns a structured report of errors, warnings, infos, and hints. SSRF-hardened. |
| `inspect_model` | Parse a GLB/glTF and return structural stats: scene/node/mesh counts, vertex and triangle totals, material and texture summaries, and extensions used. Pure inspection — no advice. |
| `optimize_model` | Inspect the model and return actionable suggestions for reducing size and draw-call overhead: triangle budget, Draco/Meshopt, oversized textures, KTX2 transcoding, non-indexed primitives, redundant materials, and more. |
_Solana_ ([`api/_mcp/tools/solana.js`](api/_mcp/tools/solana.js)) — all public, no auth required
| Tool | Description |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `solana_agent_reputation` | Computed reputation summary for a Solana-registered agent: total/verified feedback counts, raw + verified-only score averages, validation pass/fail, task-acceptance, and dispute counts. |
| `solana_agent_attestations` | List recent on-chain attestations (feedback, validation, task offers, acceptances, disputes) about a Solana agent; each row includes verified/disputed/revoked flags. |
| `solana_agent_passport` | Full discovery card for a Solana agent: identity, owner wallet, reputation summary, latest validation result, and attestation schema endpoint — the Solana equivalent of an ERC-8004 passport. |
_Pump.fun_ ([`api/_mcp/tools/pumpfun.js`](api/_mcp/tools/pumpfun.js))
| Tool | Description |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `pumpfun_recent_claims` | Most recent pump.fun GitHub social-fee claim events with full enrichment: GitHub profile, X/Twitter follower data, influencer tier, first-time-claim flag, fake-claim detection, and AI summary. |
| `pumpfun_recent_graduations` | Tokens that recently graduated from the bonding curve to PumpAMM, with creator and holder analysis. |
| `pumpfun_token_intel` | Full intel on a pump.fun token: graduation status, bonding-curve progress, creator profile, top holders, volume, bundle detection, and trust signals. |
| `pumpfun_creator_intel` | Reputation profile for a pump.fun creator wallet: prior launches, graduation rate, claim activity, and behavioural trust signals. |
Ten further category modules register the rest of the catalog: _Animations_ (`list_animations`, `animation_signature`, `find_similar_animations`, `apply_animation`, `text_to_animation`), _Agents_ (`call_agent`, `register_agent`, `attach_avatar_to_agent`, `identity_check`), _Garments_ (`generate_garment`, `garment_status`, `list_garment_catalog`), _Memory_ (`remember`, `recall`, `forget`), _Oracle_ (`oracle_top_plays`, `oracle_coin`, `oracle_arm_watch`, `oracle_watch_status`), _Trader_ (`trader_leaderboard`, `trader_profile`, `copy_subscribe`, `copy_status`), _Embed_ (`get_embed_code`, `create_gated_embed`), _Sign_ (`list_sign_vocabulary`, `sign_text`), _Crypto data_ (`crypto_data`, `token_snapshot`), and _Tokenize_ (`mint_3d_asset`, `get_3d_asset_onchain`).
**MCP discovery:** configured in `.mcp.json` at the repo root for Claude Desktop integration.
**SSE stream:** `GET /api/mcp` returns a Server-Sent Events stream for real-time notifications from long-running operations (validation, optimization).
---
## Brain Proxy & LLM Routing
three.ws supports multiple LLM providers behind a single `brain` interface. The runtime is provider-agnostic: switch from Claude to GPT to Gemini to a local model with a one-line change. See it in the wild on the live chat surface at [three.ws/chat](https://three.ws/chat) (model selector, tools, skills, wallet).
[](https://three.ws/chat)
| Provider | Path | Use case |
| ---------------------- | -------------------------------- | --------------------------------------------------------------------- |
| **Anthropic (Claude)** | `POST /api/llm/anthropic` | Default — tool-loop, streaming, sentiment-tagged speak |
| **Groq** | (anonymous) | Free fast-mode chat for unauthenticated visitors on `/chat` |
| **Multi-LLM brain** | `/brain`, `POST /api/brain/chat` | Side-by-side compare Claude / GPT / Gemini / Groq for the same prompt |
| **OpenRouter** | proxied via brain | Fallback when the primary provider is rate-limited |
| **Null provider** | `src/runtime/providers.js` | No-op for tests and offline mode |
**Switching providers**
Provider selection is per-agent and controlled by the manifest `brain.provider` field:
```json
{
"brain": {
"provider": "anthropic",
"model": "claude-sonnet-4-6",
"temperature": 0.8,
"maxTokens": 1024
}
}
```
Supported `provider` values: `anthropic` · `groq` · `openrouter` · `null` (offline). Adding a new provider means implementing the two-method interface (`chat()` and `stream()`) in [`src/runtime/providers.js`](src/runtime/providers.js) — no other files need to change.
**Free-first routing policy**
The platform's `DEFAULT_PROVIDER_ORDER` in `src/llm.js` ensures AI chat never fails silently due to a single quota: free tiers (Groq, OpenRouter `:free` models, NVIDIA) are always tried first; paid keys (Anthropic, OpenAI) are last-resort only. An OpenRouter fallback key is configured for `:free` models so that even a depleted primary account doesn't take down the `/chat` surface.
**Owner-card gating**
When an agent has a paying owner — established via ERC-8004 mint or x402 subscription — the embed unlocks:
- Longer context windows (up to 32k tokens per turn vs the anonymous 8k cap)
- Access to higher-tier models (Claude Sonnet / Opus vs Groq fallback)
- An owner-attribution card displayed below the avatar in the embed chrome
The gating check runs server-side in [`api/chat.js`](api/chat.js) against the agent's subscription record in Postgres. It cannot be bypassed from the client — the model selection and context limit are applied at the API layer before the request reaches the LLM provider.
---
## Claude Code Integration
three.ws ships as a first-class Claude Code SDK. There are two ways to integrate — pick one or use both:
### 1. MCP server (paid tools via `npx`)
Add the `@three-ws/mcp-server` to your Claude Desktop, Cursor, or Claude Code config in one step:
```json
{
"mcpServers": {
"3d-agent": {
"command": "npx",
"args": ["-y", "@three-ws/mcp-server"],
"env": {
"MCP_EVM_PAYMENT_ADDRESS": "0xYourBaseWallet",
"MCP_SVM_PAYMENT_ADDRESS": "YourSolanaWallet"
}
}
}
}
```
| Config file location | Platform |
| ----------------------------------------------------------------- | ---------------------------- |
| `~/Library/Application Support/Claude/claude_desktop_config.json` | macOS Claude Desktop |
| `%APPDATA%\Claude\claude_desktop_config.json` | Windows Claude Desktop |
| `.mcp.json` in your project root | Claude Code (project-scoped) |
| `~/.cursor/mcp.json` | Cursor |
Once configured, Claude can call these tools directly in conversation — no API key required, each call is settled in USDC via x402:
| Tool | Price | What it does |
| ------------------ | ----------- | ----------------------------------------------------------------------------------------- |
| `get_pose_seed` | $0.001 | Pose map for a three.ws avatar from a plain-text prompt |
| `pump_snapshot` | $0.005 | Live pump.fun token snapshot — price, volume, holders, trust signals |
| `agent_reputation` | $0.01 | Agent reputation — ERC-8004 ReputationRegistry on EVM, attestation-memo roll-up on Solana |
| `vanity_grinder` | up to $0.50 | Mine a Solana keypair with a custom address prefix |
See [`mcp-server/README.md`](mcp-server/README.md) for full environment variable reference and programmatic client usage.
### 2. Slash commands (`marketplace/plugins/three-ws-developer/commands/`)
This repo ships three Claude Code slash commands that work in any project referencing this repo:
| Command | What it does |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `/setup-mcp` | Detects your OS, collects wallet addresses, and writes the MCP config to the right file — end-to-end, no manual JSON editing |
| `/scaffold-agent` | Scaffolds a new three.ws agent in your project: installs dependencies, creates `agent.js` with MCP client wiring, and adds `.env.example` |
| `/use-tools [tool_name]` | Produces a complete, runnable Node.js script for calling a specific paid MCP tool with automatic x402 payment handling |
Commands live in [`marketplace/plugins/three-ws-developer/commands/`](marketplace/plugins/three-ws-developer/commands/) and ship with the `three-ws-developer` plugin, so Claude Code picks them up once that plugin is installed.
---
## Install in Claude Code
three.ws ships an official **Claude Code plugin marketplace** — install wallet, payments, pump.fun trading, agent scaffolding, and the 3D Forge as namespaced skills and MCP tools, in one command. Add the marketplace once:
```
/plugin marketplace add nirholas/three.ws
```
Then install any of the four plugins:
```
/plugin install three-ws-core@three-ws # wallet + x402 — authenticate, fund, send, trade, bazaar, pay, monetize, query onchain
/plugin install three-ws-developer@three-ws # scaffold agents, configure MCP, runnable code examples
/plugin install three-ws-pump-fun@three-ws # create coins, swap, creator fees, tokenize agents, live avatar reactions
/plugin install three-ws-3d@three-ws # text→3D (free), text→avatar, mesh forge, auto-rig + scene/avatar MCP
```
Run `/reload-plugins` and the skills appear under each plugin's namespace (e.g. `/three-ws-3d:forge-3d`). Plugins that expose MCP tools (`three-ws-developer`, `three-ws-3d`) wire the published `@three-ws/*` MCP servers automatically — `forge_free` is free (no wallet); the paid lanes settle over x402 in USDC. The canonical manifest lives at [.claude-plugin/marketplace.json](.claude-plugin/marketplace.json).
---
## Cloud Marketplaces
three.ws is available on major cloud marketplaces and open to infrastructure partnerships.
| Cloud | Status |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **AWS** | **AWS Partner** (APN Software Path). AWS Marketplace SaaS listing in review: see [docs/aws-marketplace.md](docs/aws-marketplace.md) and the public partner page at [three.ws/aws](https://three.ws/aws). Part of the stack runs on AWS `us-east-1` (the Forge sculptor Lambda `three-ws-forge` and the S3 avatar bucket), registered in AWS MyApplications under account `155407237916` (the main app runs on Google Cloud Run). We publish engineering write-ups on the AWS Builder Center as [@threews](https://builder.aws.com/community/@threews); the index is [docs/aws-builder-center.md](docs/aws-builder-center.md). |
| **Alibaba Cloud** | Live: [product listing →](https://marketplace.alibabacloud.com/products/56724001/sgcmfw00036800.html) · [storefront →](https://marketplace.alibabacloud.com/store/3247293.html) |
| **Google Cloud** | Production runs on **Google Cloud Run** (`three-ws-api`, `us-central1`) fronted by a global HTTPS load balancer + Cloud CDN, with all 101 scheduled jobs on Cloud Scheduler and GPU inference workers on Cloud Run: a natural fit for GCP's AI infrastructure and Vertex AI. Open to co-listing, credits, and joint GTM. |
## Ecosystem Directories
three.ws is indexed in chain-ecosystem dApp directories so the community can discover, vet, and rank it.
| Directory | Status |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **BNB Chain · Dappbay** | Live: [dappbay.bnbchain.org/detail/three →](https://dappbay.bnbchain.org/detail/three) — categories: AI Agent Launchpad · AI Data · AI Infra |
---
## IBM watsonx & Granite
three.ws is an **IBM Business Partner**, and the agent runtime runs on **IBM Granite** foundation models served through **IBM watsonx.ai**. One IBM Cloud API key + project unlocks the whole suite; every call is real inference (no mock path: endpoints return `503` when unconfigured). Full docs: **[docs/ibm.md](docs/ibm.md)**. Live showcase: **[three.ws/galaxy](https://three.ws/galaxy)**.
> **The public showcase is not the partnership.** The demos under `/ibm/*` are independent tools three.ws built for developers to explore Granite on watsonx.ai and build their own integrations — they are not official IBM partnership deliverables, not IBM products, and not endorsed by IBM. Our formal partnership work with IBM is being built on the IBM platform and is not yet public.
| Granite model | Where it runs |
| ------------- | ------------- |
| `granite-3-8b-instruct` | Selectable avatar **brain** + all narration |
| `granite-guardian-3-8b` | **Trust Layer** — allow/review/block governance gate, inline in `/api/chat` before an avatar moves value |
| `granite-ttm-512/1024/1536-96-r2` | **TimeSeries** forecasting (Oracle, Twin, Proof) |
| `granite-embedding-278m-multilingual` | **Semantic** agent map + `/api/watsonx/embed` |
| `granite-vision-3-2-2b` | **Vision** — reads an avatar into a full agent identity |
Three live surfaces put it on screen: the [Agent Galaxy](https://three.ws/galaxy) (every public agent embedded by Granite into a navigable semantic 3D star-map), the [x402 Granite demo](https://three.ws/ibm/x402-demo) (pay-per-call Granite inference settled in USDC), and the [hello-world embed](https://three.ws/ibm/hello). The backend endpoints behind them live in [api/ibm/](api/ibm/) (`galaxy`, `oracle`, `twin`, `vision`, `attest`). The standalone connector [`@three-ws/ibm-watsonx-mcp`](packages/ibm-watsonx-mcp/) ([npm](https://www.npmjs.com/package/@three-ws/ibm-watsonx-mcp)) exposes watsonx.ai to any MCP host; it is community-built and not an IBM product. The hosted platform integration is what runs on IBM watsonx.ai.
### Pay-per-call Granite over MCP (x402)
The world's first **x402-enabled MCP server on IBM Cloud**: [`@three-ws/ibm-x402-mcp`](packages/ibm-x402-mcp/) turns IBM Granite into a metered utility any AI agent can call. The operator holds the IBM credentials and funds inference; the caller pays **a few cents of USDC per call** — no IBM Cloud account, no subscription, no API-key signup. Full guide: **[docs/ibm-x402-mcp.md](docs/ibm-x402-mcp.md)**.
| Tool | What it does | Price |
| ---- | ------------ | ----- |
| `ibm_granite_chat` | Conversational AI — Q&A, drafting, reasoning | $0.02 |
| `ibm_granite_code` | Generate / review / refactor / explain / test / document code | $0.025 |
| `ibm_granite_embed` | Batch text embeddings (1–64) for RAG, search, clustering | $0.005 |
| `ibm_granite_analyze` | Structured doc analysis — entities, sentiment, risk, next steps | $0.04 |
| `ibm_granite_forecast` | Zero-shot time-series forecasting via Granite TTM | $0.05 |
The same five tools ship over two transports: **stdio** (`npx @three-ws/ibm-x402-mcp`, for Claude Desktop / Code / Cursor, paid on Solana) and **Streamable HTTP** (`https://three.ws/api/ibm-mcp`, for hosted clients and watsonx Orchestrate, paid on Base or Solana). An unpaid `tools/call` returns a `402` quoting the exact USDC price; x402-capable clients pay and retry automatically, settling on-chain only after the tool succeeds. Independent project integrating IBM Granite via watsonx.ai — not an IBM product.
---
## x402 Payments
three.ws is a first-class [x402](https://x402.org) host. Agents can both **pay for** and **expose** paid endpoints. Settlement runs on Base, BSC, and Solana; the bazaar at [three.ws/x402](https://three.ws/x402) is the discovery surface.
**Public proof:** the server is [listed on x402scan](https://www.x402scan.com/server/17cbd874-52ac-4920-a020-b22ff2489a07) with its paid tool calls and revenue, and [three.ws/pulse](https://three.ws/pulse) renders every settled agent-to-agent payment as it lands on-chain (hundreds of x402 settlements per day, live counters, real events only).
### Payment rails
| Chain | Settlement | Permit2 sibling | Status |
| ------------------- | ------------------------------ | ------------------- | ------ |
| **Base mainnet** | Coinbase CDP facilitator | Gasless via relayer | Live |
| **Base sepolia** | CDP facilitator | Yes | Live |
| **BSC** | Direct-scheme (no facilitator) | — | Live |
| **Solana (devnet)** | x402-solana direct | — | Live |
Every CDP-settled endpoint ships a Permit2 sibling that accepts an EIP-2612 permit instead of an upfront approval — the buyer signs once, and the relayer pays gas. Wire-level checks live in `tests/e2e/` and exercise the buyer/seller flow end-to-end.
### Paid endpoints
| Route | What you get |
| ---------------------------------------- | --------------------------------------------- |
| `POST /api/x402/mint-to-mesh` | Mint an avatar's mesh as an NFT |
| `POST /api/x402/mint-to-mesh-batch` | Batch mint up to N meshes |
| `POST /api/x402/dance-tip` | Tip a club dancer in USDC |
| `POST /api/x402/model-check` | Run Khronos glTF validation as a paid service |
| `POST /api/x402/pump-agent-audit` | Audit a pump.fun token's creator history |
| `POST /api/x402/agent-reputation` | Compute on-chain reputation snapshot |
| `POST /api/x402/onchain-identity-verify` | Verify ERC-8004 identity for a wallet |
| `POST /api/x402/symbol-availability` | Check token symbol availability across chains |
| `POST /api/x402/skill-marketplace` | Paid skill marketplace listing |
| `POST /api/x402/asset-download` | Pay-per-download for gated R2 assets |
| `POST /api/x402/did` | DID resolution as a service |
| `GET /api/x402/my-receipts` | Buyer-side receipts ledger |
### Bazaar, SKUs, and subscriptions
| Surface | Path | Purpose |
| ------------- | --------------------------------- | ------------------------------------------- |
| Bazaar | `/x402` | Browsable marketplace of paid endpoints |
| Listing studio | `/x402/studio` | Author and publish your own paid listing |
| Revenue | `/x402-revenue` | Seller revenue dashboard |
| Checkout | `/api/x402-checkout` | Stripe-style one-shot purchase |
| SKU catalog | `/api/x402-skus` | Server-defined SKUs with per-row pricing |
| Dashboard | `/dashboard/x402` | Seller + buyer dashboard, receipts, payouts |
| Subscriptions | `/api/x402/subscriptions` | Recurring x402 charges on cron |
| Status | `/api/x402-status` | Health and chain reachability checks |
### How to expose a paid endpoint
```js
import { paidEndpoint } from './_lib/x402-paid-endpoint.js';
export default paidEndpoint({
route: '/api/your-endpoint',
method: 'POST',
priceAtomics: '100000', // USDC atomic units (6 decimals): $0.10
networks: ['solana', 'base'], // solana | base | bsc; Solana listed first by default
description: 'What the buyer is paying for',
handler: async ({ req, payer }) => {
// payer is verified. RETURN the good; the wrapper settles, then flushes it
return { ok: true, payer };
},
});
```
The helper handles the 402 challenge, Permit2 sibling, receipt write-back, idempotency-token enforcement, and CSRF/SSRF guards. See [api/\_lib/x402-paid-endpoint.js](api/_lib/x402-paid-endpoint.js).
### Wire checks
- Wire-level CORS, CDP, and Permit2 sibling checks: `tests/e2e/`
- Offer receipts schema + buyer fetch: [api/\_lib/x402-buyer-fetch.js](api/_lib/x402-buyer-fetch.js)
- Error envelope: full 402 body returned in the `PAYMENT-REQUIRED` header
---
## A2A — Agent-to-Agent Protocol
Agents transact with each other directly through an A2A bridge that sits on top of the MCP server and x402 payments.
**How it works**
When agent A wants to call a paid tool from agent B:
1. **Discover** — A resolves B's DID via `POST /api/x402/did`, receiving B's MCP endpoint URL and payment wallet address.
2. **Call** — A sends a `tools/call` JSON-RPC request to B's MCP endpoint.
3. **Pay** — B's server returns `402 Payment Required` with a USDC price. A's SDK settles the x402 payment on-chain (Base or Solana) and retries with the payment proof in the `X-PAYMENT` header.
4. **Execute** — B verifies the payment, runs the tool, and writes a signed receipt to `api/a2a/receipts`.
5. **Ledger** — Both sides accumulate a row in `api/a2a/spending` — A for outbound spend, B for inbound revenue.
Agent wallets sign with **EIP-7710 delegated permissions** — the delegated signer acts on behalf of the agent's root key without ever exposing it.
| Surface | Path | Purpose |
| --------------- | -------------------- | -------------------------------------------------------- |
| A2A client | `sdk/a2a/` | Outbound calls — pay another agent, settle the response |
| A2A server | `api/a2a/` | Inbound paid tools, exposed via MCP bridge |
| MCP bridge | `api/mcp.js` | Wraps paid tools as MCP `tools/call` with auto-402 retry |
| Spending ledger | `api/a2a/spending` | Per-agent spend caps and authorization gates |
| Receipts store | `api/a2a/receipts` | Signed receipts written on every paid call |
| DID resolution | `POST /api/x402/did` | Resolve a counterparty DID to wallet + endpoints |
**SIWX (Sign-In with X-chain)** brokers cross-chain identity for paid sessions: an agent on Base proves ownership of a Solana wallet (or vice versa) to unlock chain-specific paid endpoints.
---
## On-Chain Identity (ERC-8004 + Metaplex Core)
three.ws supports two onchain identity paths as first-class peers — every reputation, attestation, and discovery surface reads from both, and SIWX brokers proofs between them so a single agent can hold reputation on both at once.
- **EVM path** — ERC-8004, a draft standard for verifiable 3D agent identity, deployed on Base, BSC, and other supported EVM chains. The `contracts/` directory contains a full Foundry implementation (IdentityRegistry, ReputationRegistry, ValidationRegistry).
- **Solana path** — Metaplex Core asset minted via the `solana-agent-sdk`. No custom on-chain program is required: the asset pubkey is the agent ID, and feedback / validation events are written as on-chain memos that the indexer rolls up into a reputation score (see the [Solana variant](#solana-variant--same-shape-no-deployed-program) section below).
### ERC-8004 (EVM)
ERC-8004 is a draft standard for verifiable 3D agent identity. The `contracts/` directory contains a full Foundry implementation.
### Contracts
**IdentityRegistry.sol** — the primary EVM contract. Each agent is an ERC-721 token with:
- `agentId` — stable numeric ID (the token ID)
- `owner` — EVM address of the agent's owner
- `delegatedSigner` — optional secondary address for runtime signing (EIP-712 typed signature)
- `tokenURI` — IPFS URL of the agent manifest JSON
- `metadata` — on-chain name, description, image pointer
On **Solana**, the equivalent identity is a **Metaplex Core asset**: the asset pubkey is the agent ID, the asset's `update_authority` is the owner, and the asset's URI points at the same IPFS-pinned manifest. No custom program is deployed — Metaplex Core handles mint, transfer, and update natively.
**ReputationRegistry.sol** — stores signed feedback scores. Each reviewer can submit one score per agent. Scores are averaged for an on-chain reputation metric. The **Solana analog** is an SPL Memo with envelope `threews.feedback.v1`, posted in a transaction whose accounts include the agent's Metaplex Core asset pubkey — readable by any client via `getSignaturesForAddress`.
**ValidationRegistry.sol** — records validator attestations for off-chain proofs (glTF validation reports, skill audits, security reviews). The **Solana analog** uses SPL Memo with envelope `threews.validation.v1` against the agent's Metaplex Core asset pubkey.
### Deployment Addresses
See [`contracts/DEPLOYMENTS.md`](contracts/DEPLOYMENTS.md) for current mainnet and testnet addresses. All three registries are deployed via **CREATE2** against a custom vanity-prefixed factory, so the **same address is used on every supported EVM chain** within an environment class — mainnet contracts have one address, testnet contracts another.
**Mainnet (across Ethereum, Optimism, BSC, Gnosis, Polygon, Fantom, zkSync Era, Moonbeam, Mantle, Base, Arbitrum One, Celo, Avalanche, Linea, Scroll):**
| Contract | Address | Proof |
| ------------------ | -------------------------------------------- | ----- |
| IdentityRegistry | `0x8004A169FB4a3325136EB29fA0ceB6D2e539a432` | [Basescan](https://basescan.org/address/0x8004A169FB4a3325136EB29fA0ceB6D2e539a432) · [Etherscan](https://etherscan.io/address/0x8004A169FB4a3325136EB29fA0ceB6D2e539a432) |
| ReputationRegistry | `0x8004BAa17C55a88189AE136b182e5fdA19dE9b63` | [Basescan](https://basescan.org/address/0x8004BAa17C55a88189AE136b182e5fdA19dE9b63) · [Etherscan](https://etherscan.io/address/0x8004BAa17C55a88189AE136b182e5fdA19dE9b63) |
| ValidationRegistry | not yet deployed on mainnet | see [contracts/DEPLOYMENTS.md](contracts/DEPLOYMENTS.md) |
**Testnet (BSC Testnet, Ethereum Sepolia, Base Sepolia, Arbitrum Sepolia, Optimism Sepolia, Polygon Amoy, Avalanche Fuji):**
| Contract | Address | Proof |
| ------------------ | -------------------------------------------- | ----- |
| IdentityRegistry | `0x8004A818BFB912233c491871b3d84c89A494BD9e` | [Base Sepolia](https://sepolia.basescan.org/address/0x8004A818BFB912233c491871b3d84c89A494BD9e) |
| ReputationRegistry | `0x8004B663056A597Dffe9eCcC1965A193B7388713` | [Base Sepolia](https://sepolia.basescan.org/address/0x8004B663056A597Dffe9eCcC1965A193B7388713) |
| ValidationRegistry | `0x8004Cb1BF31DAf7788923b405b754f57acEB4272` | [Base Sepolia](https://sepolia.basescan.org/address/0x8004Cb1BF31DAf7788923b405b754f57acEB4272) |
### CREATE2 Factory (ThreeWSFactory)
A custom vanity-prefixed CREATE2 deployer at [`0x00000000D49195AE81759cd247cFeDD9D0B479df`](https://basescan.org/address/0x00000000D49195AE81759cd247cFeDD9D0B479df) (7 leading zeros) is used to mint matching addresses across chains. The factory init code hash is `0x30f9d9020bf9622bbe7f8a1625d447efe350dfafd0a91e6dbd62d56547db835f`; bytecode is byte-identical on every deployed chain. Source is verified on each chain's explorer.
### Audits & EAS
- Smart contract audits are scheduled for the reputation, royalty, and delegation contracts as part of Phase 3
- **EAS** (Ethereum Attestation Service) integration ships as a sibling reputation surface — see `/demos/eas-reputation.html` for the viewer
- **0xsplits** SDK is wired for splitting skill royalties across multiple authors
### Registration Flow (EVM)
```
1. POST /api/agents/register-prep → { manifest, typedData }
(uploads manifest to IPFS, builds EIP-712 typed data for signing)
2. User signs typedData with their wallet
3. POST /api/agents/register-confirm → { txHash, agentId }
(submits transaction, waits for confirmation, updates agent record)
```
The agent is now an ERC-721 token. Its manifest lives on IPFS. Its action history is anchored to its `agentId`. Any third party can verify the agent's identity, owner, and reputation without trusting three.ws.
### Registration Flow (Solana)
Solana ships an ERC-8004 analog without any custom on-chain program — identity is a Metaplex Core asset, reputation + validation are SPL Memo–anchored attestations referencing that asset.
```
1. POST /api/agents/register-solana → { tx }
(server builds a Metaplex Core mint instruction; client signs)
2. User signs and submits the tx with their Solana wallet (Phantom / Backpack / Seeker MWA)
3. POST /api/agents/register-solana?step=confirm → { asset, agentId }
(server verifies the mint, writes back the asset pubkey as the agent's ID)
```
The agent is now a Metaplex Core NFT. Its asset pubkey is the canonical agent ID. Anyone can read every feedback / validation attestation about it via `getSignaturesForAddress(assetPubkey)` — see [Solana variant — same shape, no deployed program](#solana-variant--same-shape-no-deployed-program) below.
### On-Chain Indexing
`api/cron/erc8004-crawl.js` runs every 15 minutes to index new IdentityRegistry mint events. Indexed agents appear in `/discover` and can be imported via `/hydrate`.
### Solana variant — same shape, no deployed program
Solana ships an ERC-8004 analog without any custom on-chain program:
- **Identity** — Metaplex Core NFT minted via `registerSolanaAgent()` (the asset pubkey is the agent ID).
- **Reputation + Validation** — signed SPL Memo transactions referencing the agent asset pubkey, with a JSON envelope (`threews.feedback.v1` / `threews.validation.v1`). Anyone can read every attestation about an agent via `getSignaturesForAddress(assetPubkey)`.
SDK:
```js
import { attestFeedback, attestValidation, listAttestations } from '@three-ws/sdk';
await attestFeedback({ agentAsset, score: 5, network: 'devnet' });
await attestValidation({ agentAsset, taskHash: '0x…', passed: true, network: 'devnet' });
const rows = await listAttestations({ agentAsset, kind: 'all', network: 'devnet' });
```
Server read endpoint: `GET /api/agents/solana-attestations?asset=<pubkey>&kind=feedback|validation|all&network=devnet|mainnet`.
Demo page: [sdk/example/solana-attest.html](sdk/example/solana-attest.html).
### Pump.fun signals (Solana off-chain reputation)
Solana agents can ingest live pump.fun activity (GitHub social-fee claims, token graduations) as off-chain trust signals that feed into the agent's Solana reputation score and surface through the Empathy Layer in real time.
| Surface | Path | Purpose |
| ------------- | ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| MCP client | [api/\_lib/pumpfun-mcp.js](api/_lib/pumpfun-mcp.js) | Cached JSON-RPC client to upstream `pumpfun-claims-bot` |
| Read API | [api/agents/pumpfun.js](api/agents/pumpfun.js) | `GET ?op=claims\|graduations\|token\|creator`, plus `?_handler=feed` for the SSE event stream and `?_handler=metadata` for token metadata. Auth: session or bearer (`mcp`/`profile` scope). |
| Write actions | [api/agents/pumpfun/[action].js](api/agents/pumpfun/[action].js) | Dynamic dispatcher for `buy`, `sell`, `swap`, `launch`, `pay`, `portfolio`, `balances`, and buyback lifecycle (`create`, `accept`, `withdraw`, `distribute`, `extend_account`, `update_authority`, `update_buyback`). |
| Cron crawler | [api/cron/[name].js](api/cron/[name].js) (`name=pumpfun-signals`) | 15-min sweep that writes the `pumpfun_signals` table; routed through the dynamic cron handler. |
| Skills | [src/agent-skills-pumpfun-watch.js](src/agent-skills-pumpfun-watch.js) | `recent-claims`, `token-intel`, `watch-start`, `watch-stop` |
| Widget | [src/widgets/pumpfun-feed.js](src/widgets/pumpfun-feed.js) | Live cards overlay |
| Reputation | [api/agents/solana/[action].js](api/agents/solana/[action].js) (`action=reputation`) | Reputation summary with the `pumpfun_signals` block included in the response |
| Passport | [api/agents/solana/[action].js](api/agents/solana/[action].js) (`action=card`) | Public passport card with the `pumpfun` block on the agent card |
The crawler runs on a `*/15 * * * *` schedule (see [vercel.json](vercel.json)) and writes into the `pumpfun_signals` table. Agents subscribed via `watch-start` react to incoming events through the existing protocol bus — no new event types required.
Full design and configuration in [docs/solana-pumpfun.md](docs/solana-pumpfun.md).
---
## Pump.fun Integration
Beyond the Solana reputation signals described above, the platform also ships consumer-facing pump.fun tooling:
- **Token Launcher** (live at [three.ws/pumpfun](https://three.ws/pumpfun)): UI for creating and launching new tokens, source in [public/pumpfun.html](public/pumpfun.html).
- **Live Dashboard** (live at [three.ws/pump-live](https://three.ws/pump-live)): real-time tracker for new tokens, source in [pages/pump-live.html](pages/pump-live.html).
- **Skills** — the [pump-fun-skills/](pump-fun-skills/) directory contains agent skills for reading and acting on pump.fun.
### Token launcher (USDC v2)
The launcher uses pump.fun's v2 USDC quote payload and supports a creator-signer split — the agent's owner can authorize a delegated signer to publish the token without exposing the root key.
| Surface | Path | Purpose |
| ---------------- | ------------------------------ | -------------------------------------------------------- |
| Web UI | `/pumpfun` | One-page launcher (avatar, ticker, supply, fee shares) |
| Prep | `POST /api/pump/launch-prep` | Build the launch transaction with creator + signer split |
| Quote | `POST /api/pump/quote-sdk` | v2 USDC quote (replaces deprecated v1 path) |
| Curve | `GET /api/pump/curve` | Bonding-curve sim for pre-launch pricing preview |
| Dashboard | `GET /api/pump/dashboard` | Per-creator launch history + cumulative revenue |
| Stats | `GET /api/pump/helius-stats` | Helius-backed per-token holder + trade counts |
| Trades stream | `GET /api/pump/trades-stream` | SSE feed of trades for a token |
| Inaugural launch | `scripts/pump-launch-usdc.mjs` | First-USDC launch flow used to mint platform tokens |
### Pump-swap buyback
A buyback flow lets an agent route revenue from x402 paid endpoints into pump-swap purchases of its own token — closing the loop between paid usage and tokenholder value. See [scripts/pump-launch-usdc.mjs](scripts/pump-launch-usdc.mjs) and the inaugural-launch self-contained prompts in [docs/internal/](docs/internal/).
### Pump visualizer
[three.ws/pump-visualizer](https://three.ws/pump-visualizer) is a live view of pump.fun activity with three modes:
| Mode | What it shows |
| -------------- | --------------------------------------------------------------------- |
| **Feed** | Newest launches as they happen, with cover images and creator history |
| **Migrations** | Tokens graduating from the curve to pump-swap pools |
| **Pulses** | Real-time trade pulses overlaid on a graph |
The visualizer supports search, sort, live pulses, and auto-refresh. Backed by the same Helius webhooks and JSON-RPC client as the cron crawler.
### Pump.fun MCP edge worker
For external agents that need pump.fun data with strict latency, a Cloudflare Worker mirror of the read API lives in [workers/pump-fun-mcp/](workers/pump-fun-mcp/). Deploy with `wrangler deploy` — the worker proxies the upstream `pumpfun-claims-bot` and answers MCP `tools/call` requests at the edge.
### Channel & Telegram bridge
| Endpoint | Purpose |
| --------------------------------------------------------------- | ------------------------------------------------------- |
| `GET /api/pump/channel-feed` | Per-creator activity feed for any agent's channel page |
| `POST /api/pump/deliver-telegram` | Optional Telegram bridge for trade and migration alerts |
| `POST /api/pump/accept-payment-prep` / `accept-payment-confirm` | Two-step USDC handoff for buyback flow |
| `POST /api/pump/withdraw-prep` / `withdraw-confirm` | Creator fee withdrawal with signature verification |
### Vanity mint addresses
The platform's pump.fun launches pre-grind vanity mint addresses with the WASM grinder so token addresses end in a brand-relevant suffix (`…pump`, `…ws`, etc.). See [WASM Vanity Grinder](#wasm-vanity-grinder).
---
## WASM Vanity Grinder
[three.ws/vanity-wallet](https://three.ws/vanity-wallet) is a browser-based vanity-address grinder compiled to WebAssembly. Generate **EVM addresses** with a prefix (`0xBEEF…`) or pattern, or **Solana addresses** (base58 prefix / suffix, e.g. `…pump`) in seconds, fully client-side, without leaking the private key to any server.
[](https://three.ws/vanity-wallet)
| Module | Path | Role |
| -------------- | ------------------------------- | ------------------------------------------------------ |
| WASM grinder | `public/vanity-wallet.html` | Multi-threaded secp256k1 keygen via WebWorkers |
| Solana variant | `scripts/pump-vanity-grind.mjs` | Server-side grinder for pump.fun mint vanity addresses |
Common use cases on the platform: branded agent wallet addresses (e.g. an agent named `agent.eth` getting an address starting with `0xA6EF…`), or pump.fun token mint vanity (e.g. ending in `pump`).
The Solana grinder backs the platform's pump.fun launches — the inaugural USDC token launches use a vanity mint pre-grind to produce shareable token addresses.
---
## Solana Mobile (Seeker)
three.ws ships with Mobile Wallet Adapter (MWA) wired into the web app and a release pipeline for the Solana Mobile dApp Store.
**Wallet detection priority**
On **Seeker / Saga** hardware the app prefers seed-vault-backed signing — private keys never leave the secure element. On standard Android or desktop, the app falls back through WalletConnect and then to browser-extension wallets automatically, with no code change required.
**What MWA unlocks on Seeker hardware**
- x402 USDC payments signed from the seed vault without any browser extension
- Metaplex Core agent mints (Solana on-chain registration) without leaving the app
- SPL Memo attestations (reputation and validation) with hardware-secured signatures
- SIWS (Sign-In with Solana) sessions authenticated at the chip level, not the software layer
**Release pipeline**
- dApp Store listing copy and release config live under [`solana-mobile/publish/`](solana-mobile/publish/)
- Release pipeline scripts handle build → sign → APK submission for dApp Store updates
- The listing targets Seeker-first and is compatible with Saga Gen 1 and Gen 2
---
## Vision
One day, creating your agent should be as simple as taking a selfie.
Point your camera at yourself — or anyone — and watch a fully realized 3D avatar emerge: your face, your voice, your personality, alive in the browser. That avatar becomes an agent with memory and skills, registered onchain — as an ERC-8004 token on EVM or a Metaplex Core asset on Solana — permanent and verifiable by anyone forever. No 3D software. No wallet setup. No uploads. Just a photo and a name.
This is the direction three.ws is heading: **photo → avatar → agent → onchain identity**, in a single flow. The infrastructure is already here — the viewer, the runtime, the contracts, the embedding layer. What comes next is closing the gap between a picture of a person and a living, ownable, embeddable piece of them that exists on the internet permanently.
---
## Roadmap
three.ws ships in four phases. Each phase closes a specific gap between the current platform and the end-state vision: **anyone can mint a 3D agent of themselves, own it onchain, and embed it anywhere on the internet.**
| Phase | Theme | Status |
| ----- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| **0** | Platform foundations (viewer, runtime, ERC-8004 + Metaplex Core identity, embed layer) | ✅ Shipped |
| **1** | Selfie → Avatar engine (3-photo capture, hosted inference) | 🟡 In progress — capture UX + quality gates shipped; GPU reconstruction backend wiring |
| **2** | Agent personalization + voice cloning | 🟡 In progress — voice clone, persona, memory seeds shipped behind `/demos`; main-flow integration next |
| **3** | Onchain economy (agent tokens, reputation markets, royalties) | 🟡 Scaffolding — bonding-curve sim, EAS-reputation viewer, 0xsplits + EAS SDKs landed; contracts + audits next |
| **4** | Open inference network (decentralized GPU layer) | 🔮 Future — livepeer dep landed for early experimentation |
---
### Phase 0 — Foundations _(Shipped)_
The full stack is live at [three.ws](https://three.ws): WebGL viewer, LLM agent runtime, ERC-8004 identity contracts (EVM) and Metaplex Core mints (Solana), OAuth 2.1 server, MCP endpoint, and the `<agent-3d>` web component. Anyone can register an agent today — but the avatar still has to come from a 3D artist or a third-party tool.
**What works:** model upload, agent runtime, onchain registration, embedding, signed action history, reputation scores.
**What doesn't:** there is no automated path from a real human face to a usable 3D avatar.
---
### Phase 1 — Selfie → Avatar Engine
**Goal:** any user takes 3 selfies (left, center, right) and receives a rigged, animatable 3D avatar in under 60 seconds.
**Deliverables**
- Mobile-first capture UX with realtime quality gates (lighting, framing, blur)
- Multi-view face reconstruction pipeline (FLAME / 3DMM fitting on top of a base body mesh)
- Hosted inference workers (GPU-backed) for sub-minute generation
- Output written directly to R2 and minted as a draft agent token — ERC-8004 on EVM, Metaplex Core asset on Solana
**Compute requirements**
- A100/H100-class GPUs for inference, sized to ~10k avatars/day at launch
- Training budget for fine-tuning a stylized face-fitter on a curated dataset
- CDN egress scaling for high-res GLB delivery
**Verification:** 1,000 test users complete capture and mint an onchain agent of themselves end-to-end with ≥4/5 likeness score.
---
### Phase 2 — Agent Personalization
**Goal:** the avatar isn't just _you_ — the agent _acts_ like you.
**Deliverables**
- Voice cloning (3–10 seconds of speech → ElevenLabs custom voice bound to the agent)
- Persona extraction from a short onboarding interview (tone, vocabulary, interests)
- Memory seeding from connected accounts (X, GitHub, Farcaster) with explicit user consent
- Per-agent fine-tuned system prompt stored in the manifest, signed and pinned to IPFS
**Verification:** users return to converse with their own agent; ≥30% week-2 retention on minted agents.
---
### Phase 3 — Onchain Economy
**Goal:** agents are real economic objects on EVM and Solana, not just collectibles.
**Deliverables**
- **Agent tokens** — ERC-8004 mints with bonding-curve pricing or fair launch options
- **Reputation markets** — stake on agents, earn from their action history (extends `ReputationRegistry.sol`)
- **Skill royalties** — skill authors earn per-call fees through EIP-7710 delegated permissions
- **Agent-to-agent payments** — agents transact autonomously via their delegated signer wallets
- **Subscriptions & DCA** — recurring onchain payments to creators (cron infra already in place)
**Funding requirements**
- Smart contract audits (multi-firm) for the reputation, royalty, and delegation contracts
- Liquidity for agent token launches
- Indexer infrastructure across Base, Solana, and additional EVM chains
**Verification:** ≥1,000 agents minted with active onchain reputation; ≥$X in cumulative skill royalties paid out.
---
### Phase 4 — Open Inference Network
**Goal:** decouple agent inference from any single provider. Anyone can run a node; agents pay nodes onchain for compute.
**Deliverables**
- Open protocol for agent inference (model weights, GPU runtime, signed responses)
- Node operator client (Docker + GPU drivers) with onchain registration
- Onchain settlement for inference jobs — pay-per-token with cryptographic receipts
- Federation with existing decentralized compute networks where appropriate
**Compute requirements**
- Bootstrap GPU credits for early node operators
- Cryptoeconomic security model (slashing, validator set) — research + audit budget
**Verification:** ≥50% of production agent traffic served by independent node operators; latency parity with centralized inference.
---
### What we need
| Resource | Used for | Phase |
| -------------------------- | ------------------------------------------ | ----- |
| **Inference GPUs** | Avatar generation, agent conversations | 1, 2 |
| **Training compute** | Fine-tuned face-fitter, voice models | 1, 2 |
| **Smart contract audits** | Reputation, royalty, delegation contracts | 3 |
| **Token launch liquidity** | Agent token markets | 3 |
| **Indexer infrastructure** | Multi-chain crawl + reputation aggregation | 3 |
| **Node operator credits** | Bootstrap the open inference network | 4 |
| **Engineering headcount** | Capture pipeline, contracts, indexer, ops | 1–4 |
Phases 1 and 2 unblock the consumer story — _anyone gets an agent of themselves_. Phases 3 and 4 unblock the onchain story — _those agents are real economic actors that don't depend on any one company to keep running_. Both are required for the vision; neither is funded yet.
If you want to support the project — compute credits, grants, partnerships, or contributions — open an issue or reach out via [three.ws](https://three.ws).
---
## Selfie Reconstruction Pipeline (Phase 1)
Anyone takes 3 selfies (left, center, right) and receives a rigged, animatable 3D avatar in under a minute. The pipeline ships native — no third-party black box.
| Module | Path | Role |
| ------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- |
| Capture UX | [src/selfie-capture.js](src/selfie-capture.js) | Mobile-first 3-shot capture with real-time quality gates (lighting, framing, blur) |
| Pipeline | [src/selfie-pipeline.js](src/selfie-pipeline.js) | Multi-view fit → FLAME / 3DMM face → base body mesh → rigged GLB |
| Sandbox route | `/creating` | Isolated reconstruction test bench, decoupled from the main flow |
| Output | Cloudflare R2 | Meshopt-compressed GLB pinned to IPFS and minted as a draft agent token — ERC-8004 on EVM or Metaplex Core on Solana |
Reconstruction inference runs against the same Cloud Run handler pool as the agent runtime, with optional offload to the **Livepeer Inference Network** (see below) for GPU-heavy steps.
---
## Voice & Persona Hub (Phase 2)
The avatar isn't just _you_ — the agent _acts_ like you. The Voice & Persona Hub captures the inputs that turn a body into a personality.
| Surface | Path | Purpose |
| ------------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------- |
| Persona extraction | [api/persona/extract.js](api/persona/extract.js) | Short onboarding interview → tone, vocabulary, interests profile |
| Persona preview | [api/persona/preview.js](api/persona/preview.js) | Try the extracted persona against test prompts before saving |
| Persona keys | `scripts/generate-persona-key.mjs` | Per-agent signing key + persona SSO setup |
| Voice clone modal | [src/voice/voice-clone-modal.js](src/voice/voice-clone-modal.js) | 3–10s recording → ElevenLabs custom voice bound to the agent |
| Talk controller | [src/voice/talk-controller.js](src/voice/talk-controller.js) | Push-to-talk and continuous talk modes |
| ARKit blendshapes | [src/voice/arkit-blendshapes.js](src/voice/arkit-blendshapes.js) | Standard ARKit-52 morph table |
| Lip-sync driver | [src/voice/lipsync-driver.js](src/voice/lipsync-driver.js) | Web Audio analyser → blendshape weights per frame |
| Avatar morph target | [src/voice/avatar-morph-target.js](src/voice/avatar-morph-target.js) | Per-rig binding of ARKit blendshapes to the loaded GLB |
| Avatar snapshot | [src/voice/avatar-snapshot.js](src/voice/avatar-snapshot.js) | Render-time pose capture for thumbnails and OG cards |
| Persona docs | [docs/persona-hub.md](docs/persona-hub.md) | Full design + onboarding flow |
Memory seed extensions (X, GitHub, Farcaster) feed the agent's memory store at creation time with explicit user consent — see [docs/persona-hub.md](docs/persona-hub.md).
The per-agent fine-tuned system prompt is stored in the manifest, signed, and pinned to IPFS — the persona becomes a verifiable part of the agent's onchain identity.
---
## Livepeer Inference Network (Phase 4)
three.ws is wiring the **Livepeer** decentralized GPU network as an alternative inference backend for avatar reconstruction and agent conversations.
- Open protocol: model weights, GPU runtime, signed responses
- Onchain settlement: pay-per-token with cryptographic receipts, mediated by the same x402 rails described above
- Node operator client (Docker + GPU drivers) with onchain registration
- Federation with existing decentralized compute networks where appropriate
The Livepeer dependency landed early so the Phase 1 selfie pipeline can switch its heaviest step (multi-view face fitting) onto external GPU nodes without touching the rest of the system. The goal: ≥50% of production agent traffic served by independent node operators with latency parity to centralized inference.
---
## News & Syndication
News posts live in the repo (`data/rss/items.json`) and ship with a deploy; the former in-app CMS was removed with the admin panel.
| Surface | Path | Purpose |
| -------------- | ---------------------------------------------------------- | --------------------------------------------------- |
| Public listing | `/news` | Cover-image grid with permalinks |
| Article | `/news/<slug>` | Server-rendered article with OG card |
| RSS | `/rss/announcements.xml` | Standards-compliant feed for HackerNoon auto-import |
## Security Hardening
The platform has been hardened against the OWASP top-10 plus a set of issues specific to agent payments and cross-chain identity.
| Control | Where |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| **SSRF guard** | All outbound `fetch()` from agent runtime + skills goes through an SSRF allow-list filter (`api/_lib/safe-fetch.js`) |
| **CSRF gates** | State-changing endpoints require an Origin + Sec-Fetch-Site check; bearer-only paths exempt |
| **Header-origin pinning** | The iframe bridge locks onto the parent's origin from the first authenticated message and ignores later messages from a different origin |
| **Fail-closed crons** | Cron endpoints fail closed if their auth token is missing — no silent skips |
| **Idempotency tokens** | x402 paid endpoints require an idempotency key to prevent double-charge on retry |
| **Embed policy** | Per-agent iframe origin allow-list (`/api/agents/:id/embed-policy`) gates the chromeless embed |
| **Rate limiting** | Upstash Redis per-user + per-API-key + per-IP buckets at every public endpoint |
| **JWT key rotation** | `JWT_KID` lets you rotate signing keys without invalidating in-flight sessions |
| **Bcrypt cost** | Tunable via `PASSWORD_ROUNDS` (default 11) |
| **Audit signing** | Every agent action is signed with the delegated signer key and chained into a per-agent action log |
---
## Database Schema
The Postgres schema ([`api/_lib/schema.sql`](api/_lib/schema.sql)) is fully idempotent — every `CREATE TABLE` uses `IF NOT EXISTS`, so the file is safe to re-run on any environment. Per-feature migrations live under [`api/_lib/migrations/`](api/_lib/migrations/) and are applied with `npm run db:migrate`.
The schema currently defines ~53 tables grouped below. Columns shown are the most commonly queried ones; the source file is authoritative.
**Core identity & content**
```sql
users (id, email, password_hash, display_name, avatar_url, plan, wallet_address, deleted_at)
avatars (id, owner_id, slug, name, description, storage_key, visibility,
tags, checksum_sha256, version, deleted_at)
sessions (id, user_id, token_hash, user_agent, ip, expires_at, revoked_at)
api_keys (id, user_id, prefix, token_hash, scope, expires_at, revoked_at)
user_prefs (user_id, key, value, updated_at)
agent_identities (id, user_id, name, description, avatar_id, skills,
meta, wallet_address, erc8004_agent_id, deleted_at)
agent_actions (id, agent_id, type, payload, source_skill,
signature, signer_address, created_at)
agent_memories (id, agent_id, type, content, tags, context,
salience, expires_at, created_at)
```
**OAuth 2.1**
```sql
oauth_clients (client_id, client_secret_hash, redirect_uris, grant_types, scope, ...)
oauth_auth_codes (code, client_id, user_id, code_challenge, expires_at, consumed_at)
oauth_refresh_tokens (token_hash, client_id, user_id, scope, expires_at, revoked_at, ...)
```
**Wallet & signing**
```sql
user_wallets (user_id, address, chain_type, chain_id, is_primary)
siwe_nonces (nonce, address, issued_at, expires_at, consumed_at)
siws_nonces (same shape for Solana)
gate_nonces (nonce, scene_gate_id, issued_at, consumed_at)
scene_gates (id, owner_id, scope, policy, created_at)
csrf_tokens (token, user_id, issued_at, consumed_at)
```
**Authentication extras**
```sql
email_verifications (token_hash, user_id, expires_at, consumed_at)
password_resets (token_hash, user_id, expires_at, consumed_at)
social_connections (user_id, provider, provider_user_id, access_token_hash, ...)
```
**Widgets**
```sql
widgets (id, owner_id, kind, config, public_slug, ...)
widget_views (widget_id, ip_hash, user_agent_hash, viewed_at)
```
**ERC-8004 / EVM indexing**
```sql
erc8004_agents_index (chain_id, agent_id, owner, token_uri, ...)
erc8004_crawl_cursor (chain_id, last_block, updated_at)
indexer_state (key, value, updated_at)
agent_registrations_pending (id, user_id, chain_id, typed_data, signed_payload, status, ...)
agent_delegations (agent_id, delegate, scope, expires_at, ...)
```
**Solana attestations & registration**
```sql
solana_attestations (asset_pubkey, kind, payload, signer, network, slot, sig)
solana_attestations_cursor (network, last_slot, updated_at)
solana_credentials (user_id, asset_pubkey, network, role)
pumpfun_signals (asset_pubkey, signal_kind, payload, observed_at)
pumpfun_graduations (mint, creator, graduated_at, amm_pool, ...)
```
**Marketplace, skills & royalties**
```sql
marketplace_skills (id, skill_uri, owner_id, title, description, price_usdc, ...)
skill_installs (skill_id, agent_id, installed_at)
skill_purchases (skill_id, buyer_user_id, price_usdc, settled_at, tx_hash)
skill_ratings (skill_id, rater_user_id, stars, comment, created_at)
agent_skill_prices (agent_id, skill_id, override_price_usdc)
royalty_ledger (id, owner_id, source, amount_usdc, settled_at, tx_hash)
plugins (id, owner_id, manifest, public_slug, ...)
```
**Subscriptions, DCA & payments**
```sql
subscriptions (id, user_id, plan_id, status, current_period_end, ...)
subscription_plans (id, owner_id, name, price_usd, cadence)
subscription_payments (subscription_id, status, amount_usdc, tx_hash, attempted_at)
creator_subscriptions (id, subscriber_user_id, plan_id, status, current_period_end, ...)
agent_subscriptions (id, agent_id, subscriber_user_id, status, ...)
agent_payments (id, agent_id, payer_user_id, amount_usdc, status, tx_hash)
agent_payment_intents (id, agent_id, status, payload, created_at)
plan_payment_intents (id, plan_id, status, payload, created_at)
dca_strategies (id, owner_id, source_token, target_token, cadence, amount, status)
dca_executions (strategy_id, status, amount, tx_hash, executed_at)
purchase_events (id, kind, payload, observed_at)
purchase_receipts (purchase_id, receipt_json, settled_at)
```
**Usage & quotas**
```sql
usage_events (user_id, api_key_id, client_id, avatar_id, kind, tool, status, bytes, latency_ms)
plan_quotas (plan, max_avatars, max_bytes_per_avatar, max_total_bytes)
```
---
## Build & Deployment
### npm Scripts
| Command | Description |
| -------------------------- | ------------------------------------------------------------------ |
| `npm run dev` | Vite dev server on port 3000 with HMR |
| `npm run build` | Production build to `dist/` |
| `npm run build:lib` | Build `<agent-3d>` web component library to `dist-lib/` |
| `npm run build:artifact` | Build standalone Claude artifact viewer bundle |
| `npm run build:all` | Chat build, then `build` + `build:lib` + `build:rider` in parallel |
| `npm run publish:lib` | Publish versioned CDN bundles to `/agent-3d/` |
| `npm run test` | Vitest unit suite + Playwright end-to-end suite |
| `npm run test:e2e` | Playwright end-to-end suite only |
| `npm run verify` | Prettier check + Vite build (pre-deploy gate) |
| `npm run format` | Prettier write (entire repo) |
| `npm run deploy:gcp` | Production deploy to Cloud Run: `check:dist` → `db:check` → `gcloud builds submit` → purge CDN |
| `npm run clean` | Remove `dist/` and `dist-lib/` |
| `npm run fetch-animations` | Download animation clip assets |
| `npm run generate-icons` | Generate PWA icon set |
| `npm run db:migrate` | Apply Postgres migrations from `scripts/migrations/` |
| `npm run db:status` | Show pending Postgres migrations |
| `npm run seed:skills` | Seed the skills registry from `skills-manifest.js` |
| `npm run install:sdk` | Install + build `agent-payments-sdk` and link it locally |
| `npm run validate:cards` | Validate agent definition cards in `src/agents/` |
| `npm run pump:smoke` | Run the pump.fun lifecycle smoke test |
### Claude CLI
`scripts/claude.sh` (aliased as `npm run claude`) wraps the npm scripts above with confirmation prompts on destructive commands (`deploy`, `db-migrate`). Useful when you want guard-rails or a single entry point for an agent to drive.
```bash
npm run claude -- <command>
# or
./scripts/claude.sh <command>
```
| Command | Wraps |
| --------------------- | ------------------------------------------ |
| `install-sdk` | `npm run install:sdk` |
| `validate-cards` | `npm run validate:cards` |
| `db-migrate` | `npm run db:migrate` (with confirmation) |
| `db-status` | `npm run db:status` |
| `pump-smoke-test` | `npm run pump:smoke` |
| `seed-skills` | `npm run seed:skills` |
| `test` | `npm run test` |
| `format` | `npm run format` |
| `clean` | `npm run clean` |
| `deploy` | `npm run deploy` (with confirmation) |
| `deploy-agent <name>` | Packages an agent into a distributable zip |
| `help` | List all commands |
### Production Deployment (Google Cloud Run)
Production runs on **Google Cloud Run** (`three-ws-api`, region `us-central1`): one Express container ([server/index.mjs](server/index.mjs)) serves the static frontend, the `vercel.json` route table, and every `api/**` handler, fronted by a global HTTPS load balancer + Cloud CDN. Deployment is two steps — build the frontend, then submit the container build:
```bash
npm run build # frontend build to dist/ (only when frontend changed)
npm run deploy:gcp # check:dist + db:check, gcloud builds submit, purge CDN
```
`npm run deploy:gcp` runs `gcloud builds submit --config server/cloudbuild.yaml`. Routing, cache headers, and cron schedules are defined in `vercel.json`, which the server reads at runtime. The scheduled jobs (103 at time of writing, one per entry in the `crons` array of `vercel.json`) run on **Cloud Scheduler** (provisioned by [scripts/create-gcp-scheduler.mjs](scripts/create-gcp-scheduler.mjs)); the GPU inference workers run as their own Cloud Run services. Full ops runbook (load balancer, DNS/TLS, env, rollback, recovery): **[docs/ops/gcp-production.md](docs/ops/gcp-production.md)**.
**Environment variables** live on the Cloud Run service, not in `.env` files — inspect or update them with `gcloud run services describe/update three-ws-api --region us-central1`. See [Environment Variables](#environment-variables) for the full list.
### Self-Hosting
For a traditional server deployment:
1. Build: `npm run build` → `dist/`
2. Serve `dist/` as static files (nginx, Caddy, Express)
3. Run `api/` endpoints via Node.js (serve them with the Express container in [server/index.mjs](server/index.mjs), same as production)
4. Connect to Postgres (Neon or self-hosted)
5. Connect to S3-compatible storage (R2, MinIO, AWS S3)
6. Schedule cron jobs with node-cron or systemd timers
**Minimal nginx config:**
```nginx
server {
listen 80;
root /var/www/3d-agent/dist;
index index.html;
location /api {
proxy_pass http://localhost:3001;
}
location / {
try_files $uri $uri/ /index.html;
}
}
```
### Versioning & Compatibility
three.ws follows [Semantic Versioning](https://semver.org). The authoritative version lives in [package.json](package.json); the current release is reflected in the badge at the top of this README.
**What "stable" means**
| Surface | Stability | Versioning |
| ---------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| `<agent-3d>` web component attributes, JS API, and events | **Stable** — semver-major bumps for breaking changes | Pin a major in your `<script>` tag, e.g. `/agent-3d/1.x/agent-3d.js` |
| `agent-manifest/0.2` JSON schema | **Stable** within `0.2.x`; `0.3` will be additive where possible | Indicated by the `spec` field on every manifest |
| Public REST API (`/api/agents`, `/api/widgets`, `/api/avatars`, `/api/chat`) | **Stable** — additive changes only without a major bump | Tracked in the OpenAPI doc at `/openapi.json` |
| OAuth 2.1 endpoints (`/oauth/*`, `/.well-known/*`) | **Stable** — frozen by the relevant RFCs | n/a |
| MCP surface at `POST /api/mcp` | **Stable** — pinned to protocol version `2025-06-18`; tool catalogue is additive | The protocol version is part of every response |
| Internal handlers, helpers under `api/_lib/`, `api/_mcp/` | **Unstable** — no compatibility guarantees | Subject to refactor between releases |
| Solidity contracts in `contracts/` | **Stable per deployment** — see [contracts/DEPLOYMENTS.md](contracts/DEPLOYMENTS.md) for addresses | New chains add rows; existing deployments are immutable |
**Pinning recommendations**
- For production embeds, pin to the patch version (`/agent-3d/1.5.2/agent-3d.js`) and bump deliberately.
- For prototypes, pin to the major (`/agent-3d/1.x/agent-3d.js`) so you receive bug-fixes automatically.
- For agent manifests, always set the `spec` field — the loader rejects manifests with an unknown spec rather than guessing.
- For API consumers, request `application/json` and inspect the response `version` header (present on every endpoint).
**Deprecation policy.** Stable surfaces get a deprecation notice in the changelog plus a runtime warning for at least one minor release before removal. Anything marked **unstable** in the table above may change at any time.
---
## Environment Variables
### Required (Backend)
```env
# App
PUBLIC_APP_ORIGIN=https://three.ws # No trailing slash
# Database
DATABASE_URL=postgres://user:pass@host/db # Neon or any Postgres 15+
# Object storage (Cloudflare R2 or S3-compatible)
S3_ENDPOINT=https://...
S3_ACCESS_KEY_ID=...
S3_SECRET_ACCESS_KEY=...
S3_BUCKET=3d-agent-avatars
S3_PUBLIC_DOMAIN=https://pub-<hash>.r2.dev # bucket's public origin (R2 dev domain)
# Public model URLs are served through the first-party CDN instead of that
# origin: https://three.ws/cdn/<r2-key> (api/cdn-object.js). The r2.dev domain is
# Cloudflare rate-limited and answers CORS with an exact-origin allowlist, so
# prefer /cdn/ in anything user- or developer-facing.
# Redis (rate limiting)
UPSTASH_REDIS_REST_URL=...
UPSTASH_REDIS_REST_TOKEN=...
# Auth
JWT_SECRET=<base64> # openssl rand -base64 64
JWT_KID=k1 # Key ID (rotate by incrementing)
PASSWORD_ROUNDS=11 # bcrypt cost factor
# LLM
ANTHROPIC_API_KEY=sk-ant-...
CHAT_MODEL=claude-sonnet-4-6
CHAT_MAX_TOKENS=1024
```
### Optional (Backend)
```env
# Email (required for registration flow)
RESEND_API_KEY=...
# Error monitoring
SENTRY_DSN=...
# Privy (social/embedded wallets)
PRIVY_APP_ID=...
PRIVY_APP_SECRET=...
# Avatar regeneration
AVATURN_API_KEY=...
AVATAR_REGEN_PROVIDER=none # none | avaturn
# EIP-7710 permissions relayer
PERMISSIONS_RELAYER_ENABLED=false
AGENT_RELAYER_KEY=0x...
AGENT_RELAYER_ADDRESS=0x...
# Per-chain RPC URLs (add chains as needed)
RPC_URL_84532=https://sepolia.base.org
RPC_URL_8453=https://mainnet.base.org
# IPFS pinning
PINATA_JWT=...
WEB3_STORAGE_TOKEN=... # Fallback
# Coin Communities chat (reads work without keys; posting needs these)
CC_API_KEY=... # read + WebSocket tickets
CC_SERVER_KEY=... # server-attributed posts (optional)
CC_SERVER_SECRET=...
```
> **Multiplayer / game server.** The Colyseus server in `multiplayer/` reads its own config — `PLAY_GATE_MINT` / `PLAY_GATE_MIN` and `HOLDER_PASS_SECRET` for the play-gate, and `GAME_TOKEN_MINT` / `GAME_TOKEN_TREASURY` / `GAME_TOKEN_BURN` / `GAME_TOKEN_SECRET` for the in-game $THREE economy. These belong to the game server's environment, not the Cloud Run handler pool.
### Optional (Frontend, prefixed `VITE_`)
```env
VITE_CHARACTER_STUDIO_URL=https://studio.three.ws # Avatar builder iframe origin
VITE_PRIVY_APP_ID=...
VITE_AVATURN_EDITOR_URL=https://editor.avaturn.me/
VITE_AVATURN_DEVELOPER_ID=...
```
---
## Testing
`npm run test` runs Vitest (unit + integration) followed by Playwright (end-to-end). API tests stub the database and auth layer; frontend tests stub the viewer. The project currently has ~150 test files spread across `tests/`, `tests/api/`, `tests/src/`, and `tests/e2e/`.
```bash
npm run test # Vitest then Playwright
npx vitest run tests/api/agents.test.js # Single Vitest file
npm run test:e2e # Playwright only
npm run verify # Prettier check + Vite build
```
**Representative Vitest coverage** (full inventory under [tests/](tests/)):
| Area | File |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Agent CRUD | [tests/api/agents.test.js](tests/api/agents.test.js) |
| Agent memory | [tests/api/agent-memory.test.js](tests/api/agent-memory.test.js), [tests/src/agent-memory.test.js](tests/src/agent-memory.test.js) |
| Agent protocol bus | [tests/agent-protocol.test.js](tests/agent-protocol.test.js), [tests/src/agent-protocol.test.js](tests/src/agent-protocol.test.js) |
| Widget CRUD | [tests/api/widgets.test.js](tests/api/widgets.test.js) |
| Widget types | [tests/src/widget-types.test.js](tests/src/widget-types.test.js) |
| OAuth flow | [tests/api/oauth-authorize.test.js](tests/api/oauth-authorize.test.js), [tests/api/oauth-token.test.js](tests/api/oauth-token.test.js), [tests/api/oauth-introspect.test.js](tests/api/oauth-introspect.test.js) |
| SIWE / SIWS wallet auth | [tests/api/siwe.test.js](tests/api/siwe.test.js) |
| Email + password auth | [tests/api/auth-email.test.js](tests/api/auth-email.test.js), [tests/api/auth-helpers.test.js](tests/api/auth-helpers.test.js) |
| API keys | [tests/api/api-keys.test.js](tests/api/api-keys.test.js) |
| LLM proxy | [tests/api/llm-anthropic.test.js](tests/api/llm-anthropic.test.js), [tests/api/chat-proxy-ratelimit.test.js](tests/api/chat-proxy-ratelimit.test.js) |
| MCP server | [tests/api/mcp.test.js](tests/api/mcp.test.js) |
| Schema validation | [tests/api-validate.test.js](tests/api-validate.test.js) |
| Crypto utilities | [tests/api/crypto.test.js](tests/api/crypto.test.js) |
| Embed CORS policy | [tests/api/embed-policy.test.js](tests/api/embed-policy.test.js) |
| Embed bridge handshake | [tests/embed-bridge-origin.test.js](tests/embed-bridge-origin.test.js), [tests/embed-bridge-roundtrip.test.js](tests/embed-bridge-roundtrip.test.js) |
| Animation slots / state | [tests/src/animation-slots.test.js](tests/src/animation-slots.test.js), [tests/animation-state-machine.test.js](tests/animation-state-machine.test.js), [tests/animations.test.js](tests/animations.test.js) |
| ARKit-52 morphs / lipsync | [tests/arkit52.test.js](tests/arkit52.test.js), [tests/arkit-blendshapes.test.js](tests/arkit-blendshapes.test.js), [tests/agent-avatar-lipsync.test.js](tests/agent-avatar-lipsync.test.js), [tests/lipsync-driver.test.js](tests/lipsync-driver.test.js), [tests/src/lip-sync-analyser.test.js](tests/src/lip-sync-analyser.test.js) |
| x402 protocol | [tests/api/x402.test.js](tests/api/x402.test.js), [tests/api/x402-spec.test.js](tests/api/x402-spec.test.js), [tests/api/x402-paid-endpoint-siwx.test.js](tests/api/x402-paid-endpoint-siwx.test.js), [tests/api/x402-gas-sponsoring.test.js](tests/api/x402-gas-sponsoring.test.js), [tests/api/x402-payment-identifier.test.js](tests/api/x402-payment-identifier.test.js) |
| Persona | [tests/api/persona.test.js](tests/api/persona.test.js) |
| Pump.fun MCP / skills | [tests/api/pump-fun-mcp.test.js](tests/api/pump-fun-mcp.test.js), [tests/pump-mcp-tools.test.js](tests/pump-mcp-tools.test.js), [tests/pumpfun-ported-skills.test.js](tests/pumpfun-ported-skills.test.js), [tests/src/pump-fun-skill.test.js](tests/src/pump-fun-skill.test.js) |
| Pump.fun pricing / curves | [tests/api/pump-curve.test.js](tests/api/pump-curve.test.js), [tests/bonding-curve.test.js](tests/bonding-curve.test.js), [tests/pump-swap-ix.test.js](tests/pump-swap-ix.test.js) |
| Pump.fun signals / live feed | [tests/pumpfun-signals.test.js](tests/pumpfun-signals.test.js), [tests/pumpfun-ws-feed.test.js](tests/pumpfun-ws-feed.test.js), [tests/pump-live-stream.test.js](tests/pump-live-stream.test.js), [tests/carbon-graduations.test.js](tests/carbon-graduations.test.js) |
| Club tips / payouts | [tests/api/club-tips.test.js](tests/api/club-tips.test.js), [tests/api/club-tips-stream.test.js](tests/api/club-tips-stream.test.js), [tests/api/club-payouts-cron.test.js](tests/api/club-payouts-cron.test.js), [tests/api/dance-tip.test.js](tests/api/dance-tip.test.js) |
| Club performance / venue | [tests/club-audio.test.js](tests/club-audio.test.js), [tests/club-camera.test.js](tests/club-camera.test.js), [tests/club-perf.test.js](tests/club-perf.test.js), [tests/club-venue-load.test.js](tests/club-venue-load.test.js), [tests/club-sequence.test.js](tests/club-sequence.test.js) |
| Avatar bake / snapshot | [tests/avatar-bake.test.js](tests/avatar-bake.test.js), [tests/avatar-snapshot.test.js](tests/avatar-snapshot.test.js), [tests/api/avatar-og.test.js](tests/api/avatar-og.test.js) |
| glTF canonicalize / extras | [tests/glb-canonicalize.test.js](tests/glb-canonicalize.test.js), [tests/src/gltf-extras.test.js](tests/src/gltf-extras.test.js), [tests/src/validator.test.js](tests/src/validator.test.js) |
| Vanity (Solana + EVM) | [tests/vanity-wasm-grinder.test.js](tests/vanity-wasm-grinder.test.js), [tests/src/eth-vanity-derivation.test.js](tests/src/eth-vanity-derivation.test.js), [tests/src/eth-vanity-server-verify.test.js](tests/src/eth-vanity-server-verify.test.js), [tests/src/vanity-validation.test.js](tests/src/vanity-validation.test.js) |
| Build asset paths | [tests/build-asset-paths.test.js](tests/build-asset-paths.test.js) |
| Agent monetization | [tests/agent-monetization.test.js](tests/agent-monetization.test.js) |
| Billing | [tests/billing.test.js](tests/billing.test.js) |
| Branding / camera presets | [tests/branding.test.js](tests/branding.test.js), [tests/camera-presets.test.js](tests/camera-presets.test.js) |
### Playwright end-to-end smokes
Browser-driven smokes live in [tests/e2e/](tests/e2e/) and run against the local dev stack (Vite + the `api/` handlers). They cover user-visible flows that don't fit in Vitest.
| Smoke | What it exercises |
| ------------------------------------------------ | ------------------------------------------------------------------------ |
| [tests/e2e/club.spec.js](tests/e2e/club.spec.js) | `/club` venue + HDRI load and audio session within the cold-start budget |
Run with `npx playwright test` (or `npm run test:e2e`). Configuration in [playwright.config.js](playwright.config.js); results in `test-results/` (gitignored).
### Smart contracts
Smart contract tests are in `contracts/test/` and run via Foundry:
```bash
cd contracts && forge test
```
CREATE2 vanity grinds for the multichain factory and payment contracts are recorded in [contracts/DEPLOYMENTS.md](contracts/DEPLOYMENTS.md).
---
## FAQ & Troubleshooting
**Does three.ws require a wallet to use?**
No. The viewer, agent runtime, manifest editor, and `/app` work without a wallet or an account. A wallet is only required for on-chain registration (ERC-8004 mint, Solana Metaplex Core mint) and for paid surfaces (x402 endpoints, agent token launches).
**Does my GLB get uploaded anywhere?**
Not unless you explicitly choose to publish or register the agent. Drag-and-drop in the viewer is fully client-side — the file never leaves the browser. The "Publish" and "Register" flows are the points where the GLB is uploaded to R2.
**Which LLM does the agent use?**
The default is Anthropic Claude (`claude-sonnet-4-6` for production, `claude-haiku-4-5-20251001` for low-cost development). Brain routing is configurable per-agent through the manifest and via the `brain` attribute on `<agent-3d>`. Other providers can be wired in by extending [`src/runtime/providers.js`](src/runtime/providers.js).
**Can I run three.ws fully offline?**
Yes for the viewer, no for the agent runtime. With `sandbox` set on `<agent-3d>` the element refuses all network calls; you can still load a local GLB, play animations, and exercise the manifest. The LLM brain, voice, and on-chain features require network connectivity.
**Why does the avatar appear black or all-white?**
Usually a missing HDR environment or a material that expects an environment map. Confirm the GLB has a default scene, that the lighting attributes (`exposure`, `env`) are set, and that your build has access to `public/env/` (the HDR assets ship there). For all-white avatars, check that morph targets aren't being zeroed by an empty emotion mix.
**The agent never speaks back. What's wrong?**
Most often the chat input isn't reaching the brain. Check (in order): (1) the `brain` attribute or `manifest.brain` is set; (2) the network panel shows a `POST /api/chat` (or the configured proxy) succeeding; (3) the response body isn't blocked by a Content Security Policy; (4) TTS is supported and not muted at the OS level. If running locally, set `ANTHROPIC_API_KEY` in `.env.local`.
**Why does microphone capture fail on my deployment?**
`getUserMedia` requires HTTPS. Localhost is exempt; any remote deployment needs TLS. Vercel and Netlify provide it automatically. Self-hosted deployments must terminate TLS in front of the app.
**How big can a GLB be?**
Hard ceiling: 50 MB before the loader refuses (configurable via the `maxBytes` attribute). Soft target: ≤8 MB for sub-3-second cold start over a typical broadband connection. Run `npx gltf-transform draco input.glb output.glb` and `npx gltf-transform ktx output.glb output.ktx2.glb` to compress aggressively without visual loss.
**Can I host the web component on my own CDN?**
Yes. Run `npm run build:lib` and serve the resulting `dist-lib/agent-3d.js` from anywhere. Update the `<script>` tag in your embed snippet accordingly. The element has no hard-coded origin assumption — it only contacts the backend you point its `manifest`/`brain` attributes at.
**How do I rotate `JWT_SECRET` without invalidating sessions?**
Increment `JWT_KID` and add the new secret. Existing tokens continue to validate against the old `kid`; new tokens sign with the new one. Drop the old `kid` from rotation after the session window (default 30 days) expires.
**Where do I get help?**
- Bugs and feature requests: [open a GitHub issue](https://github.com/nirholas/three.ws/issues)
- Security: see [Reporting Security Issues](#reporting-security-issues)
- Discussion and showcase: [GitHub Discussions](https://github.com/nirholas/three.ws/discussions)
- Live status: [three.ws](https://three.ws)
---
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md) for the full contributor guide. Contributors are expected to follow the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md) in every project space — issues, pull requests, discussions, and any community channel that links to this repository.
**Quick rules:**
- Match existing style — no reformatting adjacent code
- Every changed line should trace to the task
- Add tests for new API endpoints
- Run `npm run verify` before opening a PR (Prettier + build check)
- Keep PRs focused — one concern per PR
**Branch conventions:**
- `feat/...` — new features
- `fix/...` — bug fixes
- `refactor/...` — structural changes without behavior changes
- `docs/...` — documentation only
**Development tips:**
- The viewer runs standalone at `/app` — no auth, no backend required
- Use `mode=view` in the `<agent-3d>` element to test rendering without a brain
- Set `CHAT_MODEL=claude-haiku-4-5-20251001` locally to keep API costs low during development
- The MCP server can be tested with `curl` — it's plain JSON-RPC over HTTP
### Reporting Security Issues
Please **do not** file public GitHub issues for vulnerabilities. Disclosure runs on a coordinated timeline so users get a fix before details circulate.
1. Email **security@three.ws** (or open a [private GitHub security advisory](https://github.com/nirholas/three.ws/security/advisories/new) on the mirror repos) with a clear write-up: affected component, reproduction steps, and the impact you observed.
2. You will receive an acknowledgement within two business days.
3. We aim to ship a fix or mitigation within 30 days for high-severity reports, and to credit reporters in the release notes (unless you ask to remain anonymous).
The current threat model and hardening notes live in [specs/SECURITY.md](specs/SECURITY.md) and [docs/security.md](docs/security.md). The [Security Hardening](#security-hardening) section above summarises the in-tree controls.
In-scope: this repository and its deployed surfaces (`three.ws` including the `/cdn/` asset route, and `*.three.ws`). Out-of-scope: third-party services we integrate with (Google Cloud, Neon, Cloudflare R2, Upstash, Privy, Anthropic, ElevenLabs, pump.fun) — please report directly to them.
---
## Contributors
Thanks to everyone who has contributed to this project. Commit-level contributors are visible in [the GitHub contributors graph](https://github.com/nirholas/three.ws/graphs/contributors); a few standouts:
- [@nirholas](https://github.com/nirholas) — maintainer
- [@humanoidrobot-glitch](https://github.com/humanoidrobot-glitch) — thank you for your contributions!
- [@overstepping](https://github.com/overstepping) — thank you for your contributions!
- [@swarmsyy](https://github.com/swarmsyy) — thank you for your contributions!
Want your name here? Open a PR — see [Contributing](#contributing).
---
## License
All rights reserved. See [LICENSE](LICENSE).
Connection Info
You Might Also Like
markitdown
Python tool for converting files and office documents to Markdown.
OpenAI Whisper
OpenAI Whisper MCP Server - 基于本地 Whisper CLI 的离线语音识别与翻译,无需 API Key,支持...
oh-my-opencode
Background agents · Curated agents like oracle, librarians, frontend...
claude-flow
Claude-Flow v2.7.0 is an enterprise AI orchestration platform.
ai-engineering-from-scratch
Learn it. Build it. Ship it for others. The most comprehensive open-source...
chatbox
User-friendly Desktop Client App for AI Models/LLMs (GPT, Claude, Gemini, Ollama...)