diff --git a/src/fonts/generic-mono.otf b/src/assets/fonts/generic-mono.otf similarity index 100% rename from src/fonts/generic-mono.otf rename to src/assets/fonts/generic-mono.otf diff --git a/src/assets/models/Buttons texture.png b/src/assets/models/Buttons texture.png new file mode 100644 index 0000000..a1ae914 Binary files /dev/null and b/src/assets/models/Buttons texture.png differ diff --git a/src/assets/models/emulator.blend b/src/assets/models/emulator.blend new file mode 100644 index 0000000..78ce3bf Binary files /dev/null and b/src/assets/models/emulator.blend differ diff --git a/src/assets/models/emulator.mtl b/src/assets/models/emulator.mtl new file mode 100644 index 0000000..bc7c287 --- /dev/null +++ b/src/assets/models/emulator.mtl @@ -0,0 +1,42 @@ +# Blender 3.5.1 MTL File: 'emulator.blend' +# www.blender.org + +newmtl Behind_buttons +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.001734 0.004824 0.007141 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.550000 +d 1.000000 +illum 2 + +newmtl Button +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd Buttons texture.png + +newmtl Case +Ns 298.057037 +Ka 1.000000 1.000000 1.000000 +Kd 0.057402 0.087001 0.228570 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Screen +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.010867 0.020340 0.012183 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 diff --git a/src/assets/models/emulator.obj b/src/assets/models/emulator.obj new file mode 100644 index 0000000..8932483 --- /dev/null +++ b/src/assets/models/emulator.obj @@ -0,0 +1,4082 @@ +# Blender 3.5.1 +# www.blender.org +mtllib emulator.mtl +o Case +v -0.239271 -0.147539 -0.019172 +v -0.000000 -0.386810 -0.019172 +v 0.239271 -0.147539 -0.019172 +v -0.000000 0.091731 -0.019172 +v -0.239271 -0.267175 -0.019172 +v -0.119635 -0.386810 -0.019172 +v 0.239271 -0.267175 -0.019172 +v 0.119635 0.091731 -0.019172 +v -0.239271 -0.027904 -0.019172 +v 0.119635 -0.386810 -0.019172 +v 0.239271 -0.027904 -0.019172 +v -0.119635 0.091731 -0.019172 +v -0.239271 -0.267175 0.000034 +v -0.119635 -0.386810 0.000034 +v 0.239271 -0.267175 0.000034 +v 0.119635 0.091731 0.000034 +v -0.239271 -0.027904 0.000034 +v -0.239271 -0.147539 0.000034 +v 0.119635 -0.386810 0.000034 +v -0.000000 -0.386810 0.000034 +v 0.239271 -0.027904 0.000034 +v 0.239271 -0.147539 0.000034 +v -0.119635 0.091731 0.000034 +v -0.000000 0.091731 0.000034 +v -0.300000 -0.442539 0.075033 +v -0.295000 -0.447539 0.075033 +v -0.295000 -0.442539 0.080828 +v -0.295000 0.447461 0.080828 +v -0.295000 0.452461 0.075033 +v -0.300000 0.447461 0.075033 +v -0.295000 -0.447539 -0.013376 +v -0.300000 -0.442539 -0.013376 +v -0.295000 -0.442539 -0.019172 +v -0.300000 0.447461 -0.013376 +v -0.295000 0.452461 -0.013376 +v -0.294538 0.448820 -0.019172 +v 0.295000 -0.447539 0.075033 +v 0.300000 -0.442539 0.075033 +v 0.295000 -0.442539 0.080828 +v 0.300000 0.447461 0.075033 +v 0.295000 0.452461 0.075033 +v 0.295000 0.447461 0.080828 +v 0.295000 -0.442539 -0.019172 +v 0.300000 -0.442539 -0.013376 +v 0.295000 -0.447539 -0.013376 +v 0.295000 0.452461 -0.013376 +v 0.300000 0.447461 -0.013376 +v 0.294538 0.448820 -0.019172 +v -0.300000 0.142461 0.075033 +v -0.295000 0.142461 0.080828 +v -0.300000 0.142461 -0.013376 +v -0.294556 0.142461 -0.019172 +v 0.294556 0.142461 -0.019172 +v 0.300000 0.142461 -0.013376 +v 0.300000 0.142461 0.075033 +v 0.295000 0.142461 0.080828 +v -0.239271 -0.381810 -0.019172 +v -0.234271 -0.386810 -0.019172 +v -0.234271 -0.386810 -0.019172 +v -0.242806 -0.390345 -0.019172 +v -0.239271 -0.381810 -0.019172 +v 0.239271 -0.386810 -0.019172 +v 0.239271 -0.386810 -0.019172 +v 0.239271 -0.381810 -0.019172 +v 0.242806 -0.390345 -0.019172 +v 0.234271 -0.386810 -0.019172 +v -0.239271 0.091731 -0.019172 +v -0.239271 0.091731 -0.019172 +v -0.239271 0.086731 -0.019172 +v -0.243108 0.094937 -0.019172 +v -0.234271 0.091731 -0.019172 +v 0.239271 0.086731 -0.019172 +v 0.234271 0.091731 -0.019172 +v 0.234271 0.091731 -0.019172 +v 0.243108 0.094937 -0.019172 +v 0.239271 0.086731 -0.019172 +v 0.235000 0.412461 0.003237 +v 0.240000 0.407461 0.003237 +v 0.240000 0.177461 0.003237 +v 0.235000 0.172461 0.003237 +v -0.240000 0.407461 0.003237 +v -0.235000 0.412461 0.003237 +v -0.235000 0.172461 0.003237 +v -0.240000 0.177461 0.003237 +v -0.234271 -0.386810 0.000034 +v -0.239271 -0.381810 0.000034 +v 0.239271 -0.381810 0.000034 +v 0.234271 -0.386810 0.000034 +v 0.234271 0.091731 0.000034 +v 0.239271 0.086731 0.000034 +v -0.239271 0.086731 0.000034 +v -0.234271 0.091731 0.000034 +v 0.240000 0.407461 -0.013376 +v 0.235000 0.412461 -0.013376 +v 0.245873 0.416377 -0.019172 +v 0.240000 0.177461 -0.013376 +v 0.245880 0.169521 -0.019172 +v 0.235000 0.172461 -0.013376 +v -0.235000 0.412461 -0.013376 +v -0.240000 0.407461 -0.013376 +v -0.245874 0.416377 -0.019172 +v -0.235000 0.172461 -0.013376 +v -0.245880 0.169521 -0.019172 +v -0.240000 0.177461 -0.013376 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.6036 -0.6036 0.5208 +vn -0.6036 0.6036 0.5208 +vn -0.6036 -0.6036 -0.5208 +vn -0.6323 0.6323 -0.4477 +vn 0.6036 -0.6036 0.5208 +vn 0.6036 0.6036 0.5208 +vn 0.6036 -0.6036 -0.5208 +vn 0.6323 0.6323 -0.4477 +vn -0.3428 -0.3428 -0.8747 +vn -0.3607 0.3607 -0.8601 +vn 0.3428 -0.3428 -0.8747 +vn 0.3607 0.3607 -0.8601 +vn -0.7071 -0.7071 -0.0000 +vn -0.7571 -0.0000 0.6532 +vn -0.7071 0.7071 -0.0000 +vn -0.7289 0.0006 -0.6847 +vn -0.0000 -0.7572 -0.6532 +vn -0.0000 0.8467 -0.5320 +vn 0.7289 0.0006 -0.6847 +vn 0.7071 -0.7071 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.7571 -0.0000 0.6532 +vn -0.0000 -0.7571 0.6532 +vn -0.0000 0.7571 0.6532 +vn -0.7277 -0.0000 -0.6859 +vn 0.7277 -0.0000 -0.6859 +vn -0.7023 -0.0000 -0.7118 +vn -0.0000 -0.8286 -0.5598 +vn 0.6954 -0.6954 -0.1810 +vn -0.0000 0.8918 -0.4524 +vn 0.7023 -0.0000 -0.7118 +vn -0.7572 -0.0000 0.6532 +vn -0.7571 -0.0000 -0.6532 +vn -0.0000 -0.7571 -0.6532 +vn 0.7571 -0.0000 -0.6532 +vn -0.0000 -0.7572 0.6532 +vn -0.0000 0.7572 0.6532 +vn -0.7289 -0.0000 -0.6847 +vn 0.7289 -0.0000 -0.6847 +vn 0.7572 -0.0000 0.6532 +vn -0.7020 -0.0000 -0.7122 +vn -0.6954 0.6954 -0.1810 +vn 0.7020 -0.0000 -0.7122 +vt 0.437500 0.250000 +vt 0.375000 0.375000 +vt 0.437500 0.500000 +vt 0.500000 0.375000 +vt 0.406250 0.250000 +vt 0.375000 0.312500 +vt 0.406250 0.500000 +vt 0.500000 0.437500 +vt 0.468750 0.250000 +vt 0.375000 0.437500 +vt 0.468750 0.500000 +vt 0.500000 0.312500 +vt 0.406250 0.250000 +vt 0.375000 0.312500 +vt 0.406250 0.500000 +vt 0.500000 0.437500 +vt 0.468750 0.250000 +vt 0.437500 0.250000 +vt 0.375000 0.437500 +vt 0.375000 0.375000 +vt 0.468750 0.500000 +vt 0.437500 0.500000 +vt 0.500000 0.312500 +vt 0.500000 0.375000 +vt 0.376059 0.014488 +vt 0.125000 0.735512 +vt 0.376059 1.000000 +vt 0.127083 0.735512 +vt 0.376059 0.997917 +vt 0.127083 0.750000 +vt 0.622984 0.997917 +vt 0.872917 0.735512 +vt 0.625000 0.997917 +vt 0.622984 0.014488 +vt 0.622984 1.000000 +vt 0.875000 0.735512 +vt 0.127083 0.514488 +vt 0.125000 0.514488 +vt 0.376059 0.235512 +vt 0.344125 0.229417 +vt 0.376059 0.250000 +vt 0.127083 0.500000 +vt 0.875000 0.514488 +vt 0.622984 0.235512 +vt 0.872917 0.514488 +vt 0.000000 0.000000 +vt 0.872724 0.500000 +vt 0.623532 0.250000 +vt 0.852242 0.477242 +vt 0.372917 0.735512 +vt 0.375000 0.735512 +vt 0.376059 0.735512 +vt 0.376059 0.752083 +vt 0.372917 0.750000 +vt 0.622984 0.735512 +vt 0.625000 0.735512 +vt 0.625000 0.752083 +vt 0.627083 0.735512 +vt 0.622984 0.750000 +vt 0.622984 0.752083 +vt 0.344125 0.458834 +vt 0.372917 0.500000 +vt 0.376059 0.500000 +vt 0.376059 0.514488 +vt 0.375000 0.514488 +vt 0.372917 0.514488 +vt 0.627083 0.500000 +vt 0.627083 0.514488 +vt 0.625000 0.500000 +vt 0.622984 0.514488 +vt 0.000000 0.000000 +vt 0.623532 0.500000 +vt 0.625000 0.500000 +vt 0.500000 1.000000 +vt 0.500000 0.014488 +vt 0.500000 0.997917 +vt 0.500000 0.235512 +vt -0.002104 -0.001403 +vt 0.000000 0.000000 +vt 0.500000 0.250000 +vt -0.002104 -0.002805 +vt 0.000000 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.514488 +vt 0.500000 0.735512 +vt 0.500000 0.752083 +vt 0.000000 0.000000 +vt 0.376306 0.250000 +vt 0.000000 0.000000 +vt 0.375000 0.252612 +vt 0.000000 0.000000 +vt 0.021832 0.014554 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.021832 0.029109 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.500000 0.250000 +vt 0.000000 0.000000 +vt 0.500000 0.250000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.498694 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.497388 +vt 0.000000 0.000000 +vt 0.500000 0.500000 +vt 0.000000 0.000000 +vt 0.500000 0.500000 +vt 0.000000 0.000000 +vt 0.498694 0.500000 +vt 0.625000 0.497396 +vt 0.622396 0.500000 +vt 0.502604 0.500000 +vt 0.500000 0.497396 +vt 0.622396 0.250000 +vt 0.625000 0.252604 +vt 0.500000 0.252604 +vt 0.502604 0.250000 +vt 0.375000 0.252612 +vt 0.376306 0.250000 +vt 0.376306 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.497388 +vt 0.375000 0.500000 +vt 0.500000 0.497388 +vt 0.498694 0.500000 +vt 0.498694 0.250000 +vt 0.500000 0.252612 +vt 0.622396 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.497396 +vt 0.000000 0.000000 +vt 0.625000 0.500000 +vt 0.502604 0.500000 +vt 0.000000 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.497396 +vt 0.625000 0.250000 +vt 0.625000 0.252604 +vt 0.622396 0.250000 +vt 0.625000 0.250000 +vt 0.649473 0.274473 +vt 0.000000 0.000000 +vt 0.500000 0.252604 +vt 0.000000 0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.250000 +vt 0.502604 0.250000 +s 0 +usemtl Case +f 35/45/1 41/58/1 46/68/1 +f 65/99/2 76/115/2 53/81/2 +f 30/34/3 51/77/3 49/75/3 +f 56/86/4 27/29/4 39/53/4 +f 70/106/2 61/93/2 33/40/2 +f 42/60/4 50/76/4 56/86/4 +f 47/70/5 55/85/5 54/84/5 +f 45/66/6 26/28/6 31/37/6 +f 5/5/5 86/126/5 57/88/5 +f 60/92/2 66/100/2 43/61/2 +f 95/139/2 36/49/2 48/73/2 +f 53/82/2 95/138/2 48/71/2 +f 9/9/5 18/18/5 1/1/5 +f 73/110/6 16/16/6 8/8/6 +f 1/1/5 13/13/5 5/5/5 +f 2/2/1 19/19/1 10/10/1 +f 6/6/1 20/20/1 2/2/1 +f 3/3/3 21/21/3 11/11/3 +f 7/7/3 22/22/3 3/3/3 +f 4/4/6 23/23/6 12/12/6 +f 58/90/1 14/14/1 6/6/1 +f 8/8/6 24/24/6 4/4/6 +f 7/7/3 87/127/3 15/15/3 +f 12/12/6 92/134/6 68/104/6 +f 10/10/1 88/129/1 63/96/1 +f 9/9/5 91/133/5 17/17/5 +f 11/11/3 90/132/3 72/108/3 +f 93/135/3 79/119/3 78/118/3 +f 101/150/2 52/79/2 36/46/2 +f 54/84/5 38/52/5 44/64/5 +f 75/113/2 71/107/2 52/79/2 +f 97/141/2 52/79/2 103/152/2 +f 99/146/6 77/117/6 82/122/6 +f 98/144/1 83/123/1 80/120/1 +f 104/155/5 81/121/5 84/124/5 +f 25/26/7 26/28/7 27/30/7 +f 28/31/8 29/33/8 30/35/8 +f 31/37/9 32/38/9 33/42/9 +f 34/43/10 35/45/10 36/47/10 +f 37/50/11 38/51/11 39/54/11 +f 40/55/12 41/56/12 42/59/12 +f 43/63/13 44/64/13 45/65/13 +f 46/67/14 47/69/14 48/73/14 +f 58/89/2 60/92/2 61/93/2 +f 63/97/2 65/99/2 66/100/2 +f 68/103/2 70/106/2 71/107/2 +f 73/109/2 75/114/2 76/116/2 +f 93/135/15 94/136/15 95/139/15 +f 96/140/16 97/142/16 98/143/16 +f 99/145/17 100/147/17 101/148/17 +f 102/151/18 103/153/18 104/154/18 +f 26/28/19 32/38/19 31/37/19 +f 28/31/20 49/74/20 50/76/20 +f 35/45/21 30/36/21 29/32/21 +f 33/41/22 51/77/22 52/80/22 +f 31/37/23 43/62/23 45/66/23 +f 46/68/24 36/49/24 35/45/24 +f 54/84/25 43/63/25 53/83/25 +f 45/66/26 38/52/26 37/50/26 +f 41/58/27 47/70/27 46/68/27 +f 39/53/28 55/85/28 56/86/28 +f 37/50/29 27/30/29 26/28/29 +f 29/33/30 42/60/30 41/57/30 +f 50/76/20 25/27/20 27/29/20 +f 52/80/31 34/44/31 36/48/31 +f 47/70/32 53/83/32 48/72/32 +f 56/86/28 40/55/28 42/60/28 +f 97/142/33 93/135/33 95/139/33 +f 95/139/34 99/146/34 101/149/34 +f 91/133/35 67/102/35 92/134/35 +f 58/90/27 86/126/27 85/125/27 +f 62/95/1 87/128/1 63/96/1 +f 90/132/19 73/110/19 72/108/19 +f 98/144/36 103/153/36 102/151/36 +f 100/147/37 103/153/37 101/148/37 +f 78/118/19 94/137/19 93/135/19 +f 96/140/21 80/120/21 79/119/21 +f 82/122/26 100/147/26 99/146/26 +f 102/151/27 84/124/27 83/123/27 +f 49/75/3 32/39/3 25/25/3 +f 35/45/1 29/32/1 41/58/1 +f 53/81/2 43/61/2 65/99/2 +f 65/99/2 64/98/2 76/115/2 +f 76/115/2 75/113/2 53/81/2 +f 30/34/3 34/44/3 51/77/3 +f 56/86/4 50/76/4 27/29/4 +f 33/40/2 52/78/2 70/106/2 +f 70/106/2 69/105/2 61/93/2 +f 61/93/2 60/92/2 33/40/2 +f 42/60/4 28/31/4 50/76/4 +f 47/70/5 40/55/5 55/85/5 +f 45/66/6 37/50/6 26/28/6 +f 5/5/5 13/13/5 86/126/5 +f 43/61/2 33/40/2 60/92/2 +f 60/92/2 59/91/2 66/100/2 +f 66/100/2 65/99/2 43/61/2 +f 95/139/2 101/149/2 36/49/2 +f 53/82/2 97/141/2 95/138/2 +f 9/9/5 17/17/5 18/18/5 +f 73/110/6 89/131/6 16/16/6 +f 1/1/5 18/18/5 13/13/5 +f 2/2/1 20/20/1 19/19/1 +f 6/6/1 14/14/1 20/20/1 +f 3/3/3 22/22/3 21/21/3 +f 7/7/3 15/15/3 22/22/3 +f 4/4/6 24/24/6 23/23/6 +f 58/90/1 85/125/1 14/14/1 +f 8/8/6 16/16/6 24/24/6 +f 7/7/3 62/95/3 87/127/3 +f 12/12/6 23/23/6 92/134/6 +f 10/10/1 19/19/1 88/129/1 +f 9/9/5 67/102/5 91/133/5 +f 11/11/3 21/21/3 90/132/3 +f 93/135/3 96/140/3 79/119/3 +f 101/150/2 103/152/2 52/79/2 +f 54/84/5 55/85/5 38/52/5 +f 52/79/2 53/82/2 75/113/2 +f 75/113/2 74/111/2 71/107/2 +f 71/107/2 70/106/2 52/79/2 +f 97/141/2 53/82/2 52/79/2 +f 99/146/6 94/137/6 77/117/6 +f 98/144/1 102/151/1 83/123/1 +f 104/155/5 100/147/5 81/121/5 +f 58/89/1 59/91/1 60/92/1 +f 61/93/1 57/87/1 58/89/1 +f 66/100/1 62/94/1 63/97/1 +f 63/97/2 64/98/2 65/99/2 +f 71/107/1 67/101/1 68/103/1 +f 68/103/2 69/105/2 70/106/2 +f 73/109/1 74/112/1 75/114/1 +f 76/116/1 72/108/1 73/109/1 +f 26/28/19 25/26/19 32/38/19 +f 28/31/38 30/35/38 49/74/38 +f 35/45/21 34/43/21 30/36/21 +f 33/41/39 32/39/39 51/77/39 +f 31/37/40 33/42/40 43/62/40 +f 46/68/24 48/73/24 36/49/24 +f 54/84/41 44/64/41 43/63/41 +f 45/66/26 44/64/26 38/52/26 +f 41/58/27 40/55/27 47/70/27 +f 39/53/28 38/52/28 55/85/28 +f 37/50/42 39/54/42 27/30/42 +f 29/33/43 28/31/43 42/60/43 +f 50/76/20 49/74/20 25/27/20 +f 52/80/44 51/77/44 34/44/44 +f 47/70/45 54/84/45 53/83/45 +f 56/86/46 55/85/46 40/55/46 +f 97/142/47 96/140/47 93/135/47 +f 95/139/34 94/137/34 99/146/34 +f 91/133/1 68/104/1 67/102/1 +f 58/90/27 57/88/27 86/126/27 +f 62/95/48 88/130/48 87/128/48 +f 90/132/19 89/131/19 73/110/19 +f 98/144/36 97/142/36 103/153/36 +f 100/147/49 104/155/49 103/153/49 +f 78/118/19 77/117/19 94/137/19 +f 96/140/21 98/144/21 80/120/21 +f 82/122/26 81/121/26 100/147/26 +f 102/151/27 104/155/27 84/124/27 +f 49/75/3 51/77/3 32/39/3 +o Screen +v 0.240000 0.412461 0.003237 +v 0.240000 0.172461 0.003237 +v -0.240000 0.412461 0.003237 +v -0.240000 0.172461 0.003237 +vn -0.0000 -0.0000 -1.0000 +vt 0.625000 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.250000 +vt 0.500000 0.250000 +s 0 +usemtl Screen +f 107/158/50 106/157/50 108/159/50 +f 107/158/50 105/156/50 106/157/50 +o Behind_buttons +v -0.262422 -0.414205 0.036244 +v 0.262422 -0.414205 0.036244 +v -0.262422 0.110639 0.036244 +v 0.262422 0.110639 0.036244 +vn -0.0000 -0.0000 -1.0000 +vt 0.732313 0.071449 +vt 0.732313 0.732313 +vt 0.071449 0.071449 +vt 0.071449 0.732313 +s 0 +usemtl Behind_buttons +f 111/162/51 110/161/51 109/160/51 +f 111/162/51 112/163/51 110/161/51 +o Buttons +v 0.133830 0.087751 0.000030 +v 0.126318 0.081027 -0.008838 +v 0.121830 0.075751 0.000030 +v 0.126659 0.085782 -0.002568 +v 0.124605 0.084600 -0.001463 +v 0.123144 0.082267 -0.002568 +v 0.125344 0.084236 0.000030 +v 0.235937 0.075751 0.000030 +v 0.231448 0.081027 -0.008838 +v 0.223937 0.087751 0.000030 +v 0.234622 0.082267 -0.002568 +v 0.233162 0.084600 -0.001463 +v 0.231107 0.085782 -0.002568 +v 0.232422 0.084236 0.000030 +v 0.223937 -0.026203 0.000030 +v 0.231448 -0.019479 -0.008838 +v 0.235937 -0.014203 0.000030 +v 0.231107 -0.024234 -0.002568 +v 0.233162 -0.023052 -0.001463 +v 0.234622 -0.020719 -0.002568 +v 0.232422 -0.022688 0.000030 +v 0.121830 -0.014203 0.000030 +v 0.126318 -0.019479 -0.008838 +v 0.133830 -0.026203 0.000030 +v 0.123144 -0.020719 -0.002568 +v 0.124605 -0.023052 -0.001463 +v 0.126659 -0.024234 -0.002568 +v 0.125344 -0.022688 0.000030 +v 0.150196 0.063234 -0.032304 +v 0.138196 0.051234 -0.032304 +v 0.133707 0.069958 -0.023436 +v 0.141711 0.059719 -0.032304 +v 0.139460 0.062346 -0.030811 +v 0.136881 0.061689 -0.029706 +v 0.140396 0.065204 -0.029706 +v 0.224059 0.069958 -0.023436 +v 0.219570 0.051234 -0.032304 +v 0.207570 0.063234 -0.032304 +v 0.220885 0.061689 -0.029706 +v 0.218306 0.062346 -0.030811 +v 0.216055 0.059719 -0.032304 +v 0.217370 0.065204 -0.029706 +v 0.224059 -0.008410 -0.023436 +v 0.207570 -0.001686 -0.032304 +v 0.219570 0.010314 -0.032304 +v 0.217370 -0.003655 -0.029706 +v 0.218306 -0.000798 -0.030811 +v 0.216055 0.001829 -0.032304 +v 0.220885 -0.000141 -0.029706 +v 0.133707 -0.008410 -0.023436 +v 0.138196 0.010314 -0.032304 +v 0.150196 -0.001686 -0.032304 +v 0.136881 -0.000141 -0.029706 +v 0.139460 -0.000798 -0.030811 +v 0.141711 0.001829 -0.032304 +v 0.140396 -0.003655 -0.029706 +v 0.014723 0.087751 0.000030 +v 0.007211 0.081027 -0.008838 +v 0.002723 0.075751 0.000030 +v 0.007552 0.085782 -0.002568 +v 0.005498 0.084600 -0.001463 +v 0.004037 0.082267 -0.002568 +v 0.006237 0.084236 0.000030 +v 0.116830 0.075751 0.000030 +v 0.112341 0.081027 -0.008838 +v 0.104830 0.087751 0.000030 +v 0.115515 0.082267 -0.002568 +v 0.114055 0.084600 -0.001463 +v 0.112000 0.085782 -0.002568 +v 0.113315 0.084236 0.000030 +v 0.104830 -0.026203 0.000030 +v 0.112341 -0.019479 -0.008838 +v 0.116830 -0.014203 0.000030 +v 0.112000 -0.024234 -0.002568 +v 0.114055 -0.023052 -0.001463 +v 0.115515 -0.020719 -0.002568 +v 0.113315 -0.022688 0.000030 +v 0.002723 -0.014203 0.000030 +v 0.007211 -0.019479 -0.008838 +v 0.014723 -0.026203 0.000030 +v 0.004037 -0.020719 -0.002568 +v 0.005498 -0.023052 -0.001463 +v 0.007552 -0.024234 -0.002568 +v 0.006237 -0.022688 0.000030 +v 0.031089 0.063234 -0.032304 +v 0.019089 0.051234 -0.032304 +v 0.014600 0.069958 -0.023436 +v 0.022604 0.059719 -0.032304 +v 0.020353 0.062346 -0.030811 +v 0.017774 0.061689 -0.029706 +v 0.021289 0.065204 -0.029706 +v 0.104952 0.069958 -0.023436 +v 0.100463 0.051234 -0.032304 +v 0.088463 0.063234 -0.032304 +v 0.101778 0.061689 -0.029706 +v 0.099199 0.062346 -0.030811 +v 0.096948 0.059719 -0.032304 +v 0.098263 0.065204 -0.029706 +v 0.104952 -0.008410 -0.023436 +v 0.088463 -0.001686 -0.032304 +v 0.100463 0.010314 -0.032304 +v 0.098263 -0.003655 -0.029706 +v 0.099199 -0.000798 -0.030811 +v 0.096948 0.001829 -0.032304 +v 0.101778 -0.000141 -0.029706 +v 0.014600 -0.008410 -0.023436 +v 0.019089 0.010314 -0.032304 +v 0.031089 -0.001686 -0.032304 +v 0.017774 -0.000141 -0.029706 +v 0.020353 -0.000798 -0.030811 +v 0.022604 0.001829 -0.032304 +v 0.021289 -0.003655 -0.029706 +v -0.104385 0.087751 0.000030 +v -0.111896 0.081027 -0.008838 +v -0.116385 0.075751 0.000030 +v -0.111555 0.085782 -0.002568 +v -0.113609 0.084600 -0.001463 +v -0.115070 0.082267 -0.002568 +v -0.112870 0.084236 0.000030 +v -0.002277 0.075751 0.000030 +v -0.006766 0.081027 -0.008838 +v -0.014277 0.087751 0.000030 +v -0.003592 0.082267 -0.002568 +v -0.005052 0.084600 -0.001463 +v -0.007107 0.085782 -0.002568 +v -0.005792 0.084236 0.000030 +v -0.014277 -0.026203 0.000030 +v -0.006766 -0.019479 -0.008838 +v -0.002277 -0.014203 0.000030 +v -0.007107 -0.024234 -0.002568 +v -0.005052 -0.023052 -0.001463 +v -0.003592 -0.020719 -0.002568 +v -0.005792 -0.022688 0.000030 +v -0.116385 -0.014203 0.000030 +v -0.111896 -0.019479 -0.008838 +v -0.104385 -0.026203 0.000030 +v -0.115070 -0.020719 -0.002568 +v -0.113609 -0.023052 -0.001463 +v -0.111555 -0.024234 -0.002568 +v -0.112870 -0.022688 0.000030 +v -0.088018 0.063234 -0.032304 +v -0.100018 0.051234 -0.032304 +v -0.104507 0.069958 -0.023436 +v -0.096503 0.059719 -0.032304 +v -0.098754 0.062346 -0.030811 +v -0.101333 0.061689 -0.029706 +v -0.097818 0.065204 -0.029706 +v -0.014155 0.069958 -0.023436 +v -0.018644 0.051234 -0.032304 +v -0.030644 0.063234 -0.032304 +v -0.017329 0.061689 -0.029706 +v -0.019908 0.062346 -0.030811 +v -0.022159 0.059719 -0.032304 +v -0.020844 0.065204 -0.029706 +v -0.014155 -0.008410 -0.023436 +v -0.030644 -0.001686 -0.032304 +v -0.018644 0.010314 -0.032304 +v -0.020844 -0.003655 -0.029706 +v -0.019908 -0.000798 -0.030811 +v -0.022159 0.001829 -0.032304 +v -0.017329 -0.000141 -0.029706 +v -0.104507 -0.008410 -0.023436 +v -0.100018 0.010314 -0.032304 +v -0.088018 -0.001686 -0.032304 +v -0.101333 -0.000141 -0.029706 +v -0.098754 -0.000798 -0.030811 +v -0.096503 0.001829 -0.032304 +v -0.097818 -0.003655 -0.029706 +v -0.223492 0.087751 0.000030 +v -0.231003 0.081027 -0.008838 +v -0.235492 0.075751 0.000030 +v -0.230662 0.085782 -0.002568 +v -0.232716 0.084600 -0.001463 +v -0.234177 0.082267 -0.002568 +v -0.231977 0.084236 0.000030 +v -0.121384 0.075751 0.000030 +v -0.125873 0.081027 -0.008838 +v -0.133384 0.087751 0.000030 +v -0.122699 0.082267 -0.002568 +v -0.124160 0.084600 -0.001463 +v -0.126214 0.085782 -0.002568 +v -0.124899 0.084236 0.000030 +v -0.133384 -0.026203 0.000030 +v -0.125873 -0.019479 -0.008838 +v -0.121384 -0.014203 0.000030 +v -0.126214 -0.024234 -0.002568 +v -0.124160 -0.023052 -0.001463 +v -0.122699 -0.020719 -0.002568 +v -0.124899 -0.022688 0.000030 +v -0.235492 -0.014203 0.000030 +v -0.231003 -0.019479 -0.008838 +v -0.223492 -0.026203 0.000030 +v -0.234177 -0.020719 -0.002568 +v -0.232717 -0.023052 -0.001463 +v -0.230662 -0.024234 -0.002568 +v -0.231977 -0.022688 0.000030 +v -0.207125 0.063234 -0.032304 +v -0.219125 0.051234 -0.032304 +v -0.223614 0.069958 -0.023436 +v -0.215610 0.059719 -0.032304 +v -0.217861 0.062346 -0.030811 +v -0.220440 0.061689 -0.029706 +v -0.216925 0.065204 -0.029706 +v -0.133262 0.069958 -0.023436 +v -0.137751 0.051234 -0.032304 +v -0.149751 0.063234 -0.032304 +v -0.136436 0.061689 -0.029706 +v -0.139015 0.062346 -0.030811 +v -0.141266 0.059719 -0.032304 +v -0.139951 0.065204 -0.029706 +v -0.133262 -0.008410 -0.023436 +v -0.149751 -0.001686 -0.032304 +v -0.137751 0.010314 -0.032304 +v -0.139951 -0.003655 -0.029706 +v -0.139015 -0.000798 -0.030811 +v -0.141266 0.001829 -0.032304 +v -0.136436 -0.000141 -0.029706 +v -0.223614 -0.008410 -0.023436 +v -0.219125 0.010314 -0.032304 +v -0.207125 -0.001686 -0.032304 +v -0.220440 -0.000141 -0.029706 +v -0.217861 -0.000798 -0.030811 +v -0.215610 0.001829 -0.032304 +v -0.216925 -0.003655 -0.029706 +v 0.133830 -0.031203 0.000030 +v 0.126318 -0.037927 -0.008838 +v 0.121830 -0.043203 0.000030 +v 0.126659 -0.033172 -0.002568 +v 0.124605 -0.034354 -0.001463 +v 0.123144 -0.036687 -0.002568 +v 0.125344 -0.034718 0.000030 +v 0.235937 -0.043203 0.000030 +v 0.231448 -0.037927 -0.008838 +v 0.223937 -0.031203 0.000030 +v 0.234622 -0.036687 -0.002568 +v 0.233162 -0.034354 -0.001463 +v 0.231107 -0.033172 -0.002568 +v 0.232422 -0.034718 0.000030 +v 0.223937 -0.145157 0.000030 +v 0.231448 -0.138433 -0.008838 +v 0.235937 -0.133157 0.000030 +v 0.231107 -0.143188 -0.002568 +v 0.233162 -0.142006 -0.001463 +v 0.234622 -0.139673 -0.002568 +v 0.232422 -0.141642 0.000030 +v 0.121830 -0.133157 0.000030 +v 0.126318 -0.138433 -0.008838 +v 0.133830 -0.145157 0.000030 +v 0.123144 -0.139673 -0.002568 +v 0.124605 -0.142006 -0.001463 +v 0.126659 -0.143188 -0.002568 +v 0.125344 -0.141642 0.000030 +v 0.150196 -0.055720 -0.032304 +v 0.138196 -0.067720 -0.032304 +v 0.133707 -0.048996 -0.023436 +v 0.141711 -0.059235 -0.032304 +v 0.139460 -0.056608 -0.030811 +v 0.136881 -0.057265 -0.029706 +v 0.140396 -0.053751 -0.029706 +v 0.224059 -0.048996 -0.023436 +v 0.219570 -0.067720 -0.032304 +v 0.207570 -0.055720 -0.032304 +v 0.220885 -0.057265 -0.029706 +v 0.218306 -0.056608 -0.030811 +v 0.216055 -0.059235 -0.032304 +v 0.217370 -0.053751 -0.029706 +v 0.224059 -0.127364 -0.023436 +v 0.207570 -0.120640 -0.032304 +v 0.219570 -0.108640 -0.032304 +v 0.217370 -0.122610 -0.029706 +v 0.218306 -0.119752 -0.030811 +v 0.216055 -0.117125 -0.032304 +v 0.220885 -0.119095 -0.029706 +v 0.133707 -0.127364 -0.023436 +v 0.138196 -0.108640 -0.032304 +v 0.150196 -0.120640 -0.032304 +v 0.136881 -0.119095 -0.029706 +v 0.139460 -0.119752 -0.030811 +v 0.141711 -0.117125 -0.032304 +v 0.140396 -0.122610 -0.029706 +v 0.014723 -0.031203 0.000030 +v 0.007211 -0.037927 -0.008838 +v 0.002723 -0.043203 0.000030 +v 0.007552 -0.033172 -0.002568 +v 0.005498 -0.034354 -0.001463 +v 0.004037 -0.036687 -0.002568 +v 0.006237 -0.034718 0.000030 +v 0.116830 -0.043203 0.000030 +v 0.112341 -0.037927 -0.008838 +v 0.104830 -0.031203 0.000030 +v 0.115515 -0.036687 -0.002568 +v 0.114055 -0.034354 -0.001463 +v 0.112000 -0.033172 -0.002568 +v 0.113315 -0.034718 0.000030 +v 0.104830 -0.145157 0.000030 +v 0.112341 -0.138433 -0.008838 +v 0.116830 -0.133157 0.000030 +v 0.112000 -0.143188 -0.002568 +v 0.114055 -0.142006 -0.001463 +v 0.115515 -0.139673 -0.002568 +v 0.113315 -0.141642 0.000030 +v 0.002723 -0.133157 0.000030 +v 0.007211 -0.138433 -0.008838 +v 0.014723 -0.145157 0.000030 +v 0.004037 -0.139673 -0.002568 +v 0.005498 -0.142006 -0.001463 +v 0.007552 -0.143188 -0.002568 +v 0.006237 -0.141642 0.000030 +v 0.031089 -0.055720 -0.032304 +v 0.019089 -0.067720 -0.032304 +v 0.014600 -0.048996 -0.023436 +v 0.022604 -0.059235 -0.032304 +v 0.020353 -0.056608 -0.030811 +v 0.017774 -0.057265 -0.029706 +v 0.021289 -0.053751 -0.029706 +v 0.104952 -0.048996 -0.023436 +v 0.100463 -0.067720 -0.032304 +v 0.088463 -0.055720 -0.032304 +v 0.101778 -0.057265 -0.029706 +v 0.099199 -0.056608 -0.030811 +v 0.096948 -0.059235 -0.032304 +v 0.098263 -0.053751 -0.029706 +v 0.104952 -0.127364 -0.023436 +v 0.088463 -0.120640 -0.032304 +v 0.100463 -0.108640 -0.032304 +v 0.098263 -0.122610 -0.029706 +v 0.099199 -0.119752 -0.030811 +v 0.096948 -0.117125 -0.032304 +v 0.101778 -0.119095 -0.029706 +v 0.014600 -0.127364 -0.023436 +v 0.019089 -0.108640 -0.032304 +v 0.031089 -0.120640 -0.032304 +v 0.017774 -0.119095 -0.029706 +v 0.020353 -0.119752 -0.030811 +v 0.022604 -0.117125 -0.032304 +v 0.021289 -0.122610 -0.029706 +v -0.104385 -0.031203 0.000030 +v -0.111896 -0.037927 -0.008838 +v -0.116385 -0.043203 0.000030 +v -0.111555 -0.033172 -0.002568 +v -0.113609 -0.034354 -0.001463 +v -0.115070 -0.036687 -0.002568 +v -0.112870 -0.034718 0.000030 +v -0.002277 -0.043203 0.000030 +v -0.006766 -0.037927 -0.008838 +v -0.014277 -0.031203 0.000030 +v -0.003592 -0.036687 -0.002568 +v -0.005052 -0.034354 -0.001463 +v -0.007107 -0.033172 -0.002568 +v -0.005792 -0.034718 0.000030 +v -0.014277 -0.145157 0.000030 +v -0.006766 -0.138433 -0.008838 +v -0.002277 -0.133157 0.000030 +v -0.007107 -0.143188 -0.002568 +v -0.005052 -0.142006 -0.001463 +v -0.003592 -0.139673 -0.002568 +v -0.005792 -0.141642 0.000030 +v -0.116385 -0.133157 0.000030 +v -0.111896 -0.138433 -0.008838 +v -0.104385 -0.145157 0.000030 +v -0.115070 -0.139673 -0.002568 +v -0.113609 -0.142006 -0.001463 +v -0.111555 -0.143188 -0.002568 +v -0.112870 -0.141642 0.000030 +v -0.088018 -0.055720 -0.032304 +v -0.100018 -0.067720 -0.032304 +v -0.104507 -0.048996 -0.023436 +v -0.096503 -0.059235 -0.032304 +v -0.098754 -0.056608 -0.030811 +v -0.101333 -0.057265 -0.029706 +v -0.097818 -0.053751 -0.029706 +v -0.014155 -0.048996 -0.023436 +v -0.018644 -0.067720 -0.032304 +v -0.030644 -0.055720 -0.032304 +v -0.017329 -0.057265 -0.029706 +v -0.019908 -0.056608 -0.030811 +v -0.022159 -0.059235 -0.032304 +v -0.020844 -0.053751 -0.029706 +v -0.014155 -0.127364 -0.023436 +v -0.030644 -0.120640 -0.032304 +v -0.018644 -0.108640 -0.032304 +v -0.020844 -0.122610 -0.029706 +v -0.019908 -0.119752 -0.030811 +v -0.022159 -0.117125 -0.032304 +v -0.017329 -0.119095 -0.029706 +v -0.104507 -0.127364 -0.023436 +v -0.100018 -0.108640 -0.032304 +v -0.088018 -0.120640 -0.032304 +v -0.101333 -0.119095 -0.029706 +v -0.098754 -0.119752 -0.030811 +v -0.096503 -0.117125 -0.032304 +v -0.097818 -0.122610 -0.029706 +v -0.223492 -0.031203 0.000030 +v -0.231003 -0.037927 -0.008838 +v -0.235492 -0.043203 0.000030 +v -0.230662 -0.033172 -0.002568 +v -0.232716 -0.034354 -0.001463 +v -0.234177 -0.036687 -0.002568 +v -0.231977 -0.034718 0.000030 +v -0.121384 -0.043203 0.000030 +v -0.125873 -0.037927 -0.008838 +v -0.133384 -0.031203 0.000030 +v -0.122699 -0.036687 -0.002568 +v -0.124160 -0.034354 -0.001463 +v -0.126214 -0.033172 -0.002568 +v -0.124899 -0.034718 0.000030 +v -0.133384 -0.145157 0.000030 +v -0.125873 -0.138433 -0.008838 +v -0.121384 -0.133157 0.000030 +v -0.126214 -0.143188 -0.002568 +v -0.124160 -0.142006 -0.001463 +v -0.122699 -0.139673 -0.002568 +v -0.124899 -0.141642 0.000030 +v -0.235492 -0.133157 0.000030 +v -0.231003 -0.138433 -0.008838 +v -0.223492 -0.145157 0.000030 +v -0.234177 -0.139673 -0.002568 +v -0.232717 -0.142006 -0.001463 +v -0.230662 -0.143188 -0.002568 +v -0.231977 -0.141642 0.000030 +v -0.207125 -0.055720 -0.032304 +v -0.219125 -0.067720 -0.032304 +v -0.223614 -0.048996 -0.023436 +v -0.215610 -0.059235 -0.032304 +v -0.217861 -0.056608 -0.030811 +v -0.220440 -0.057265 -0.029706 +v -0.216925 -0.053751 -0.029706 +v -0.133262 -0.048996 -0.023436 +v -0.137751 -0.067720 -0.032304 +v -0.149751 -0.055720 -0.032304 +v -0.136436 -0.057265 -0.029706 +v -0.139015 -0.056608 -0.030811 +v -0.141266 -0.059235 -0.032304 +v -0.139951 -0.053751 -0.029706 +v -0.133262 -0.127364 -0.023436 +v -0.149751 -0.120640 -0.032304 +v -0.137751 -0.108640 -0.032304 +v -0.139951 -0.122610 -0.029706 +v -0.139015 -0.119752 -0.030811 +v -0.141266 -0.117125 -0.032304 +v -0.136436 -0.119095 -0.029706 +v -0.223614 -0.127364 -0.023436 +v -0.219125 -0.108640 -0.032304 +v -0.207125 -0.120640 -0.032304 +v -0.220440 -0.119095 -0.029706 +v -0.217861 -0.119752 -0.030811 +v -0.215610 -0.117125 -0.032304 +v -0.216925 -0.122610 -0.029706 +v 0.133830 -0.150157 0.000030 +v 0.126318 -0.156881 -0.008838 +v 0.121830 -0.162157 0.000030 +v 0.126659 -0.152127 -0.002568 +v 0.124605 -0.153308 -0.001463 +v 0.123144 -0.155641 -0.002568 +v 0.125344 -0.153672 0.000030 +v 0.235937 -0.162157 0.000030 +v 0.231448 -0.156881 -0.008838 +v 0.223937 -0.150157 0.000030 +v 0.234622 -0.155641 -0.002568 +v 0.233162 -0.153308 -0.001463 +v 0.231107 -0.152127 -0.002568 +v 0.232422 -0.153672 0.000030 +v 0.223937 -0.264111 0.000030 +v 0.231448 -0.257387 -0.008838 +v 0.235937 -0.252111 0.000030 +v 0.231107 -0.262142 -0.002568 +v 0.233162 -0.260960 -0.001463 +v 0.234622 -0.258627 -0.002568 +v 0.232422 -0.260597 0.000030 +v 0.121830 -0.252111 0.000030 +v 0.126318 -0.257387 -0.008838 +v 0.133830 -0.264111 0.000030 +v 0.123144 -0.258627 -0.002568 +v 0.124605 -0.260960 -0.001463 +v 0.126659 -0.262142 -0.002568 +v 0.125344 -0.260597 0.000030 +v 0.150196 -0.174674 -0.032304 +v 0.138196 -0.186674 -0.032304 +v 0.133707 -0.167950 -0.023436 +v 0.141711 -0.178189 -0.032304 +v 0.139460 -0.175562 -0.030811 +v 0.136881 -0.176219 -0.029706 +v 0.140396 -0.172705 -0.029706 +v 0.224059 -0.167950 -0.023436 +v 0.219570 -0.186674 -0.032304 +v 0.207570 -0.174674 -0.032304 +v 0.220885 -0.176219 -0.029706 +v 0.218306 -0.175562 -0.030811 +v 0.216055 -0.178189 -0.032304 +v 0.217370 -0.172705 -0.029706 +v 0.224059 -0.246318 -0.023436 +v 0.207570 -0.239594 -0.032304 +v 0.219570 -0.227594 -0.032304 +v 0.217370 -0.241564 -0.029706 +v 0.218306 -0.238706 -0.030811 +v 0.216055 -0.236080 -0.032304 +v 0.220885 -0.238049 -0.029706 +v 0.133707 -0.246318 -0.023436 +v 0.138196 -0.227594 -0.032304 +v 0.150196 -0.239594 -0.032304 +v 0.136881 -0.238049 -0.029706 +v 0.139460 -0.238706 -0.030811 +v 0.141711 -0.236080 -0.032304 +v 0.140396 -0.241564 -0.029706 +v 0.014723 -0.150157 0.000030 +v 0.007211 -0.156881 -0.008838 +v 0.002723 -0.162157 0.000030 +v 0.007552 -0.152127 -0.002568 +v 0.005498 -0.153308 -0.001463 +v 0.004037 -0.155641 -0.002568 +v 0.006237 -0.153672 0.000030 +v 0.116830 -0.162157 0.000030 +v 0.112341 -0.156881 -0.008838 +v 0.104830 -0.150157 0.000030 +v 0.115515 -0.155641 -0.002568 +v 0.114055 -0.153308 -0.001463 +v 0.112000 -0.152127 -0.002568 +v 0.113315 -0.153672 0.000030 +v 0.104830 -0.264111 0.000030 +v 0.112341 -0.257387 -0.008838 +v 0.116830 -0.252111 0.000030 +v 0.112000 -0.262142 -0.002568 +v 0.114055 -0.260960 -0.001463 +v 0.115515 -0.258627 -0.002568 +v 0.113315 -0.260597 0.000030 +v 0.002723 -0.252111 0.000030 +v 0.007211 -0.257387 -0.008838 +v 0.014723 -0.264111 0.000030 +v 0.004037 -0.258627 -0.002568 +v 0.005498 -0.260960 -0.001463 +v 0.007552 -0.262142 -0.002568 +v 0.006237 -0.260597 0.000030 +v 0.031089 -0.174674 -0.032304 +v 0.019089 -0.186674 -0.032304 +v 0.014600 -0.167950 -0.023436 +v 0.022604 -0.178189 -0.032304 +v 0.020353 -0.175562 -0.030811 +v 0.017774 -0.176219 -0.029706 +v 0.021289 -0.172705 -0.029706 +v 0.104952 -0.167950 -0.023436 +v 0.100463 -0.186674 -0.032304 +v 0.088463 -0.174674 -0.032304 +v 0.101778 -0.176219 -0.029706 +v 0.099199 -0.175562 -0.030811 +v 0.096948 -0.178189 -0.032304 +v 0.098263 -0.172705 -0.029706 +v 0.104952 -0.246318 -0.023436 +v 0.088463 -0.239594 -0.032304 +v 0.100463 -0.227594 -0.032304 +v 0.098263 -0.241564 -0.029706 +v 0.099199 -0.238706 -0.030811 +v 0.096948 -0.236080 -0.032304 +v 0.101778 -0.238049 -0.029706 +v 0.014600 -0.246318 -0.023436 +v 0.019089 -0.227594 -0.032304 +v 0.031089 -0.239594 -0.032304 +v 0.017774 -0.238049 -0.029706 +v 0.020353 -0.238706 -0.030811 +v 0.022604 -0.236080 -0.032304 +v 0.021289 -0.241564 -0.029706 +v -0.104385 -0.150157 0.000030 +v -0.111896 -0.156881 -0.008838 +v -0.116385 -0.162157 0.000030 +v -0.111555 -0.152127 -0.002568 +v -0.113609 -0.153308 -0.001463 +v -0.115070 -0.155641 -0.002568 +v -0.112870 -0.153672 0.000030 +v -0.002277 -0.162157 0.000030 +v -0.006766 -0.156881 -0.008838 +v -0.014277 -0.150157 0.000030 +v -0.003592 -0.155641 -0.002568 +v -0.005052 -0.153308 -0.001463 +v -0.007107 -0.152127 -0.002568 +v -0.005792 -0.153672 0.000030 +v -0.014277 -0.264111 0.000030 +v -0.006766 -0.257387 -0.008838 +v -0.002277 -0.252111 0.000030 +v -0.007107 -0.262142 -0.002568 +v -0.005052 -0.260960 -0.001463 +v -0.003592 -0.258627 -0.002568 +v -0.005792 -0.260597 0.000030 +v -0.116385 -0.252111 0.000030 +v -0.111896 -0.257387 -0.008838 +v -0.104385 -0.264111 0.000030 +v -0.115070 -0.258627 -0.002568 +v -0.113609 -0.260960 -0.001463 +v -0.111555 -0.262142 -0.002568 +v -0.112870 -0.260597 0.000030 +v -0.088018 -0.174674 -0.032304 +v -0.100018 -0.186674 -0.032304 +v -0.104507 -0.167950 -0.023436 +v -0.096503 -0.178189 -0.032304 +v -0.098754 -0.175562 -0.030811 +v -0.101333 -0.176219 -0.029706 +v -0.097818 -0.172705 -0.029706 +v -0.014155 -0.167950 -0.023436 +v -0.018644 -0.186674 -0.032304 +v -0.030644 -0.174674 -0.032304 +v -0.017329 -0.176219 -0.029706 +v -0.019908 -0.175562 -0.030811 +v -0.022159 -0.178189 -0.032304 +v -0.020844 -0.172705 -0.029706 +v -0.014155 -0.246318 -0.023436 +v -0.030644 -0.239594 -0.032304 +v -0.018644 -0.227594 -0.032304 +v -0.020844 -0.241564 -0.029706 +v -0.019908 -0.238706 -0.030811 +v -0.022159 -0.236080 -0.032304 +v -0.017329 -0.238049 -0.029706 +v -0.104507 -0.246318 -0.023436 +v -0.100018 -0.227594 -0.032304 +v -0.088018 -0.239594 -0.032304 +v -0.101333 -0.238049 -0.029706 +v -0.098754 -0.238706 -0.030811 +v -0.096503 -0.236080 -0.032304 +v -0.097818 -0.241564 -0.029706 +v -0.223492 -0.150157 0.000030 +v -0.231003 -0.156881 -0.008838 +v -0.235492 -0.162157 0.000030 +v -0.230662 -0.152127 -0.002568 +v -0.232716 -0.153308 -0.001463 +v -0.234177 -0.155641 -0.002568 +v -0.231977 -0.153672 0.000030 +v -0.121384 -0.162157 0.000030 +v -0.125873 -0.156881 -0.008838 +v -0.133384 -0.150157 0.000030 +v -0.122699 -0.155641 -0.002568 +v -0.124160 -0.153308 -0.001463 +v -0.126214 -0.152127 -0.002568 +v -0.124899 -0.153672 0.000030 +v -0.133384 -0.264111 0.000030 +v -0.125873 -0.257387 -0.008838 +v -0.121384 -0.252111 0.000030 +v -0.126214 -0.262142 -0.002568 +v -0.124160 -0.260960 -0.001463 +v -0.122699 -0.258627 -0.002568 +v -0.124899 -0.260597 0.000030 +v -0.235492 -0.252111 0.000030 +v -0.231003 -0.257387 -0.008838 +v -0.223492 -0.264111 0.000030 +v -0.234177 -0.258627 -0.002568 +v -0.232717 -0.260960 -0.001463 +v -0.230662 -0.262142 -0.002568 +v -0.231977 -0.260597 0.000030 +v -0.207125 -0.174674 -0.032304 +v -0.219125 -0.186674 -0.032304 +v -0.223614 -0.167950 -0.023436 +v -0.215610 -0.178189 -0.032304 +v -0.217861 -0.175562 -0.030811 +v -0.220440 -0.176219 -0.029706 +v -0.216925 -0.172705 -0.029706 +v -0.133262 -0.167950 -0.023436 +v -0.137751 -0.186674 -0.032304 +v -0.149751 -0.174674 -0.032304 +v -0.136436 -0.176219 -0.029706 +v -0.139015 -0.175562 -0.030811 +v -0.141266 -0.178189 -0.032304 +v -0.139951 -0.172705 -0.029706 +v -0.133262 -0.246318 -0.023436 +v -0.149751 -0.239594 -0.032304 +v -0.137751 -0.227594 -0.032304 +v -0.139951 -0.241564 -0.029706 +v -0.139015 -0.238706 -0.030811 +v -0.141266 -0.236080 -0.032304 +v -0.136436 -0.238049 -0.029706 +v -0.223614 -0.246318 -0.023436 +v -0.219125 -0.227594 -0.032304 +v -0.207125 -0.239594 -0.032304 +v -0.220440 -0.238049 -0.029706 +v -0.217861 -0.238706 -0.030811 +v -0.215610 -0.236080 -0.032304 +v -0.216925 -0.241564 -0.029706 +v 0.133830 -0.269111 0.000030 +v 0.126318 -0.275835 -0.008838 +v 0.121830 -0.281111 0.000030 +v 0.126659 -0.271081 -0.002568 +v 0.124605 -0.272263 -0.001463 +v 0.123144 -0.274596 -0.002568 +v 0.125344 -0.272626 0.000030 +v 0.235937 -0.281111 0.000030 +v 0.231448 -0.275835 -0.008838 +v 0.223937 -0.269111 0.000030 +v 0.234622 -0.274596 -0.002568 +v 0.233162 -0.272263 -0.001463 +v 0.231107 -0.271081 -0.002568 +v 0.232422 -0.272626 0.000030 +v 0.223937 -0.383066 0.000030 +v 0.231448 -0.376341 -0.008838 +v 0.235937 -0.371066 0.000030 +v 0.231107 -0.381096 -0.002568 +v 0.233162 -0.379914 -0.001463 +v 0.234622 -0.377581 -0.002568 +v 0.232422 -0.379551 0.000030 +v 0.121830 -0.371066 0.000030 +v 0.126318 -0.376341 -0.008838 +v 0.133830 -0.383066 0.000030 +v 0.123144 -0.377581 -0.002568 +v 0.124605 -0.379914 -0.001463 +v 0.126659 -0.381096 -0.002568 +v 0.125344 -0.379551 0.000030 +v 0.150196 -0.293628 -0.032304 +v 0.138196 -0.305628 -0.032304 +v 0.133707 -0.286904 -0.023436 +v 0.141711 -0.297143 -0.032304 +v 0.139460 -0.294516 -0.030811 +v 0.136881 -0.295174 -0.029706 +v 0.140396 -0.291659 -0.029706 +v 0.224059 -0.286904 -0.023436 +v 0.219570 -0.305628 -0.032304 +v 0.207570 -0.293628 -0.032304 +v 0.220885 -0.295174 -0.029706 +v 0.218306 -0.294516 -0.030811 +v 0.216055 -0.297143 -0.032304 +v 0.217370 -0.291659 -0.029706 +v 0.224059 -0.365273 -0.023436 +v 0.207570 -0.358549 -0.032304 +v 0.219570 -0.346549 -0.032304 +v 0.217370 -0.360518 -0.029706 +v 0.218306 -0.357661 -0.030811 +v 0.216055 -0.355034 -0.032304 +v 0.220885 -0.357003 -0.029706 +v 0.133707 -0.365273 -0.023436 +v 0.138196 -0.346549 -0.032304 +v 0.150196 -0.358549 -0.032304 +v 0.136881 -0.357003 -0.029706 +v 0.139460 -0.357661 -0.030811 +v 0.141711 -0.355034 -0.032304 +v 0.140396 -0.360518 -0.029706 +v 0.014723 -0.269111 0.000030 +v 0.007211 -0.275835 -0.008838 +v 0.002723 -0.281111 0.000030 +v 0.007552 -0.271081 -0.002568 +v 0.005498 -0.272263 -0.001463 +v 0.004037 -0.274596 -0.002568 +v 0.006237 -0.272626 0.000030 +v 0.116830 -0.281111 0.000030 +v 0.112341 -0.275835 -0.008838 +v 0.104830 -0.269111 0.000030 +v 0.115515 -0.274596 -0.002568 +v 0.114055 -0.272263 -0.001463 +v 0.112000 -0.271081 -0.002568 +v 0.113315 -0.272626 0.000030 +v 0.104830 -0.383066 0.000030 +v 0.112341 -0.376341 -0.008838 +v 0.116830 -0.371066 0.000030 +v 0.112000 -0.381096 -0.002568 +v 0.114055 -0.379914 -0.001463 +v 0.115515 -0.377581 -0.002568 +v 0.113315 -0.379551 0.000030 +v 0.002723 -0.371066 0.000030 +v 0.007211 -0.376341 -0.008838 +v 0.014723 -0.383066 0.000030 +v 0.004037 -0.377581 -0.002568 +v 0.005498 -0.379914 -0.001463 +v 0.007552 -0.381096 -0.002568 +v 0.006237 -0.379551 0.000030 +v 0.031089 -0.293628 -0.032304 +v 0.019089 -0.305628 -0.032304 +v 0.014600 -0.286904 -0.023436 +v 0.022604 -0.297143 -0.032304 +v 0.020353 -0.294516 -0.030811 +v 0.017774 -0.295174 -0.029706 +v 0.021289 -0.291659 -0.029706 +v 0.104952 -0.286904 -0.023436 +v 0.100463 -0.305628 -0.032304 +v 0.088463 -0.293628 -0.032304 +v 0.101778 -0.295174 -0.029706 +v 0.099199 -0.294516 -0.030811 +v 0.096948 -0.297143 -0.032304 +v 0.098263 -0.291659 -0.029706 +v 0.104952 -0.365273 -0.023436 +v 0.088463 -0.358549 -0.032304 +v 0.100463 -0.346549 -0.032304 +v 0.098263 -0.360518 -0.029706 +v 0.099199 -0.357661 -0.030811 +v 0.096948 -0.355034 -0.032304 +v 0.101778 -0.357003 -0.029706 +v 0.014600 -0.365273 -0.023436 +v 0.019089 -0.346549 -0.032304 +v 0.031089 -0.358549 -0.032304 +v 0.017774 -0.357003 -0.029706 +v 0.020353 -0.357661 -0.030811 +v 0.022604 -0.355034 -0.032304 +v 0.021289 -0.360518 -0.029706 +v -0.104385 -0.269111 0.000030 +v -0.111896 -0.275835 -0.008838 +v -0.116385 -0.281111 0.000030 +v -0.111555 -0.271081 -0.002568 +v -0.113609 -0.272263 -0.001463 +v -0.115070 -0.274596 -0.002568 +v -0.112870 -0.272626 0.000030 +v -0.002277 -0.281111 0.000030 +v -0.006766 -0.275835 -0.008838 +v -0.014277 -0.269111 0.000030 +v -0.003592 -0.274596 -0.002568 +v -0.005052 -0.272263 -0.001463 +v -0.007107 -0.271081 -0.002568 +v -0.005792 -0.272626 0.000030 +v -0.014277 -0.383066 0.000030 +v -0.006766 -0.376341 -0.008838 +v -0.002277 -0.371066 0.000030 +v -0.007107 -0.381096 -0.002568 +v -0.005052 -0.379914 -0.001463 +v -0.003592 -0.377581 -0.002568 +v -0.005792 -0.379551 0.000030 +v -0.116385 -0.371066 0.000030 +v -0.111896 -0.376341 -0.008838 +v -0.104385 -0.383066 0.000030 +v -0.115070 -0.377581 -0.002568 +v -0.113609 -0.379914 -0.001463 +v -0.111555 -0.381096 -0.002568 +v -0.112870 -0.379551 0.000030 +v -0.088018 -0.293628 -0.032304 +v -0.100018 -0.305628 -0.032304 +v -0.104507 -0.286904 -0.023436 +v -0.096503 -0.297143 -0.032304 +v -0.098754 -0.294516 -0.030811 +v -0.101333 -0.295174 -0.029706 +v -0.097818 -0.291659 -0.029706 +v -0.014155 -0.286904 -0.023436 +v -0.018644 -0.305628 -0.032304 +v -0.030644 -0.293628 -0.032304 +v -0.017329 -0.295174 -0.029706 +v -0.019908 -0.294516 -0.030811 +v -0.022159 -0.297143 -0.032304 +v -0.020844 -0.291659 -0.029706 +v -0.014155 -0.365273 -0.023436 +v -0.030644 -0.358549 -0.032304 +v -0.018644 -0.346549 -0.032304 +v -0.020844 -0.360518 -0.029706 +v -0.019908 -0.357661 -0.030811 +v -0.022159 -0.355034 -0.032304 +v -0.017329 -0.357003 -0.029706 +v -0.104507 -0.365273 -0.023436 +v -0.100018 -0.346549 -0.032304 +v -0.088018 -0.358549 -0.032304 +v -0.101333 -0.357003 -0.029706 +v -0.098754 -0.357661 -0.030811 +v -0.096503 -0.355034 -0.032304 +v -0.097818 -0.360518 -0.029706 +v -0.223492 -0.269111 0.000030 +v -0.231003 -0.275835 -0.008838 +v -0.235492 -0.281111 0.000030 +v -0.230662 -0.271081 -0.002568 +v -0.232716 -0.272263 -0.001463 +v -0.234177 -0.274596 -0.002568 +v -0.231977 -0.272626 0.000030 +v -0.121384 -0.281111 0.000030 +v -0.125873 -0.275835 -0.008838 +v -0.133384 -0.269111 0.000030 +v -0.122699 -0.274596 -0.002568 +v -0.124160 -0.272263 -0.001463 +v -0.126214 -0.271081 -0.002568 +v -0.124899 -0.272626 0.000030 +v -0.133384 -0.383066 0.000030 +v -0.125873 -0.376341 -0.008838 +v -0.121384 -0.371066 0.000030 +v -0.126214 -0.381096 -0.002568 +v -0.124160 -0.379914 -0.001463 +v -0.122699 -0.377581 -0.002568 +v -0.124899 -0.379551 0.000030 +v -0.235492 -0.371066 0.000030 +v -0.231003 -0.376341 -0.008838 +v -0.223492 -0.383066 0.000030 +v -0.234177 -0.377581 -0.002568 +v -0.232717 -0.379914 -0.001463 +v -0.230662 -0.381096 -0.002568 +v -0.231977 -0.379551 0.000030 +v -0.207125 -0.293628 -0.032304 +v -0.219125 -0.305628 -0.032304 +v -0.223614 -0.286904 -0.023436 +v -0.215610 -0.297143 -0.032304 +v -0.217861 -0.294516 -0.030811 +v -0.220440 -0.295174 -0.029706 +v -0.216925 -0.291659 -0.029706 +v -0.133262 -0.286904 -0.023436 +v -0.137751 -0.305628 -0.032304 +v -0.149751 -0.293628 -0.032304 +v -0.136436 -0.295174 -0.029706 +v -0.139015 -0.294516 -0.030811 +v -0.141266 -0.297143 -0.032304 +v -0.139951 -0.291659 -0.029706 +v -0.133262 -0.365273 -0.023436 +v -0.149751 -0.358549 -0.032304 +v -0.137751 -0.346549 -0.032304 +v -0.139951 -0.360518 -0.029706 +v -0.139015 -0.357661 -0.030811 +v -0.141266 -0.355034 -0.032304 +v -0.136436 -0.357003 -0.029706 +v -0.223614 -0.365273 -0.023436 +v -0.219125 -0.346549 -0.032304 +v -0.207125 -0.358549 -0.032304 +v -0.220440 -0.357003 -0.029706 +v -0.217861 -0.357661 -0.030811 +v -0.215610 -0.355034 -0.032304 +v -0.216925 -0.360518 -0.029706 +vn -0.0000 0.7968 -0.6042 +vn -0.8922 -0.0000 -0.4516 +vn -0.0000 -0.7968 -0.6042 +vn -0.0000 -0.0000 -1.0000 +vn 0.8922 -0.0000 -0.4516 +vn -0.3605 0.8704 0.3353 +vn -0.6330 0.6330 -0.4456 +vn -0.8289 0.3433 0.4417 +vn 0.8289 0.3433 0.4417 +vn 0.6330 0.6330 -0.4456 +vn 0.3605 0.8704 0.3353 +vn 0.3605 -0.8704 0.3353 +vn 0.6330 -0.6330 -0.4456 +vn 0.8289 -0.3433 0.4417 +vn -0.8289 -0.3433 0.4417 +vn -0.6330 -0.6330 -0.4456 +vn -0.3605 -0.8704 0.3353 +vn -0.1617 0.3905 -0.9063 +vn -0.4118 0.1706 -0.8951 +vn -0.4331 0.4331 -0.7904 +vn 0.4331 0.4331 -0.7904 +vn 0.4118 0.1706 -0.8951 +vn 0.1617 0.3905 -0.9063 +vn 0.4331 -0.4331 -0.7904 +vn 0.1617 -0.3905 -0.9063 +vn 0.4118 -0.1706 -0.8951 +vn -0.4331 -0.4331 -0.7904 +vn -0.4118 -0.1706 -0.8951 +vn -0.1617 -0.3905 -0.9063 +vn -0.4119 0.1706 -0.8951 +vn -0.4119 -0.1706 -0.8951 +vn 0.4119 0.1706 -0.8951 +vn 0.4119 -0.1706 -0.8951 +vn -0.3605 -0.8704 0.3354 +vn -0.3605 0.8704 0.3354 +vn 0.3605 0.8704 0.3354 +vn 0.3605 -0.8704 0.3354 +vn -0.8288 0.3433 0.4417 +vn -0.8288 -0.3433 0.4417 +vn -0.8922 -0.0000 -0.4517 +vn -0.3080 0.8780 0.3665 +vn -0.6174 0.6174 -0.4876 +vn -0.8274 0.2902 0.4808 +vn 0.8274 0.2902 0.4808 +vn 0.6174 0.6174 -0.4876 +vn 0.3080 0.8780 0.3665 +vn 0.3080 -0.8780 0.3665 +vn 0.6174 -0.6174 -0.4876 +vn 0.8274 -0.2902 0.4808 +vn -0.8274 -0.2902 0.4808 +vn -0.6174 -0.6174 -0.4876 +vn -0.3080 -0.8780 0.3665 +vn -0.1391 0.3964 -0.9075 +vn -0.4211 0.1477 -0.8949 +vn -0.4461 0.4461 -0.7759 +vn 0.4461 0.4461 -0.7759 +vn 0.4211 0.1477 -0.8949 +vn 0.1391 0.3964 -0.9075 +vn 0.4461 -0.4461 -0.7759 +vn 0.1391 -0.3964 -0.9075 +vn 0.4211 -0.1477 -0.8949 +vn -0.4461 -0.4461 -0.7759 +vn -0.4211 -0.1477 -0.8949 +vn -0.1391 -0.3964 -0.9075 +vn -0.4461 -0.4461 -0.7758 +vn -0.4461 0.4461 -0.7758 +vn -0.8274 0.2903 0.4808 +vn 0.4461 0.4461 -0.7758 +vn 0.4461 -0.4461 -0.7758 +vn 0.1391 -0.3965 -0.9075 +vn 0.3079 -0.8780 0.3665 +vn -0.6174 -0.6173 -0.4876 +vn -0.1391 -0.3965 -0.9075 +vn -0.3080 0.8780 0.3664 +vn 0.6174 -0.6173 -0.4876 +vn -0.3079 -0.8780 0.3665 +vn -0.1391 0.3965 -0.9075 +vn 0.3080 -0.8780 0.3664 +vn -0.1390 0.3964 -0.9075 +vn 0.1390 -0.3964 -0.9075 +vn -0.1390 -0.3964 -0.9075 +vn 0.1390 0.3964 -0.9075 +vn -0.3080 -0.8780 0.3664 +vn -0.1390 -0.3965 -0.9075 +vn 0.6174 0.6173 -0.4876 +vn 0.1390 -0.3965 -0.9075 +vn -0.4210 -0.1477 -0.8949 +vn 0.4210 -0.1477 -0.8949 +vn 0.6174 0.6174 -0.4875 +vt 0.237215 0.287029 +vt 0.218598 0.279501 +vt 0.225010 0.268559 +vt 0.213234 0.262818 +vt 0.231805 0.274565 +vt 0.234127 0.267191 +vt 0.224942 0.267786 +vt 0.228191 0.269475 +vt 0.233691 0.271293 +vt 0.213914 0.490611 +vt 0.220542 0.473593 +vt 0.234867 0.481364 +vt 0.237215 0.466805 +vt 0.225646 0.485709 +vt 0.233186 0.488150 +vt 0.231669 0.482979 +vt 0.232289 0.479053 +vt 0.229893 0.487995 +vt 0.015261 0.465383 +vt 0.033513 0.473990 +vt 0.027474 0.484761 +vt 0.039242 0.489593 +vt 0.020934 0.478147 +vt 0.018805 0.485513 +vt 0.027773 0.484940 +vt 0.024469 0.483570 +vt 0.019174 0.481356 +vt 0.033464 0.260802 +vt 0.029631 0.275508 +vt 0.013692 0.268536 +vt 0.010162 0.284608 +vt 0.022204 0.265028 +vt 0.014092 0.262799 +vt 0.015538 0.271699 +vt 0.016580 0.267268 +vt 0.017461 0.262996 +vt 0.170382 0.338459 +vt 0.153368 0.321493 +vt 0.187953 0.306521 +vt 0.164875 0.327174 +vt 0.169048 0.323384 +vt 0.168917 0.317880 +vt 0.174969 0.323694 +vt 0.193097 0.445356 +vt 0.158603 0.429100 +vt 0.175379 0.412679 +vt 0.175271 0.433335 +vt 0.176009 0.427743 +vt 0.170989 0.423804 +vt 0.181128 0.427660 +vt 0.062441 0.448528 +vt 0.080446 0.415670 +vt 0.097834 0.432162 +vt 0.074858 0.431687 +vt 0.080403 0.432484 +vt 0.085269 0.427819 +vt 0.080903 0.437482 +vt 0.062798 0.300159 +vt 0.098915 0.316576 +vt 0.082514 0.332524 +vt 0.082917 0.310996 +vt 0.083251 0.315725 +vt 0.087588 0.320535 +vt 0.077053 0.316652 +vt 0.976235 0.285188 +vt 0.959353 0.278055 +vt 0.965303 0.266965 +vt 0.952527 0.261148 +vt 0.971254 0.272826 +vt 0.973446 0.265396 +vt 0.964519 0.266096 +vt 0.968086 0.267811 +vt 0.972989 0.269510 +vt 0.952633 0.489099 +vt 0.957662 0.472242 +vt 0.972863 0.479864 +vt 0.976235 0.465156 +vt 0.964051 0.484194 +vt 0.971895 0.486575 +vt 0.970832 0.477504 +vt 0.969838 0.481471 +vt 0.968565 0.486435 +vt 0.751997 0.464878 +vt 0.769835 0.473368 +vt 0.763605 0.484142 +vt 0.775705 0.488918 +vt 0.757307 0.477586 +vt 0.755026 0.484943 +vt 0.764040 0.484331 +vt 0.760668 0.482973 +vt 0.755491 0.480795 +vt 0.774807 0.260606 +vt 0.770839 0.275481 +vt 0.755084 0.268570 +vt 0.751204 0.284549 +vt 0.763652 0.264966 +vt 0.755623 0.262781 +vt 0.756869 0.271672 +vt 0.758017 0.267271 +vt 0.758974 0.262954 +vt 0.913771 0.338081 +vt 0.897748 0.321202 +vt 0.931562 0.305767 +vt 0.909453 0.326837 +vt 0.914293 0.323048 +vt 0.913655 0.317459 +vt 0.919469 0.323233 +vt 0.927088 0.444455 +vt 0.891554 0.428445 +vt 0.909424 0.412094 +vt 0.907997 0.432640 +vt 0.908197 0.427114 +vt 0.903815 0.423184 +vt 0.914111 0.426956 +vt 0.799025 0.447811 +vt 0.817689 0.414995 +vt 0.833718 0.431415 +vt 0.811711 0.430954 +vt 0.817144 0.431715 +vt 0.821997 0.427078 +vt 0.817522 0.436712 +vt 0.803335 0.300086 +vt 0.840008 0.316432 +vt 0.822144 0.332325 +vt 0.823264 0.310867 +vt 0.823388 0.315620 +vt 0.827764 0.320396 +vt 0.817147 0.316535 +vt 0.263941 0.215946 +vt 0.281517 0.223197 +vt 0.275776 0.234489 +vt 0.288000 0.240354 +vt 0.269489 0.228429 +vt 0.267485 0.235995 +vt 0.276337 0.235301 +vt 0.272901 0.233572 +vt 0.267819 0.231796 +vt 0.280980 0.010140 +vt 0.276942 0.024710 +vt 0.261042 0.017507 +vt 0.257746 0.033747 +vt 0.269626 0.014164 +vt 0.261516 0.011811 +vt 0.262969 0.020742 +vt 0.263955 0.016298 +vt 0.264894 0.012065 +vt 0.485393 0.039478 +vt 0.466451 0.031890 +vt 0.472996 0.021007 +vt 0.461333 0.015070 +vt 0.479876 0.027118 +vt 0.482252 0.019773 +vt 0.473004 0.020241 +vt 0.476216 0.021988 +vt 0.481799 0.023871 +vt 0.462160 0.241425 +vt 0.467886 0.226223 +vt 0.482565 0.233329 +vt 0.485393 0.217817 +vt 0.473601 0.237000 +vt 0.481242 0.239255 +vt 0.480234 0.230417 +vt 0.479462 0.234655 +vt 0.477952 0.239070 +vt 0.326442 0.161487 +vt 0.343533 0.179552 +vt 0.309090 0.195190 +vt 0.331114 0.173712 +vt 0.326236 0.177687 +vt 0.326942 0.183379 +vt 0.320937 0.177354 +vt 0.309901 0.049776 +vt 0.345894 0.066788 +vt 0.329321 0.081693 +vt 0.329943 0.060898 +vt 0.330222 0.065577 +vt 0.334509 0.070394 +vt 0.324055 0.066349 +vt 0.435270 0.058495 +vt 0.417100 0.091021 +vt 0.400357 0.072873 +vt 0.422009 0.075612 +vt 0.416031 0.075129 +vt 0.411792 0.078948 +vt 0.415992 0.069569 +vt 0.439068 0.200964 +vt 0.403868 0.184243 +vt 0.420789 0.169256 +vt 0.420680 0.189894 +vt 0.421162 0.185067 +vt 0.416237 0.180403 +vt 0.426556 0.184426 +vt 0.972234 0.533485 +vt 0.955352 0.526352 +vt 0.961301 0.515262 +vt 0.948526 0.509445 +vt 0.967252 0.521123 +vt 0.969445 0.513693 +vt 0.960517 0.514393 +vt 0.964085 0.516107 +vt 0.968988 0.517807 +vt 0.948632 0.737395 +vt 0.953661 0.720539 +vt 0.968862 0.728161 +vt 0.972234 0.713452 +vt 0.960050 0.732491 +vt 0.967893 0.734872 +vt 0.966831 0.725800 +vt 0.965837 0.729768 +vt 0.964564 0.734732 +vt 0.747995 0.713175 +vt 0.765833 0.721665 +vt 0.759604 0.732439 +vt 0.771703 0.737215 +vt 0.753306 0.725882 +vt 0.751024 0.733240 +vt 0.760039 0.732627 +vt 0.756667 0.731270 +vt 0.751489 0.729092 +vt 0.770805 0.508902 +vt 0.766838 0.523777 +vt 0.751082 0.516867 +vt 0.747203 0.532845 +vt 0.759651 0.513263 +vt 0.751621 0.511078 +vt 0.752868 0.519969 +vt 0.754015 0.515568 +vt 0.754973 0.511251 +vt 0.909770 0.586378 +vt 0.893746 0.569499 +vt 0.927561 0.554064 +vt 0.905452 0.575134 +vt 0.910291 0.571345 +vt 0.909654 0.565755 +vt 0.915467 0.571530 +vt 0.923087 0.692751 +vt 0.887553 0.676742 +vt 0.905423 0.660391 +vt 0.903995 0.680937 +vt 0.904196 0.675411 +vt 0.899814 0.671481 +vt 0.910110 0.675253 +vt 0.795024 0.696108 +vt 0.813688 0.663292 +vt 0.829717 0.679712 +vt 0.807710 0.679251 +vt 0.813142 0.680011 +vt 0.817995 0.675375 +vt 0.813521 0.685009 +vt 0.799334 0.548383 +vt 0.836007 0.564729 +vt 0.818143 0.580621 +vt 0.819262 0.559164 +vt 0.819387 0.563917 +vt 0.823762 0.568693 +vt 0.813145 0.564831 +vt 0.484653 0.287029 +vt 0.466036 0.279501 +vt 0.472448 0.268559 +vt 0.460671 0.262818 +vt 0.479243 0.274565 +vt 0.481564 0.267191 +vt 0.472380 0.267786 +vt 0.475628 0.269475 +vt 0.481129 0.271293 +vt 0.461351 0.490611 +vt 0.467980 0.473593 +vt 0.482305 0.481364 +vt 0.484653 0.466805 +vt 0.473084 0.485709 +vt 0.480623 0.488150 +vt 0.479727 0.479052 +vt 0.479107 0.482979 +vt 0.477331 0.487995 +vt 0.262699 0.465383 +vt 0.280951 0.473990 +vt 0.274912 0.484761 +vt 0.286680 0.489593 +vt 0.268372 0.478147 +vt 0.266243 0.485514 +vt 0.275211 0.484941 +vt 0.271906 0.483570 +vt 0.266612 0.481356 +vt 0.280902 0.260802 +vt 0.277069 0.275508 +vt 0.261130 0.268536 +vt 0.257600 0.284608 +vt 0.269642 0.265028 +vt 0.261530 0.262799 +vt 0.262976 0.271699 +vt 0.264018 0.267268 +vt 0.264899 0.262996 +vt 0.417820 0.338459 +vt 0.400806 0.321493 +vt 0.435391 0.306521 +vt 0.412313 0.327174 +vt 0.416486 0.323384 +vt 0.416355 0.317880 +vt 0.422406 0.323694 +vt 0.440535 0.445356 +vt 0.406041 0.429100 +vt 0.422817 0.412679 +vt 0.422708 0.433335 +vt 0.423447 0.427743 +vt 0.418427 0.423804 +vt 0.428566 0.427660 +vt 0.309878 0.448528 +vt 0.327884 0.415670 +vt 0.345272 0.432162 +vt 0.322296 0.431687 +vt 0.327841 0.432484 +vt 0.332707 0.427819 +vt 0.328341 0.437482 +vt 0.310236 0.300159 +vt 0.346353 0.316576 +vt 0.329952 0.332524 +vt 0.330355 0.310996 +vt 0.330689 0.315725 +vt 0.335026 0.320535 +vt 0.324491 0.316652 +vt 0.482058 0.786582 +vt 0.465175 0.779449 +vt 0.471125 0.768359 +vt 0.458350 0.762543 +vt 0.477076 0.774221 +vt 0.479268 0.766790 +vt 0.470341 0.767491 +vt 0.473908 0.769205 +vt 0.478811 0.770905 +vt 0.458455 0.990493 +vt 0.463485 0.973637 +vt 0.478686 0.981259 +vt 0.482058 0.966550 +vt 0.469873 0.985589 +vt 0.477717 0.987970 +vt 0.476655 0.978898 +vt 0.475660 0.982865 +vt 0.474388 0.987830 +vt 0.257819 0.966273 +vt 0.275657 0.974763 +vt 0.269428 0.985537 +vt 0.281527 0.990312 +vt 0.263130 0.978980 +vt 0.260848 0.986338 +vt 0.269863 0.985725 +vt 0.266490 0.984368 +vt 0.261313 0.982190 +vt 0.280629 0.762000 +vt 0.276661 0.776875 +vt 0.260906 0.769965 +vt 0.257026 0.785943 +vt 0.269474 0.766361 +vt 0.261445 0.764176 +vt 0.262691 0.773066 +vt 0.263839 0.768666 +vt 0.264797 0.764349 +vt 0.419593 0.839476 +vt 0.403570 0.822597 +vt 0.437385 0.807161 +vt 0.415275 0.828231 +vt 0.420115 0.824443 +vt 0.419477 0.818853 +vt 0.425291 0.824627 +vt 0.432910 0.945849 +vt 0.397377 0.929840 +vt 0.415246 0.913489 +vt 0.413819 0.934035 +vt 0.414019 0.928509 +vt 0.409637 0.924578 +vt 0.419933 0.928351 +vt 0.304847 0.949206 +vt 0.323512 0.916390 +vt 0.339541 0.932810 +vt 0.317533 0.932349 +vt 0.322966 0.933109 +vt 0.327819 0.928473 +vt 0.323344 0.938106 +vt 0.309157 0.801481 +vt 0.345830 0.817827 +vt 0.327966 0.833719 +vt 0.329086 0.812262 +vt 0.329210 0.817015 +vt 0.333586 0.821791 +vt 0.322969 0.817929 +vt 0.527650 0.266963 +vt 0.520705 0.284240 +vt 0.509511 0.278587 +vt 0.503694 0.290873 +vt 0.515316 0.272381 +vt 0.507839 0.270405 +vt 0.508615 0.279199 +vt 0.510325 0.275744 +vt 0.511970 0.270734 +vt 0.732133 0.284683 +vt 0.715446 0.279659 +vt 0.722961 0.264135 +vt 0.708101 0.261289 +vt 0.727273 0.273004 +vt 0.729615 0.264999 +vt 0.720552 0.266312 +vt 0.724564 0.267153 +vt 0.729484 0.268382 +vt 0.708177 0.489626 +vt 0.717031 0.469999 +vt 0.727645 0.476899 +vt 0.732133 0.465715 +vt 0.720965 0.484022 +vt 0.728256 0.486556 +vt 0.727683 0.477177 +vt 0.726414 0.480251 +vt 0.724127 0.486051 +vt 0.504258 0.464443 +vt 0.519613 0.469993 +vt 0.512608 0.484694 +vt 0.528290 0.487836 +vt 0.508816 0.475799 +vt 0.506623 0.483437 +vt 0.515553 0.482466 +vt 0.511238 0.481616 +vt 0.506775 0.480157 +vt 0.581456 0.328297 +vt 0.564832 0.345600 +vt 0.548831 0.311435 +vt 0.570256 0.333149 +vt 0.566373 0.328343 +vt 0.560768 0.329107 +vt 0.566493 0.323084 +vt 0.687977 0.311142 +vt 0.672359 0.346379 +vt 0.655751 0.329927 +vt 0.676332 0.330584 +vt 0.670833 0.330583 +vt 0.666947 0.334962 +vt 0.670598 0.324699 +vt 0.692172 0.437298 +vt 0.659812 0.418314 +vt 0.676002 0.401321 +vt 0.675627 0.423373 +vt 0.676493 0.417139 +vt 0.671808 0.412896 +vt 0.681339 0.417333 +vt 0.544765 0.441013 +vt 0.561130 0.405765 +vt 0.577302 0.422528 +vt 0.555714 0.422576 +vt 0.560621 0.423008 +vt 0.565311 0.418058 +vt 0.561436 0.428443 +vt 0.976975 0.034137 +vt 0.960093 0.027005 +vt 0.966043 0.015914 +vt 0.953267 0.010098 +vt 0.971994 0.021776 +vt 0.974186 0.014345 +vt 0.965259 0.015046 +vt 0.968826 0.016760 +vt 0.973729 0.018460 +vt 0.953373 0.238048 +vt 0.958402 0.221192 +vt 0.973603 0.228814 +vt 0.976975 0.214105 +vt 0.964791 0.233144 +vt 0.972634 0.235525 +vt 0.971572 0.226453 +vt 0.970578 0.230421 +vt 0.969305 0.235385 +vt 0.752737 0.213828 +vt 0.770575 0.222318 +vt 0.764345 0.233092 +vt 0.776445 0.237867 +vt 0.758047 0.226535 +vt 0.755765 0.233893 +vt 0.764780 0.233280 +vt 0.761408 0.231923 +vt 0.756231 0.229745 +vt 0.775546 0.009555 +vt 0.771579 0.024430 +vt 0.755824 0.017520 +vt 0.751944 0.033498 +vt 0.764392 0.013916 +vt 0.756362 0.011731 +vt 0.757609 0.020621 +vt 0.758757 0.016221 +vt 0.759714 0.011904 +vt 0.914511 0.087031 +vt 0.898488 0.070152 +vt 0.932302 0.054716 +vt 0.910193 0.075786 +vt 0.915033 0.071998 +vt 0.914395 0.066408 +vt 0.920209 0.072182 +vt 0.927828 0.193404 +vt 0.892294 0.177395 +vt 0.910164 0.161044 +vt 0.908737 0.181590 +vt 0.908937 0.176064 +vt 0.904555 0.172134 +vt 0.914851 0.175906 +vt 0.799765 0.196761 +vt 0.818429 0.163945 +vt 0.834458 0.180365 +vt 0.812451 0.179904 +vt 0.817883 0.180664 +vt 0.822737 0.176028 +vt 0.818262 0.185661 +vt 0.804075 0.049036 +vt 0.840748 0.065382 +vt 0.822884 0.081274 +vt 0.824004 0.059817 +vt 0.824128 0.064570 +vt 0.828503 0.069346 +vt 0.817887 0.065484 +vt 0.481434 0.538712 +vt 0.464343 0.531234 +vt 0.470388 0.520164 +vt 0.457791 0.514182 +vt 0.476379 0.526278 +vt 0.478612 0.518828 +vt 0.469674 0.519362 +vt 0.473190 0.521126 +vt 0.478139 0.522977 +vt 0.457791 0.742436 +vt 0.462075 0.727756 +vt 0.477641 0.734920 +vt 0.481434 0.718958 +vt 0.469009 0.738322 +vt 0.476972 0.740646 +vt 0.475813 0.731779 +vt 0.474683 0.736147 +vt 0.473631 0.740408 +vt 0.256921 0.713962 +vt 0.274011 0.721440 +vt 0.267967 0.732510 +vt 0.280563 0.738492 +vt 0.261976 0.726396 +vt 0.259743 0.733847 +vt 0.268681 0.733313 +vt 0.265165 0.731548 +vt 0.260215 0.729698 +vt 0.280563 0.510238 +vt 0.276280 0.524918 +vt 0.260714 0.517754 +vt 0.256921 0.533716 +vt 0.269345 0.514353 +vt 0.261383 0.512029 +vt 0.262541 0.520896 +vt 0.263671 0.516527 +vt 0.264723 0.512267 +vt 0.417899 0.591563 +vt 0.402185 0.573152 +vt 0.436209 0.558439 +vt 0.413802 0.579296 +vt 0.418721 0.575443 +vt 0.418164 0.569786 +vt 0.423915 0.575884 +vt 0.430206 0.702725 +vt 0.393914 0.685706 +vt 0.412067 0.670921 +vt 0.410557 0.691634 +vt 0.410544 0.686947 +vt 0.406245 0.682126 +vt 0.416727 0.686214 +vt 0.302145 0.694236 +vt 0.320456 0.661111 +vt 0.336170 0.679523 +vt 0.314440 0.676791 +vt 0.319634 0.677232 +vt 0.324553 0.673379 +vt 0.320191 0.682889 +vt 0.308148 0.549950 +vt 0.344441 0.566969 +vt 0.326288 0.581754 +vt 0.327798 0.561041 +vt 0.327811 0.565727 +vt 0.332110 0.570548 +vt 0.321628 0.566461 +vt 0.728132 0.537830 +vt 0.711041 0.530352 +vt 0.717086 0.519282 +vt 0.704489 0.513300 +vt 0.723076 0.525396 +vt 0.725310 0.517945 +vt 0.716371 0.518479 +vt 0.719887 0.520244 +vt 0.724837 0.522094 +vt 0.704489 0.741554 +vt 0.708772 0.726874 +vt 0.724339 0.734038 +vt 0.728132 0.718076 +vt 0.715707 0.737439 +vt 0.723669 0.739764 +vt 0.722511 0.730896 +vt 0.721381 0.735265 +vt 0.720329 0.739526 +vt 0.503618 0.713080 +vt 0.520709 0.720558 +vt 0.514664 0.731628 +vt 0.527261 0.737610 +vt 0.508674 0.725514 +vt 0.506440 0.732964 +vt 0.515378 0.732430 +vt 0.511863 0.730666 +vt 0.506913 0.728815 +vt 0.527261 0.509356 +vt 0.522978 0.524036 +vt 0.507411 0.516872 +vt 0.503618 0.532834 +vt 0.516043 0.513470 +vt 0.508080 0.511146 +vt 0.509239 0.520013 +vt 0.510369 0.515645 +vt 0.511421 0.511384 +vt 0.664596 0.590681 +vt 0.648883 0.572270 +vt 0.682907 0.557557 +vt 0.660499 0.578413 +vt 0.665419 0.574560 +vt 0.664862 0.568903 +vt 0.670612 0.575001 +vt 0.676904 0.701843 +vt 0.640611 0.684823 +vt 0.658764 0.670039 +vt 0.657255 0.690751 +vt 0.657241 0.686065 +vt 0.652942 0.681244 +vt 0.663424 0.685332 +vt 0.548843 0.693353 +vt 0.567153 0.660229 +vt 0.582867 0.678640 +vt 0.561137 0.675909 +vt 0.566331 0.676350 +vt 0.571251 0.672496 +vt 0.566888 0.682006 +vt 0.554846 0.549067 +vt 0.591139 0.566087 +vt 0.572985 0.580871 +vt 0.574495 0.560159 +vt 0.574509 0.564845 +vt 0.578808 0.569666 +vt 0.568325 0.565578 +vt 0.016504 0.215946 +vt 0.034079 0.223197 +vt 0.028339 0.234489 +vt 0.040562 0.240354 +vt 0.022051 0.228429 +vt 0.020047 0.235995 +vt 0.028899 0.235301 +vt 0.025463 0.233572 +vt 0.020381 0.231796 +vt 0.033542 0.010140 +vt 0.029505 0.024710 +vt 0.013604 0.017507 +vt 0.010308 0.033747 +vt 0.022188 0.014164 +vt 0.014078 0.011811 +vt 0.015531 0.020742 +vt 0.016517 0.016298 +vt 0.017456 0.012065 +vt 0.237955 0.039478 +vt 0.219013 0.031890 +vt 0.225558 0.021007 +vt 0.213896 0.015070 +vt 0.232439 0.027118 +vt 0.234815 0.019773 +vt 0.225566 0.020241 +vt 0.228778 0.021988 +vt 0.234362 0.023871 +vt 0.214722 0.241425 +vt 0.220448 0.226223 +vt 0.235127 0.233329 +vt 0.237955 0.217817 +vt 0.226163 0.237000 +vt 0.233804 0.239255 +vt 0.232796 0.230417 +vt 0.232025 0.234655 +vt 0.230515 0.239070 +vt 0.079004 0.161487 +vt 0.096095 0.179552 +vt 0.061652 0.195190 +vt 0.083676 0.173712 +vt 0.078798 0.177687 +vt 0.079505 0.183379 +vt 0.073499 0.177354 +vt 0.062463 0.049776 +vt 0.098457 0.066788 +vt 0.081883 0.081693 +vt 0.082505 0.060898 +vt 0.082784 0.065577 +vt 0.087071 0.070394 +vt 0.076618 0.066349 +vt 0.187833 0.058495 +vt 0.169662 0.091021 +vt 0.152919 0.072873 +vt 0.174571 0.075612 +vt 0.168594 0.075129 +vt 0.164354 0.078948 +vt 0.168554 0.069569 +vt 0.191630 0.200964 +vt 0.156430 0.184243 +vt 0.173352 0.169256 +vt 0.173242 0.189894 +vt 0.173724 0.185067 +vt 0.168799 0.180403 +vt 0.179118 0.184425 +vt 0.013442 0.713962 +vt 0.030533 0.721440 +vt 0.024488 0.732511 +vt 0.037084 0.738492 +vt 0.018497 0.726396 +vt 0.016264 0.733847 +vt 0.025202 0.733313 +vt 0.021686 0.731548 +vt 0.016736 0.729698 +vt 0.037084 0.510238 +vt 0.032801 0.524918 +vt 0.017235 0.517754 +vt 0.013442 0.533716 +vt 0.025866 0.514353 +vt 0.017904 0.512029 +vt 0.019062 0.520896 +vt 0.020192 0.516527 +vt 0.021245 0.512267 +vt 0.237955 0.538712 +vt 0.220864 0.531235 +vt 0.226909 0.520164 +vt 0.214313 0.514182 +vt 0.232900 0.526278 +vt 0.235133 0.518828 +vt 0.226195 0.519362 +vt 0.229711 0.521126 +vt 0.234661 0.522977 +vt 0.214313 0.742436 +vt 0.218596 0.727756 +vt 0.234162 0.734920 +vt 0.237955 0.718958 +vt 0.225531 0.738322 +vt 0.233493 0.740646 +vt 0.232334 0.731779 +vt 0.231205 0.736147 +vt 0.230153 0.740408 +vt 0.076977 0.661111 +vt 0.092691 0.679523 +vt 0.058667 0.694236 +vt 0.081074 0.673379 +vt 0.076155 0.677232 +vt 0.076712 0.682889 +vt 0.070961 0.676791 +vt 0.064669 0.549950 +vt 0.100962 0.566969 +vt 0.082809 0.581754 +vt 0.084319 0.561041 +vt 0.084332 0.565727 +vt 0.088631 0.570548 +vt 0.078149 0.566461 +vt 0.192731 0.558439 +vt 0.174420 0.591563 +vt 0.158706 0.573152 +vt 0.180436 0.575884 +vt 0.175242 0.575443 +vt 0.170323 0.579296 +vt 0.174685 0.569786 +vt 0.186728 0.702725 +vt 0.150435 0.685706 +vt 0.168588 0.670921 +vt 0.167078 0.691634 +vt 0.167065 0.686947 +vt 0.162766 0.682126 +vt 0.173248 0.686214 +vt 0.972234 0.781040 +vt 0.955352 0.773907 +vt 0.961301 0.762817 +vt 0.948526 0.757000 +vt 0.967252 0.768678 +vt 0.969445 0.761248 +vt 0.960517 0.761948 +vt 0.964085 0.763663 +vt 0.968988 0.765362 +vt 0.948632 0.984951 +vt 0.953661 0.968094 +vt 0.968862 0.975716 +vt 0.972234 0.961007 +vt 0.960050 0.980046 +vt 0.967893 0.982427 +vt 0.966831 0.973356 +vt 0.965837 0.977323 +vt 0.964564 0.982287 +vt 0.747995 0.960730 +vt 0.765833 0.969220 +vt 0.759604 0.979994 +vt 0.771703 0.984770 +vt 0.753306 0.973438 +vt 0.751024 0.980795 +vt 0.760039 0.980183 +vt 0.756667 0.978825 +vt 0.751490 0.976647 +vt 0.770805 0.756457 +vt 0.766838 0.771333 +vt 0.751082 0.764422 +vt 0.747203 0.780401 +vt 0.759651 0.760818 +vt 0.751621 0.758633 +vt 0.752868 0.767524 +vt 0.754015 0.763123 +vt 0.754973 0.758806 +vt 0.909770 0.833933 +vt 0.893746 0.817054 +vt 0.927561 0.801619 +vt 0.905452 0.822689 +vt 0.910291 0.818900 +vt 0.909653 0.813311 +vt 0.915467 0.819085 +vt 0.923087 0.940307 +vt 0.887553 0.924297 +vt 0.905423 0.907946 +vt 0.903995 0.928492 +vt 0.904196 0.922966 +vt 0.899814 0.919036 +vt 0.910110 0.922808 +vt 0.795024 0.943663 +vt 0.813688 0.910847 +vt 0.829717 0.927267 +vt 0.807710 0.926806 +vt 0.813142 0.927567 +vt 0.817996 0.922930 +vt 0.813521 0.932564 +vt 0.799334 0.795938 +vt 0.836007 0.812284 +vt 0.818143 0.828176 +vt 0.819262 0.806719 +vt 0.819387 0.811472 +vt 0.823762 0.816248 +vt 0.813145 0.812387 +vt 0.728132 0.785700 +vt 0.711249 0.778567 +vt 0.717199 0.767477 +vt 0.704423 0.761660 +vt 0.723150 0.773338 +vt 0.725342 0.765908 +vt 0.716415 0.766608 +vt 0.719982 0.768323 +vt 0.724885 0.770022 +vt 0.704529 0.989611 +vt 0.709558 0.972754 +vt 0.724760 0.980377 +vt 0.728132 0.965668 +vt 0.715947 0.984706 +vt 0.723791 0.987087 +vt 0.722729 0.978016 +vt 0.721734 0.981983 +vt 0.720462 0.986947 +vt 0.503893 0.965391 +vt 0.521731 0.973881 +vt 0.515501 0.984655 +vt 0.527601 0.989430 +vt 0.509203 0.978098 +vt 0.506922 0.985456 +vt 0.515936 0.984843 +vt 0.512564 0.983486 +vt 0.507387 0.981307 +vt 0.526703 0.761118 +vt 0.522735 0.775993 +vt 0.506980 0.769082 +vt 0.503100 0.785061 +vt 0.515548 0.765478 +vt 0.507519 0.763293 +vt 0.508765 0.772184 +vt 0.509913 0.767783 +vt 0.510871 0.763467 +vt 0.665667 0.838593 +vt 0.649644 0.821714 +vt 0.683459 0.806279 +vt 0.661349 0.827349 +vt 0.666189 0.823560 +vt 0.665551 0.817971 +vt 0.671365 0.823745 +vt 0.678984 0.944967 +vt 0.643451 0.928957 +vt 0.661320 0.912606 +vt 0.659893 0.933152 +vt 0.660093 0.927626 +vt 0.655711 0.923696 +vt 0.666007 0.927468 +vt 0.550921 0.948324 +vt 0.569586 0.915507 +vt 0.585615 0.931927 +vt 0.563607 0.931466 +vt 0.569040 0.932227 +vt 0.573893 0.927590 +vt 0.569418 0.937224 +vt 0.555231 0.800598 +vt 0.591904 0.816945 +vt 0.574040 0.832837 +vt 0.575160 0.811380 +vt 0.575284 0.816132 +vt 0.579660 0.820909 +vt 0.569043 0.817047 +vt 0.528390 0.015913 +vt 0.521444 0.033189 +vt 0.510251 0.027536 +vt 0.504434 0.039823 +vt 0.516056 0.021330 +vt 0.508579 0.019354 +vt 0.509355 0.028149 +vt 0.511065 0.024693 +vt 0.512710 0.019683 +vt 0.732873 0.033633 +vt 0.716186 0.028608 +vt 0.723701 0.013084 +vt 0.708841 0.010238 +vt 0.728013 0.021954 +vt 0.730355 0.013949 +vt 0.721292 0.015261 +vt 0.725304 0.016103 +vt 0.730224 0.017332 +vt 0.708917 0.238576 +vt 0.717771 0.218949 +vt 0.728385 0.225848 +vt 0.732873 0.214664 +vt 0.721705 0.232971 +vt 0.728996 0.235505 +vt 0.728423 0.226126 +vt 0.727154 0.229201 +vt 0.724867 0.235001 +vt 0.504998 0.213393 +vt 0.520353 0.218943 +vt 0.513348 0.233644 +vt 0.529030 0.236785 +vt 0.509556 0.224749 +vt 0.507363 0.232387 +vt 0.516293 0.231415 +vt 0.511978 0.230566 +vt 0.507515 0.229106 +vt 0.582196 0.077247 +vt 0.565571 0.094549 +vt 0.549571 0.060385 +vt 0.570996 0.082098 +vt 0.567113 0.077292 +vt 0.561508 0.078057 +vt 0.567233 0.072034 +vt 0.688717 0.060091 +vt 0.673099 0.095329 +vt 0.656491 0.078876 +vt 0.677072 0.079533 +vt 0.671573 0.079532 +vt 0.667686 0.083911 +vt 0.671338 0.073648 +vt 0.692911 0.186247 +vt 0.660552 0.167263 +vt 0.676741 0.150270 +vt 0.676367 0.172323 +vt 0.677233 0.166089 +vt 0.672548 0.161846 +vt 0.682079 0.166282 +vt 0.545505 0.189963 +vt 0.561870 0.154715 +vt 0.578042 0.171477 +vt 0.556454 0.171525 +vt 0.561361 0.171957 +vt 0.566051 0.167008 +vt 0.562176 0.177392 +vt 0.237955 0.786582 +vt 0.221073 0.779450 +vt 0.227022 0.768359 +vt 0.214247 0.762543 +vt 0.232974 0.774221 +vt 0.235166 0.766791 +vt 0.226239 0.767491 +vt 0.229806 0.769205 +vt 0.234709 0.770905 +vt 0.214353 0.990493 +vt 0.219382 0.973637 +vt 0.234583 0.981259 +vt 0.237955 0.966550 +vt 0.225771 0.985589 +vt 0.233614 0.987970 +vt 0.232552 0.978898 +vt 0.231558 0.982866 +vt 0.230285 0.987830 +vt 0.013716 0.966273 +vt 0.031554 0.974763 +vt 0.025325 0.985537 +vt 0.037424 0.990312 +vt 0.019027 0.978980 +vt 0.016745 0.986338 +vt 0.025760 0.985725 +vt 0.022388 0.984368 +vt 0.017211 0.982190 +vt 0.036526 0.762000 +vt 0.032559 0.776875 +vt 0.016804 0.769965 +vt 0.012924 0.785943 +vt 0.025372 0.766361 +vt 0.017342 0.764176 +vt 0.018589 0.773067 +vt 0.019736 0.768666 +vt 0.020694 0.764349 +vt 0.175491 0.839476 +vt 0.159467 0.822597 +vt 0.193282 0.807161 +vt 0.171173 0.828231 +vt 0.176012 0.824443 +vt 0.175374 0.818853 +vt 0.181188 0.824627 +vt 0.188808 0.945849 +vt 0.153274 0.929840 +vt 0.171144 0.913489 +vt 0.169716 0.934035 +vt 0.169917 0.928509 +vt 0.165535 0.924579 +vt 0.175831 0.928351 +vt 0.060745 0.949206 +vt 0.079409 0.916390 +vt 0.095438 0.932810 +vt 0.073431 0.932349 +vt 0.078863 0.933109 +vt 0.083717 0.928473 +vt 0.079242 0.938106 +vt 0.065055 0.801481 +vt 0.101728 0.817827 +vt 0.083864 0.833719 +vt 0.084983 0.812262 +vt 0.085108 0.817015 +vt 0.089483 0.821791 +vt 0.078866 0.817929 +s 0 +usemtl Button +f 197/264/52 172/232/52 177/238/52 +f 163/222/53 137/195/53 114/165/53 +f 156/215/54 130/186/54 135/192/54 +f 142/201/55 153/212/55 156/215/55 +f 149/208/56 123/177/56 128/183/56 +f 253/328/52 228/296/52 233/302/52 +f 219/286/53 193/259/53 170/229/53 +f 212/279/54 186/250/54 191/256/54 +f 198/265/55 209/276/55 212/279/55 +f 205/272/56 179/241/56 184/247/56 +f 309/392/52 284/360/52 289/366/52 +f 275/350/53 249/323/53 226/293/53 +f 268/343/54 242/314/54 247/320/54 +f 254/329/55 265/340/55 268/343/55 +f 261/336/56 235/305/56 240/311/56 +f 365/456/52 340/424/52 345/430/52 +f 331/414/53 305/387/53 282/357/53 +f 324/407/54 298/378/54 303/384/54 +f 310/393/55 321/404/55 324/407/55 +f 317/400/56 291/369/56 296/375/56 +f 421/520/52 396/488/52 401/494/52 +f 387/478/53 361/451/53 338/421/53 +f 380/471/54 354/442/54 359/448/54 +f 366/457/55 377/468/55 380/471/55 +f 373/464/56 347/433/56 352/439/56 +f 477/584/52 452/552/52 457/558/52 +f 443/542/53 417/515/53 394/485/53 +f 436/535/54 410/506/54 415/512/54 +f 422/521/55 433/532/55 436/535/55 +f 429/528/56 403/497/56 408/503/56 +f 533/648/52 508/616/52 513/622/52 +f 499/606/53 473/579/53 450/549/53 +f 492/599/54 466/570/54 471/576/54 +f 478/585/55 489/596/55 492/599/55 +f 485/592/56 459/561/56 464/567/56 +f 589/712/52 564/680/52 569/686/52 +f 555/670/53 529/643/53 506/613/53 +f 548/663/54 522/634/54 527/640/54 +f 534/649/55 545/660/55 548/663/55 +f 541/656/56 515/625/56 520/631/56 +f 645/776/52 620/744/52 625/750/52 +f 611/734/53 585/707/53 562/677/53 +f 604/727/54 578/698/54 583/704/54 +f 590/713/55 601/724/55 604/727/55 +f 597/720/56 571/689/56 576/695/56 +f 701/840/52 676/808/52 681/814/52 +f 667/798/53 641/771/53 618/741/53 +f 660/791/54 634/762/54 639/768/54 +f 646/777/55 657/788/55 660/791/55 +f 653/784/56 627/753/56 632/759/56 +f 757/904/52 732/872/52 737/878/52 +f 723/862/53 697/835/53 674/805/53 +f 716/855/54 690/826/54 695/832/54 +f 702/841/55 713/852/55 716/855/55 +f 709/848/56 683/817/56 688/823/56 +f 813/968/52 788/936/52 793/942/52 +f 779/926/53 753/899/53 730/869/53 +f 772/919/54 746/890/54 751/896/54 +f 758/905/55 769/916/55 772/919/55 +f 765/912/56 739/881/56 744/887/56 +f 869/1032/52 844/1000/52 849/1006/52 +f 835/990/53 809/963/53 786/933/53 +f 828/983/54 802/954/54 807/960/54 +f 814/969/55 825/980/55 828/983/55 +f 821/976/56 795/945/56 800/951/56 +f 925/1096/52 900/1064/52 905/1070/52 +f 891/1054/53 865/1027/53 842/997/53 +f 884/1047/54 858/1018/54 863/1024/54 +f 870/1033/55 881/1044/55 884/1047/55 +f 877/1040/56 851/1009/56 856/1015/56 +f 981/1160/52 956/1128/52 961/1134/52 +f 947/1118/53 921/1091/53 898/1061/53 +f 940/1111/54 914/1082/54 919/1088/54 +f 926/1097/55 937/1108/55 940/1111/55 +f 933/1104/56 907/1073/56 912/1079/56 +f 1003/1182/53 977/1155/53 954/1125/53 +f 996/1175/54 970/1146/54 975/1152/54 +f 982/1161/55 993/1172/55 996/1175/55 +f 989/1168/56 963/1137/56 968/1143/56 +f 116/168/57 119/172/57 113/164/57 +f 118/170/58 116/168/58 114/165/58 +f 119/172/59 118/171/59 115/166/59 +f 123/177/60 126/181/60 120/173/60 +f 125/180/61 123/177/61 121/174/61 +f 126/181/62 125/179/62 122/175/62 +f 130/186/63 133/190/63 127/182/63 +f 132/188/64 130/186/64 128/183/64 +f 133/190/65 132/189/65 129/184/65 +f 137/195/66 140/199/66 134/191/66 +f 139/197/67 137/195/67 135/192/67 +f 140/199/68 139/198/68 136/193/68 +f 144/203/69 147/206/69 141/200/69 +f 146/205/70 144/203/70 142/201/70 +f 147/206/71 146/205/71 143/202/71 +f 151/210/72 154/213/72 148/207/72 +f 153/212/73 151/210/73 149/208/73 +f 154/213/74 153/212/74 150/209/74 +f 158/217/75 161/220/75 155/214/75 +f 160/219/76 158/217/76 156/215/76 +f 161/220/77 160/219/77 157/216/77 +f 165/224/78 168/227/78 162/221/78 +f 167/226/79 165/224/79 163/222/79 +f 168/227/80 167/226/80 164/223/80 +f 172/232/57 175/236/57 169/228/57 +f 174/234/58 172/232/58 170/229/58 +f 175/236/59 174/235/59 171/230/59 +f 179/241/60 182/245/60 176/237/60 +f 181/243/61 179/241/61 177/238/61 +f 182/245/62 181/244/62 178/239/62 +f 186/250/63 189/254/63 183/246/63 +f 188/252/64 186/250/64 184/247/64 +f 189/254/65 188/253/65 185/248/65 +f 193/259/66 196/263/66 190/255/66 +f 195/261/67 193/259/67 191/256/67 +f 196/263/68 195/262/68 192/257/68 +f 200/267/69 203/270/69 197/264/69 +f 202/269/81 200/267/81 198/265/81 +f 203/270/71 202/269/71 199/266/71 +f 207/274/72 210/277/72 204/271/72 +f 209/276/73 207/274/73 205/272/73 +f 210/277/74 209/276/74 206/273/74 +f 214/281/75 217/284/75 211/278/75 +f 216/283/76 214/281/76 212/279/76 +f 217/284/77 216/283/77 213/280/77 +f 221/288/78 224/291/78 218/285/78 +f 223/290/82 221/288/82 219/286/82 +f 224/291/80 223/290/80 220/287/80 +f 228/296/57 231/300/57 225/292/57 +f 230/298/58 228/296/58 226/293/58 +f 231/300/59 230/299/59 227/294/59 +f 235/305/60 238/309/60 232/301/60 +f 237/307/61 235/305/61 233/302/61 +f 238/309/62 237/308/62 234/303/62 +f 242/314/63 245/318/63 239/310/63 +f 244/316/64 242/314/64 240/311/64 +f 245/318/65 244/317/65 241/312/65 +f 249/323/66 252/327/66 246/319/66 +f 251/325/67 249/323/67 247/320/67 +f 252/327/68 251/326/68 248/321/68 +f 256/331/69 259/334/69 253/328/69 +f 258/333/81 256/331/81 254/329/81 +f 259/334/71 258/333/71 255/330/71 +f 263/338/72 266/341/72 260/335/72 +f 265/340/73 263/338/73 261/336/73 +f 266/341/74 265/340/74 262/337/74 +f 270/345/75 273/348/75 267/342/75 +f 272/347/76 270/345/76 268/343/76 +f 273/348/77 272/347/77 269/344/77 +f 277/352/78 280/355/78 274/349/78 +f 279/354/82 277/352/82 275/350/82 +f 280/355/80 279/354/80 276/351/80 +f 284/360/57 287/364/57 281/356/57 +f 286/362/58 284/360/58 282/357/58 +f 287/364/59 286/363/59 283/358/59 +f 291/369/60 294/373/60 288/365/60 +f 293/371/61 291/369/61 289/366/61 +f 294/373/62 293/372/62 290/367/62 +f 298/378/63 301/382/63 295/374/63 +f 300/380/64 298/378/64 296/375/64 +f 301/382/65 300/381/65 297/376/65 +f 305/387/66 308/391/66 302/383/66 +f 307/389/67 305/387/67 303/384/67 +f 308/391/68 307/390/68 304/385/68 +f 312/395/69 315/398/69 309/392/69 +f 314/397/70 312/395/70 310/393/70 +f 315/398/71 314/397/71 311/394/71 +f 319/402/72 322/405/72 316/399/72 +f 321/404/83 319/402/83 317/400/83 +f 322/405/74 321/404/74 318/401/74 +f 326/409/75 329/412/75 323/406/75 +f 328/411/76 326/409/76 324/407/76 +f 329/412/84 328/411/84 325/408/84 +f 333/416/78 336/419/78 330/413/78 +f 335/418/79 333/416/79 331/414/79 +f 336/419/80 335/418/80 332/415/80 +f 340/424/57 343/428/57 337/420/57 +f 342/426/58 340/424/58 338/421/58 +f 343/428/59 342/427/59 339/422/59 +f 347/433/60 350/437/60 344/429/60 +f 349/435/61 347/433/61 345/430/61 +f 350/437/62 349/436/62 346/431/62 +f 354/442/63 357/446/63 351/438/63 +f 356/444/64 354/442/64 352/439/64 +f 357/446/65 356/445/65 353/440/65 +f 361/451/66 364/455/66 358/447/66 +f 363/453/67 361/451/67 359/448/67 +f 364/455/68 363/454/68 360/449/68 +f 368/459/69 371/462/69 365/456/69 +f 370/461/70 368/459/70 366/457/70 +f 371/462/71 370/461/71 367/458/71 +f 375/466/72 378/469/72 372/463/72 +f 377/468/83 375/466/83 373/464/83 +f 378/469/74 377/468/74 374/465/74 +f 382/473/75 385/476/75 379/470/75 +f 384/475/76 382/473/76 380/471/76 +f 385/476/77 384/475/77 381/472/77 +f 389/480/78 392/483/78 386/477/78 +f 391/482/82 389/480/82 387/478/82 +f 392/483/80 391/482/80 388/479/80 +f 396/488/57 399/492/57 393/484/57 +f 398/490/58 396/488/58 394/485/58 +f 399/492/59 398/491/59 395/486/59 +f 403/497/60 406/501/60 400/493/60 +f 405/499/61 403/497/61 401/494/61 +f 406/501/62 405/500/62 402/495/62 +f 410/506/63 413/510/63 407/502/63 +f 412/508/64 410/506/64 408/503/64 +f 413/510/65 412/509/65 409/504/65 +f 417/515/66 420/519/66 414/511/66 +f 419/517/67 417/515/67 415/512/67 +f 420/519/85 419/518/85 416/513/85 +f 424/523/69 427/526/69 421/520/69 +f 426/525/81 424/523/81 422/521/81 +f 427/526/71 426/525/71 423/522/71 +f 431/530/72 434/533/72 428/527/72 +f 433/532/73 431/530/73 429/528/73 +f 434/533/74 433/532/74 430/529/74 +f 438/537/75 441/540/75 435/534/75 +f 440/539/76 438/537/76 436/535/76 +f 441/540/84 440/539/84 437/536/84 +f 445/544/78 448/547/78 442/541/78 +f 447/546/82 445/544/82 443/542/82 +f 448/547/80 447/546/80 444/543/80 +f 452/552/57 455/556/57 449/548/57 +f 454/554/58 452/552/58 450/549/58 +f 455/556/59 454/555/59 451/550/59 +f 459/561/60 462/565/60 456/557/60 +f 461/563/61 459/561/61 457/558/61 +f 462/565/62 461/564/62 458/559/62 +f 466/570/63 469/574/63 463/566/63 +f 468/572/64 466/570/64 464/567/64 +f 469/574/65 468/573/65 465/568/65 +f 473/579/66 476/583/66 470/575/66 +f 475/581/67 473/579/67 471/576/67 +f 476/583/68 475/582/68 472/577/68 +f 480/587/69 483/590/69 477/584/69 +f 482/589/81 480/587/81 478/585/81 +f 483/590/71 482/589/71 479/586/71 +f 487/594/72 490/597/72 484/591/72 +f 489/596/73 487/594/73 485/592/73 +f 490/597/74 489/596/74 486/593/74 +f 494/601/75 497/604/75 491/598/75 +f 496/603/76 494/601/76 492/599/76 +f 497/604/84 496/603/84 493/600/84 +f 501/608/78 504/611/78 498/605/78 +f 503/610/82 501/608/82 499/606/82 +f 504/611/80 503/610/80 500/607/80 +f 508/616/57 511/620/57 505/612/57 +f 510/618/58 508/616/58 506/613/58 +f 511/620/59 510/619/59 507/614/59 +f 515/625/60 518/629/60 512/621/60 +f 517/627/61 515/625/61 513/622/61 +f 518/629/62 517/628/62 514/623/62 +f 522/634/63 525/638/63 519/630/63 +f 524/636/64 522/634/64 520/631/64 +f 525/638/65 524/637/65 521/632/65 +f 529/643/66 532/647/66 526/639/66 +f 531/645/67 529/643/67 527/640/67 +f 532/647/68 531/646/68 528/641/68 +f 536/651/69 539/654/69 533/648/69 +f 538/653/70 536/651/70 534/649/70 +f 539/654/71 538/653/71 535/650/71 +f 543/658/72 546/661/72 540/655/72 +f 545/660/83 543/658/83 541/656/83 +f 546/661/74 545/660/74 542/657/74 +f 550/665/75 553/668/75 547/662/75 +f 552/667/76 550/665/76 548/663/76 +f 553/668/84 552/667/84 549/664/84 +f 557/672/78 560/675/78 554/669/78 +f 559/674/79 557/672/79 555/670/79 +f 560/675/80 559/674/80 556/671/80 +f 564/680/57 567/684/57 561/676/57 +f 566/682/58 564/680/58 562/677/58 +f 567/684/59 566/683/59 563/678/59 +f 571/689/60 574/693/60 568/685/60 +f 573/691/61 571/689/61 569/686/61 +f 574/693/62 573/692/62 570/687/62 +f 578/698/63 581/702/63 575/694/63 +f 580/700/64 578/698/64 576/695/64 +f 581/702/65 580/701/65 577/696/65 +f 585/707/66 588/711/66 582/703/66 +f 587/709/67 585/707/67 583/704/67 +f 588/711/68 587/710/68 584/705/68 +f 592/715/69 595/718/69 589/712/69 +f 594/717/70 592/715/70 590/713/70 +f 595/718/71 594/717/71 591/714/71 +f 599/722/72 602/725/72 596/719/72 +f 601/724/73 599/722/73 597/720/73 +f 602/725/74 601/724/74 598/721/74 +f 606/729/75 609/732/75 603/726/75 +f 608/731/76 606/729/76 604/727/76 +f 609/732/77 608/731/77 605/728/77 +f 613/736/78 616/739/78 610/733/78 +f 615/738/79 613/736/79 611/734/79 +f 616/739/80 615/738/80 612/735/80 +f 620/744/86 623/748/86 617/740/86 +f 622/746/58 620/744/58 618/741/58 +f 623/748/59 622/747/59 619/742/59 +f 627/753/60 630/757/60 624/749/60 +f 629/755/61 627/753/61 625/750/61 +f 630/757/87 629/756/87 626/751/87 +f 634/762/63 637/766/63 631/758/63 +f 636/764/64 634/762/64 632/759/64 +f 637/766/65 636/765/65 633/760/65 +f 641/771/66 644/775/66 638/767/66 +f 643/773/67 641/771/67 639/768/67 +f 644/775/68 643/774/68 640/769/68 +f 648/779/69 651/782/69 645/776/69 +f 650/781/70 648/779/70 646/777/70 +f 651/782/71 650/781/71 647/778/71 +f 655/786/72 658/789/72 652/783/72 +f 657/788/73 655/786/73 653/784/73 +f 658/789/74 657/788/74 654/785/74 +f 662/793/75 665/796/75 659/790/75 +f 664/795/76 662/793/76 660/791/76 +f 665/796/77 664/795/77 661/792/77 +f 669/800/78 672/803/78 666/797/78 +f 671/802/82 669/800/82 667/798/82 +f 672/803/80 671/802/80 668/799/80 +f 676/808/57 679/812/57 673/804/57 +f 678/810/58 676/808/58 674/805/58 +f 679/812/59 678/811/59 675/806/59 +f 683/817/60 686/821/60 680/813/60 +f 685/819/61 683/817/61 681/814/61 +f 686/821/62 685/820/62 682/815/62 +f 690/826/63 693/830/63 687/822/63 +f 692/828/64 690/826/64 688/823/64 +f 693/830/65 692/829/65 689/824/65 +f 697/835/66 700/839/66 694/831/66 +f 699/837/67 697/835/67 695/832/67 +f 700/839/68 699/838/68 696/833/68 +f 704/843/69 707/846/69 701/840/69 +f 706/845/81 704/843/81 702/841/81 +f 707/846/71 706/845/71 703/842/71 +f 711/850/72 714/853/72 708/847/72 +f 713/852/73 711/850/73 709/848/73 +f 714/853/74 713/852/74 710/849/74 +f 718/857/75 721/860/75 715/854/75 +f 720/859/76 718/857/76 716/855/76 +f 721/860/77 720/859/77 717/856/77 +f 725/864/78 728/867/78 722/861/78 +f 727/866/82 725/864/82 723/862/82 +f 728/867/80 727/866/80 724/863/80 +f 732/872/57 735/876/57 729/868/57 +f 734/874/58 732/872/58 730/869/58 +f 735/876/59 734/875/59 731/870/59 +f 739/881/60 742/885/60 736/877/60 +f 741/883/61 739/881/61 737/878/61 +f 742/885/87 741/884/87 738/879/87 +f 746/890/63 749/894/63 743/886/63 +f 748/892/64 746/890/64 744/887/64 +f 749/894/65 748/893/65 745/888/65 +f 753/899/66 756/903/66 750/895/66 +f 755/901/67 753/899/67 751/896/67 +f 756/903/68 755/902/68 752/897/68 +f 760/907/69 763/910/69 757/904/69 +f 762/909/70 760/907/70 758/905/70 +f 763/910/71 762/909/71 759/906/71 +f 767/914/72 770/917/72 764/911/72 +f 769/916/83 767/914/83 765/912/83 +f 770/917/74 769/916/74 766/913/74 +f 774/921/75 777/924/75 771/918/75 +f 776/923/76 774/921/76 772/919/76 +f 777/924/84 776/923/84 773/920/84 +f 781/928/78 784/931/78 778/925/78 +f 783/930/79 781/928/79 779/926/79 +f 784/931/80 783/930/80 780/927/80 +f 788/936/86 791/940/86 785/932/86 +f 790/938/58 788/936/58 786/933/58 +f 791/940/59 790/939/59 787/934/59 +f 795/945/60 798/949/60 792/941/60 +f 797/947/61 795/945/61 793/942/61 +f 798/949/87 797/948/87 794/943/87 +f 802/954/88 805/958/88 799/950/88 +f 804/956/64 802/954/64 800/951/64 +f 805/958/65 804/957/65 801/952/65 +f 809/963/66 812/967/66 806/959/66 +f 811/965/67 809/963/67 807/960/67 +f 812/967/85 811/966/85 808/961/85 +f 816/971/69 819/974/69 813/968/69 +f 818/973/81 816/971/81 814/969/81 +f 819/974/71 818/973/71 815/970/71 +f 823/978/72 826/981/72 820/975/72 +f 825/980/83 823/978/83 821/976/83 +f 826/981/74 825/980/74 822/977/74 +f 830/985/75 833/988/75 827/982/75 +f 832/987/76 830/985/76 828/983/76 +f 833/988/84 832/987/84 829/984/84 +f 837/992/78 840/995/78 834/989/78 +f 839/994/82 837/992/82 835/990/82 +f 840/995/80 839/994/80 836/991/80 +f 844/1000/86 847/1004/86 841/996/86 +f 846/1002/58 844/1000/58 842/997/58 +f 847/1004/89 846/1003/89 843/998/89 +f 851/1009/60 854/1013/60 848/1005/60 +f 853/1011/61 851/1009/61 849/1006/61 +f 854/1013/87 853/1012/87 850/1007/87 +f 858/1018/88 861/1022/88 855/1014/88 +f 860/1020/64 858/1018/64 856/1015/64 +f 861/1022/65 860/1021/65 857/1016/65 +f 865/1027/90 868/1031/90 862/1023/90 +f 867/1029/67 865/1027/67 863/1024/67 +f 868/1031/85 867/1030/85 864/1025/85 +f 872/1035/69 875/1038/69 869/1032/69 +f 874/1037/81 872/1035/81 870/1033/81 +f 875/1038/71 874/1037/71 871/1034/71 +f 879/1042/72 882/1045/72 876/1039/72 +f 881/1044/83 879/1042/83 877/1040/83 +f 882/1045/74 881/1044/74 878/1041/74 +f 886/1049/75 889/1052/75 883/1046/75 +f 888/1051/76 886/1049/76 884/1047/76 +f 889/1052/84 888/1051/84 885/1048/84 +f 893/1056/78 896/1059/78 890/1053/78 +f 895/1058/82 893/1056/82 891/1054/82 +f 896/1059/80 895/1058/80 892/1055/80 +f 900/1064/86 903/1068/86 897/1060/86 +f 902/1066/58 900/1064/58 898/1061/58 +f 903/1068/59 902/1067/59 899/1062/59 +f 907/1073/60 910/1077/60 904/1069/60 +f 909/1075/61 907/1073/61 905/1070/61 +f 910/1077/87 909/1076/87 906/1071/87 +f 914/1082/88 917/1086/88 911/1078/88 +f 916/1084/64 914/1082/64 912/1079/64 +f 917/1086/65 916/1085/65 913/1080/65 +f 921/1091/66 924/1095/66 918/1087/66 +f 923/1093/67 921/1091/67 919/1088/67 +f 924/1095/85 923/1094/85 920/1089/85 +f 928/1099/69 931/1102/69 925/1096/69 +f 930/1101/81 928/1099/81 926/1097/81 +f 931/1102/71 930/1101/71 927/1098/71 +f 935/1106/72 938/1109/72 932/1103/72 +f 937/1108/83 935/1106/83 933/1104/83 +f 938/1109/74 937/1108/74 934/1105/74 +f 942/1113/75 945/1116/75 939/1110/75 +f 944/1115/76 942/1113/76 940/1111/76 +f 945/1116/77 944/1115/77 941/1112/77 +f 949/1120/78 952/1123/78 946/1117/78 +f 951/1122/82 949/1120/82 947/1118/82 +f 952/1123/80 951/1122/80 948/1119/80 +f 956/1128/86 959/1132/86 953/1124/86 +f 958/1130/58 956/1128/58 954/1125/58 +f 959/1132/59 958/1131/59 955/1126/59 +f 963/1137/60 966/1141/60 960/1133/60 +f 965/1139/61 963/1137/61 961/1134/61 +f 966/1141/87 965/1140/87 962/1135/87 +f 970/1146/88 973/1150/88 967/1142/88 +f 972/1148/64 970/1146/64 968/1143/64 +f 973/1150/65 972/1149/65 969/1144/65 +f 977/1155/66 980/1159/66 974/1151/66 +f 979/1157/67 977/1155/67 975/1152/67 +f 980/1159/68 979/1158/68 976/1153/68 +f 984/1163/69 987/1166/69 981/1160/69 +f 986/1165/70 984/1163/70 982/1161/70 +f 987/1166/71 986/1165/71 983/1162/71 +f 991/1170/72 994/1173/72 988/1167/72 +f 993/1172/83 991/1170/83 989/1168/83 +f 994/1173/74 993/1172/74 990/1169/74 +f 998/1177/75 1001/1180/75 995/1174/75 +f 1000/1179/76 998/1177/76 996/1175/76 +f 1001/1180/84 1000/1179/84 997/1176/84 +f 1005/1184/78 1008/1187/78 1002/1181/78 +f 1007/1186/79 1005/1184/79 1003/1182/79 +f 1008/1187/80 1007/1186/80 1004/1183/80 +f 141/200/52 116/168/52 121/174/52 +f 177/238/52 204/271/52 210/277/52 +f 210/277/52 206/273/52 197/264/52 +f 197/264/52 203/270/52 199/266/52 +f 199/266/52 170/229/52 172/232/52 +f 172/232/52 169/228/52 178/240/52 +f 178/240/52 181/243/52 177/238/52 +f 177/238/52 210/277/52 197/264/52 +f 197/264/52 199/266/52 172/232/52 +f 172/232/52 178/240/52 177/238/52 +f 114/165/53 143/202/53 146/205/53 +f 146/205/53 142/201/53 163/222/53 +f 163/222/53 165/224/53 162/221/53 +f 162/221/53 135/192/53 137/195/53 +f 137/195/53 134/191/53 115/167/53 +f 115/167/53 118/170/53 114/165/53 +f 114/165/53 146/205/53 163/222/53 +f 163/222/53 162/221/53 137/195/53 +f 137/195/53 115/167/53 114/165/53 +f 135/192/54 162/221/54 168/227/54 +f 168/227/54 164/223/54 156/215/54 +f 156/215/54 158/217/54 155/214/54 +f 155/214/54 128/183/54 130/186/54 +f 130/186/54 127/182/54 136/194/54 +f 136/194/54 139/197/54 135/192/54 +f 135/192/54 168/227/54 156/215/54 +f 156/215/54 155/214/54 130/186/54 +f 130/186/54 136/194/54 135/192/54 +f 156/215/55 164/223/55 167/226/55 +f 167/226/55 163/222/55 142/201/55 +f 142/201/55 144/203/55 141/200/55 +f 141/200/55 150/209/55 153/212/55 +f 153/212/55 149/208/55 157/216/55 +f 157/216/55 160/219/55 156/215/55 +f 156/215/55 167/226/55 142/201/55 +f 142/201/55 141/200/55 153/212/55 +f 153/212/55 157/216/55 156/215/55 +f 128/183/56 155/214/56 161/220/56 +f 161/220/56 157/216/56 149/208/56 +f 149/208/56 151/210/56 148/207/56 +f 148/207/56 121/174/56 123/177/56 +f 123/177/56 120/173/56 129/185/56 +f 129/185/56 132/188/56 128/183/56 +f 128/183/56 161/220/56 149/208/56 +f 149/208/56 148/207/56 123/177/56 +f 123/177/56 129/185/56 128/183/56 +f 233/302/52 260/335/52 266/341/52 +f 266/341/52 262/337/52 253/328/52 +f 253/328/52 259/334/52 255/330/52 +f 255/330/52 226/293/52 228/296/52 +f 228/296/52 225/292/52 234/304/52 +f 234/304/52 237/307/52 233/302/52 +f 233/302/52 266/341/52 253/328/52 +f 253/328/52 255/330/52 228/296/52 +f 228/296/52 234/304/52 233/302/52 +f 170/229/53 199/266/53 202/269/53 +f 202/269/53 198/265/53 219/286/53 +f 219/286/53 221/288/53 218/285/53 +f 218/285/53 191/256/53 193/259/53 +f 193/259/53 190/255/53 171/231/53 +f 171/231/53 174/234/53 170/229/53 +f 170/229/53 202/269/53 219/286/53 +f 219/286/53 218/285/53 193/259/53 +f 193/259/53 171/231/53 170/229/53 +f 191/256/54 218/285/54 224/291/54 +f 224/291/54 220/287/54 212/279/54 +f 212/279/54 214/281/54 211/278/54 +f 211/278/54 184/247/54 186/250/54 +f 186/250/54 183/246/54 192/258/54 +f 192/258/54 195/261/54 191/256/54 +f 191/256/54 224/291/54 212/279/54 +f 212/279/54 211/278/54 186/250/54 +f 186/250/54 192/258/54 191/256/54 +f 212/279/55 220/287/55 223/290/55 +f 223/290/55 219/286/55 198/265/55 +f 198/265/55 200/267/55 197/264/55 +f 197/264/55 206/273/55 209/276/55 +f 209/276/55 205/272/55 213/280/55 +f 213/280/55 216/283/55 212/279/55 +f 212/279/55 223/290/55 198/265/55 +f 198/265/55 197/264/55 209/276/55 +f 209/276/55 213/280/55 212/279/55 +f 184/247/56 211/278/56 217/284/56 +f 217/284/56 213/280/56 205/272/56 +f 205/272/56 207/274/56 204/271/56 +f 204/271/56 177/238/56 179/241/56 +f 179/241/56 176/237/56 185/249/56 +f 185/249/56 188/252/56 184/247/56 +f 184/247/56 217/284/56 205/272/56 +f 205/272/56 204/271/56 179/241/56 +f 179/241/56 185/249/56 184/247/56 +f 289/366/52 316/399/52 322/405/52 +f 322/405/52 318/401/52 309/392/52 +f 309/392/52 315/398/52 311/394/52 +f 311/394/52 282/357/52 284/360/52 +f 284/360/52 281/356/52 290/368/52 +f 290/368/52 293/371/52 289/366/52 +f 289/366/52 322/405/52 309/392/52 +f 309/392/52 311/394/52 284/360/52 +f 284/360/52 290/368/52 289/366/52 +f 226/293/53 255/330/53 258/333/53 +f 258/333/53 254/329/53 275/350/53 +f 275/350/53 277/352/53 274/349/53 +f 274/349/53 247/320/53 249/323/53 +f 249/323/53 246/319/53 227/295/53 +f 227/295/53 230/298/53 226/293/53 +f 226/293/53 258/333/53 275/350/53 +f 275/350/53 274/349/53 249/323/53 +f 249/323/53 227/295/53 226/293/53 +f 247/320/54 274/349/54 280/355/54 +f 280/355/54 276/351/54 268/343/54 +f 268/343/54 270/345/54 267/342/54 +f 267/342/54 240/311/54 242/314/54 +f 242/314/54 239/310/54 248/322/54 +f 248/322/54 251/325/54 247/320/54 +f 247/320/54 280/355/54 268/343/54 +f 268/343/54 267/342/54 242/314/54 +f 242/314/54 248/322/54 247/320/54 +f 268/343/55 276/351/55 279/354/55 +f 279/354/55 275/350/55 254/329/55 +f 254/329/55 256/331/55 253/328/55 +f 253/328/55 262/337/55 265/340/55 +f 265/340/55 261/336/55 269/344/55 +f 269/344/55 272/347/55 268/343/55 +f 268/343/55 279/354/55 254/329/55 +f 254/329/55 253/328/55 265/340/55 +f 265/340/55 269/344/55 268/343/55 +f 240/311/56 267/342/56 273/348/56 +f 273/348/56 269/344/56 261/336/56 +f 261/336/56 263/338/56 260/335/56 +f 260/335/56 233/302/56 235/305/56 +f 235/305/56 232/301/56 241/313/56 +f 241/313/56 244/316/56 240/311/56 +f 240/311/56 273/348/56 261/336/56 +f 261/336/56 260/335/56 235/305/56 +f 235/305/56 241/313/56 240/311/56 +f 345/430/52 372/463/52 378/469/52 +f 378/469/52 374/465/52 365/456/52 +f 365/456/52 371/462/52 367/458/52 +f 367/458/52 338/421/52 340/424/52 +f 340/424/52 337/420/52 346/432/52 +f 346/432/52 349/435/52 345/430/52 +f 345/430/52 378/469/52 365/456/52 +f 365/456/52 367/458/52 340/424/52 +f 340/424/52 346/432/52 345/430/52 +f 282/357/53 311/394/53 314/397/53 +f 314/397/53 310/393/53 331/414/53 +f 331/414/53 333/416/53 330/413/53 +f 330/413/53 303/384/53 305/387/53 +f 305/387/53 302/383/53 283/359/53 +f 283/359/53 286/362/53 282/357/53 +f 282/357/53 314/397/53 331/414/53 +f 331/414/53 330/413/53 305/387/53 +f 305/387/53 283/359/53 282/357/53 +f 303/384/54 330/413/54 336/419/54 +f 336/419/54 332/415/54 324/407/54 +f 324/407/54 326/409/54 323/406/54 +f 323/406/54 296/375/54 298/378/54 +f 298/378/54 295/374/54 304/386/54 +f 304/386/54 307/389/54 303/384/54 +f 303/384/54 336/419/54 324/407/54 +f 324/407/54 323/406/54 298/378/54 +f 298/378/54 304/386/54 303/384/54 +f 324/407/55 332/415/55 335/418/55 +f 335/418/55 331/414/55 310/393/55 +f 310/393/55 312/395/55 309/392/55 +f 309/392/55 318/401/55 321/404/55 +f 321/404/55 317/400/55 325/408/55 +f 325/408/55 328/411/55 324/407/55 +f 324/407/55 335/418/55 310/393/55 +f 310/393/55 309/392/55 321/404/55 +f 321/404/55 325/408/55 324/407/55 +f 296/375/56 323/406/56 329/412/56 +f 329/412/56 325/408/56 317/400/56 +f 317/400/56 319/402/56 316/399/56 +f 316/399/56 289/366/56 291/369/56 +f 291/369/56 288/365/56 297/377/56 +f 297/377/56 300/380/56 296/375/56 +f 296/375/56 329/412/56 317/400/56 +f 317/400/56 316/399/56 291/369/56 +f 291/369/56 297/377/56 296/375/56 +f 401/494/52 428/527/52 434/533/52 +f 434/533/52 430/529/52 421/520/52 +f 421/520/52 427/526/52 423/522/52 +f 423/522/52 394/485/52 396/488/52 +f 396/488/52 393/484/52 402/496/52 +f 402/496/52 405/499/52 401/494/52 +f 401/494/52 434/533/52 421/520/52 +f 421/520/52 423/522/52 396/488/52 +f 396/488/52 402/496/52 401/494/52 +f 338/421/53 367/458/53 370/461/53 +f 370/461/53 366/457/53 387/478/53 +f 387/478/53 389/480/53 386/477/53 +f 386/477/53 359/448/53 361/451/53 +f 361/451/53 358/447/53 339/423/53 +f 339/423/53 342/426/53 338/421/53 +f 338/421/53 370/461/53 387/478/53 +f 387/478/53 386/477/53 361/451/53 +f 361/451/53 339/423/53 338/421/53 +f 359/448/54 386/477/54 392/483/54 +f 392/483/54 388/479/54 380/471/54 +f 380/471/54 382/473/54 379/470/54 +f 379/470/54 352/439/54 354/442/54 +f 354/442/54 351/438/54 360/450/54 +f 360/450/54 363/453/54 359/448/54 +f 359/448/54 392/483/54 380/471/54 +f 380/471/54 379/470/54 354/442/54 +f 354/442/54 360/450/54 359/448/54 +f 380/471/55 388/479/55 391/482/55 +f 391/482/55 387/478/55 366/457/55 +f 366/457/55 368/459/55 365/456/55 +f 365/456/55 374/465/55 377/468/55 +f 377/468/55 373/464/55 381/472/55 +f 381/472/55 384/475/55 380/471/55 +f 380/471/55 391/482/55 366/457/55 +f 366/457/55 365/456/55 377/468/55 +f 377/468/55 381/472/55 380/471/55 +f 352/439/56 379/470/56 385/476/56 +f 385/476/56 381/472/56 373/464/56 +f 373/464/56 375/466/56 372/463/56 +f 372/463/56 345/430/56 347/433/56 +f 347/433/56 344/429/56 353/441/56 +f 353/441/56 356/444/56 352/439/56 +f 352/439/56 385/476/56 373/464/56 +f 373/464/56 372/463/56 347/433/56 +f 347/433/56 353/441/56 352/439/56 +f 457/558/52 484/591/52 490/597/52 +f 490/597/52 486/593/52 477/584/52 +f 477/584/52 483/590/52 479/586/52 +f 479/586/52 450/549/52 452/552/52 +f 452/552/52 449/548/52 458/560/52 +f 458/560/52 461/563/52 457/558/52 +f 457/558/52 490/597/52 477/584/52 +f 477/584/52 479/586/52 452/552/52 +f 452/552/52 458/560/52 457/558/52 +f 394/485/53 423/522/53 426/525/53 +f 426/525/53 422/521/53 443/542/53 +f 443/542/53 445/544/53 442/541/53 +f 442/541/53 415/512/53 417/515/53 +f 417/515/53 414/511/53 395/487/53 +f 395/487/53 398/490/53 394/485/53 +f 394/485/53 426/525/53 443/542/53 +f 443/542/53 442/541/53 417/515/53 +f 417/515/53 395/487/53 394/485/53 +f 415/512/54 442/541/54 448/547/54 +f 448/547/54 444/543/54 436/535/54 +f 436/535/54 438/537/54 435/534/54 +f 435/534/54 408/503/54 410/506/54 +f 410/506/54 407/502/54 416/514/54 +f 416/514/54 419/517/54 415/512/54 +f 415/512/54 448/547/54 436/535/54 +f 436/535/54 435/534/54 410/506/54 +f 410/506/54 416/514/54 415/512/54 +f 436/535/55 444/543/55 447/546/55 +f 447/546/55 443/542/55 422/521/55 +f 422/521/55 424/523/55 421/520/55 +f 421/520/55 430/529/55 433/532/55 +f 433/532/55 429/528/55 437/536/55 +f 437/536/55 440/539/55 436/535/55 +f 436/535/55 447/546/55 422/521/55 +f 422/521/55 421/520/55 433/532/55 +f 433/532/55 437/536/55 436/535/55 +f 408/503/56 435/534/56 441/540/56 +f 441/540/56 437/536/56 429/528/56 +f 429/528/56 431/530/56 428/527/56 +f 428/527/56 401/494/56 403/497/56 +f 403/497/56 400/493/56 409/505/56 +f 409/505/56 412/508/56 408/503/56 +f 408/503/56 441/540/56 429/528/56 +f 429/528/56 428/527/56 403/497/56 +f 403/497/56 409/505/56 408/503/56 +f 513/622/52 540/655/52 546/661/52 +f 546/661/52 542/657/52 533/648/52 +f 533/648/52 539/654/52 535/650/52 +f 535/650/52 506/613/52 508/616/52 +f 508/616/52 505/612/52 514/624/52 +f 514/624/52 517/627/52 513/622/52 +f 513/622/52 546/661/52 533/648/52 +f 533/648/52 535/650/52 508/616/52 +f 508/616/52 514/624/52 513/622/52 +f 450/549/53 479/586/53 482/589/53 +f 482/589/53 478/585/53 499/606/53 +f 499/606/53 501/608/53 498/605/53 +f 498/605/53 471/576/53 473/579/53 +f 473/579/53 470/575/53 451/551/53 +f 451/551/53 454/554/53 450/549/53 +f 450/549/53 482/589/53 499/606/53 +f 499/606/53 498/605/53 473/579/53 +f 473/579/53 451/551/53 450/549/53 +f 471/576/54 498/605/54 504/611/54 +f 504/611/54 500/607/54 492/599/54 +f 492/599/54 494/601/54 491/598/54 +f 491/598/54 464/567/54 466/570/54 +f 466/570/54 463/566/54 472/578/54 +f 472/578/54 475/581/54 471/576/54 +f 471/576/54 504/611/54 492/599/54 +f 492/599/54 491/598/54 466/570/54 +f 466/570/54 472/578/54 471/576/54 +f 492/599/55 500/607/55 503/610/55 +f 503/610/55 499/606/55 478/585/55 +f 478/585/55 480/587/55 477/584/55 +f 477/584/55 486/593/55 489/596/55 +f 489/596/55 485/592/55 493/600/55 +f 493/600/55 496/603/55 492/599/55 +f 492/599/55 503/610/55 478/585/55 +f 478/585/55 477/584/55 489/596/55 +f 489/596/55 493/600/55 492/599/55 +f 464/567/56 491/598/56 497/604/56 +f 497/604/56 493/600/56 485/592/56 +f 485/592/56 487/594/56 484/591/56 +f 484/591/56 457/558/56 459/561/56 +f 459/561/56 456/557/56 465/569/56 +f 465/569/56 468/572/56 464/567/56 +f 464/567/56 497/604/56 485/592/56 +f 485/592/56 484/591/56 459/561/56 +f 459/561/56 465/569/56 464/567/56 +f 569/686/52 596/719/52 602/725/52 +f 602/725/52 598/721/52 589/712/52 +f 589/712/52 595/718/52 591/714/52 +f 591/714/52 562/677/52 564/680/52 +f 564/680/52 561/676/52 570/688/52 +f 570/688/52 573/691/52 569/686/52 +f 569/686/52 602/725/52 589/712/52 +f 589/712/52 591/714/52 564/680/52 +f 564/680/52 570/688/52 569/686/52 +f 506/613/53 535/650/53 538/653/53 +f 538/653/53 534/649/53 555/670/53 +f 555/670/53 557/672/53 554/669/53 +f 554/669/53 527/640/53 529/643/53 +f 529/643/53 526/639/53 507/615/53 +f 507/615/53 510/618/53 506/613/53 +f 506/613/53 538/653/53 555/670/53 +f 555/670/53 554/669/53 529/643/53 +f 529/643/53 507/615/53 506/613/53 +f 527/640/54 554/669/54 560/675/54 +f 560/675/54 556/671/54 548/663/54 +f 548/663/54 550/665/54 547/662/54 +f 547/662/54 520/631/54 522/634/54 +f 522/634/54 519/630/54 528/642/54 +f 528/642/54 531/645/54 527/640/54 +f 527/640/54 560/675/54 548/663/54 +f 548/663/54 547/662/54 522/634/54 +f 522/634/54 528/642/54 527/640/54 +f 548/663/55 556/671/55 559/674/55 +f 559/674/55 555/670/55 534/649/55 +f 534/649/55 536/651/55 533/648/55 +f 533/648/55 542/657/55 545/660/55 +f 545/660/55 541/656/55 549/664/55 +f 549/664/55 552/667/55 548/663/55 +f 548/663/55 559/674/55 534/649/55 +f 534/649/55 533/648/55 545/660/55 +f 545/660/55 549/664/55 548/663/55 +f 520/631/56 547/662/56 553/668/56 +f 553/668/56 549/664/56 541/656/56 +f 541/656/56 543/658/56 540/655/56 +f 540/655/56 513/622/56 515/625/56 +f 515/625/56 512/621/56 521/633/56 +f 521/633/56 524/636/56 520/631/56 +f 520/631/56 553/668/56 541/656/56 +f 541/656/56 540/655/56 515/625/56 +f 515/625/56 521/633/56 520/631/56 +f 625/750/52 652/783/52 658/789/52 +f 658/789/52 654/785/52 645/776/52 +f 645/776/52 651/782/52 647/778/52 +f 647/778/52 618/741/52 620/744/52 +f 620/744/52 617/740/52 626/752/52 +f 626/752/52 629/755/52 625/750/52 +f 625/750/52 658/789/52 645/776/52 +f 645/776/52 647/778/52 620/744/52 +f 620/744/52 626/752/52 625/750/52 +f 562/677/53 591/714/53 594/717/53 +f 594/717/53 590/713/53 611/734/53 +f 611/734/53 613/736/53 610/733/53 +f 610/733/53 583/704/53 585/707/53 +f 585/707/53 582/703/53 563/679/53 +f 563/679/53 566/682/53 562/677/53 +f 562/677/53 594/717/53 611/734/53 +f 611/734/53 610/733/53 585/707/53 +f 585/707/53 563/679/53 562/677/53 +f 583/704/54 610/733/54 616/739/54 +f 616/739/54 612/735/54 604/727/54 +f 604/727/54 606/729/54 603/726/54 +f 603/726/54 576/695/54 578/698/54 +f 578/698/54 575/694/54 584/706/54 +f 584/706/54 587/709/54 583/704/54 +f 583/704/54 616/739/54 604/727/54 +f 604/727/54 603/726/54 578/698/54 +f 578/698/54 584/706/54 583/704/54 +f 604/727/55 612/735/55 615/738/55 +f 615/738/55 611/734/55 590/713/55 +f 590/713/55 592/715/55 589/712/55 +f 589/712/55 598/721/55 601/724/55 +f 601/724/55 597/720/55 605/728/55 +f 605/728/55 608/731/55 604/727/55 +f 604/727/55 615/738/55 590/713/55 +f 590/713/55 589/712/55 601/724/55 +f 601/724/55 605/728/55 604/727/55 +f 576/695/56 603/726/56 609/732/56 +f 609/732/56 605/728/56 597/720/56 +f 597/720/56 599/722/56 596/719/56 +f 596/719/56 569/686/56 571/689/56 +f 571/689/56 568/685/56 577/697/56 +f 577/697/56 580/700/56 576/695/56 +f 576/695/56 609/732/56 597/720/56 +f 597/720/56 596/719/56 571/689/56 +f 571/689/56 577/697/56 576/695/56 +f 681/814/52 708/847/52 714/853/52 +f 714/853/52 710/849/52 701/840/52 +f 701/840/52 707/846/52 703/842/52 +f 703/842/52 674/805/52 676/808/52 +f 676/808/52 673/804/52 682/816/52 +f 682/816/52 685/819/52 681/814/52 +f 681/814/52 714/853/52 701/840/52 +f 701/840/52 703/842/52 676/808/52 +f 676/808/52 682/816/52 681/814/52 +f 618/741/53 647/778/53 650/781/53 +f 650/781/53 646/777/53 667/798/53 +f 667/798/53 669/800/53 666/797/53 +f 666/797/53 639/768/53 641/771/53 +f 641/771/53 638/767/53 619/743/53 +f 619/743/53 622/746/53 618/741/53 +f 618/741/53 650/781/53 667/798/53 +f 667/798/53 666/797/53 641/771/53 +f 641/771/53 619/743/53 618/741/53 +f 639/768/54 666/797/54 672/803/54 +f 672/803/54 668/799/54 660/791/54 +f 660/791/54 662/793/54 659/790/54 +f 659/790/54 632/759/54 634/762/54 +f 634/762/54 631/758/54 640/770/54 +f 640/770/54 643/773/54 639/768/54 +f 639/768/54 672/803/54 660/791/54 +f 660/791/54 659/790/54 634/762/54 +f 634/762/54 640/770/54 639/768/54 +f 660/791/55 668/799/55 671/802/55 +f 671/802/55 667/798/55 646/777/55 +f 646/777/55 648/779/55 645/776/55 +f 645/776/55 654/785/55 657/788/55 +f 657/788/55 653/784/55 661/792/55 +f 661/792/55 664/795/55 660/791/55 +f 660/791/55 671/802/55 646/777/55 +f 646/777/55 645/776/55 657/788/55 +f 657/788/55 661/792/55 660/791/55 +f 632/759/56 659/790/56 665/796/56 +f 665/796/56 661/792/56 653/784/56 +f 653/784/56 655/786/56 652/783/56 +f 652/783/56 625/750/56 627/753/56 +f 627/753/56 624/749/56 633/761/56 +f 633/761/56 636/764/56 632/759/56 +f 632/759/56 665/796/56 653/784/56 +f 653/784/56 652/783/56 627/753/56 +f 627/753/56 633/761/56 632/759/56 +f 737/878/52 764/911/52 770/917/52 +f 770/917/52 766/913/52 757/904/52 +f 757/904/52 763/910/52 759/906/52 +f 759/906/52 730/869/52 732/872/52 +f 732/872/52 729/868/52 738/880/52 +f 738/880/52 741/883/52 737/878/52 +f 737/878/52 770/917/52 757/904/52 +f 757/904/52 759/906/52 732/872/52 +f 732/872/52 738/880/52 737/878/52 +f 674/805/53 703/842/53 706/845/53 +f 706/845/53 702/841/53 723/862/53 +f 723/862/53 725/864/53 722/861/53 +f 722/861/53 695/832/53 697/835/53 +f 697/835/53 694/831/53 675/807/53 +f 675/807/53 678/810/53 674/805/53 +f 674/805/53 706/845/53 723/862/53 +f 723/862/53 722/861/53 697/835/53 +f 697/835/53 675/807/53 674/805/53 +f 695/832/54 722/861/54 728/867/54 +f 728/867/54 724/863/54 716/855/54 +f 716/855/54 718/857/54 715/854/54 +f 715/854/54 688/823/54 690/826/54 +f 690/826/54 687/822/54 696/834/54 +f 696/834/54 699/837/54 695/832/54 +f 695/832/54 728/867/54 716/855/54 +f 716/855/54 715/854/54 690/826/54 +f 690/826/54 696/834/54 695/832/54 +f 716/855/55 724/863/55 727/866/55 +f 727/866/55 723/862/55 702/841/55 +f 702/841/55 704/843/55 701/840/55 +f 701/840/55 710/849/55 713/852/55 +f 713/852/55 709/848/55 717/856/55 +f 717/856/55 720/859/55 716/855/55 +f 716/855/55 727/866/55 702/841/55 +f 702/841/55 701/840/55 713/852/55 +f 713/852/55 717/856/55 716/855/55 +f 688/823/56 715/854/56 721/860/56 +f 721/860/56 717/856/56 709/848/56 +f 709/848/56 711/850/56 708/847/56 +f 708/847/56 681/814/56 683/817/56 +f 683/817/56 680/813/56 689/825/56 +f 689/825/56 692/828/56 688/823/56 +f 688/823/56 721/860/56 709/848/56 +f 709/848/56 708/847/56 683/817/56 +f 683/817/56 689/825/56 688/823/56 +f 793/942/52 820/975/52 826/981/52 +f 826/981/52 822/977/52 813/968/52 +f 813/968/52 819/974/52 815/970/52 +f 815/970/52 786/933/52 788/936/52 +f 788/936/52 785/932/52 794/944/52 +f 794/944/52 797/947/52 793/942/52 +f 793/942/52 826/981/52 813/968/52 +f 813/968/52 815/970/52 788/936/52 +f 788/936/52 794/944/52 793/942/52 +f 730/869/53 759/906/53 762/909/53 +f 762/909/53 758/905/53 779/926/53 +f 779/926/53 781/928/53 778/925/53 +f 778/925/53 751/896/53 753/899/53 +f 753/899/53 750/895/53 731/871/53 +f 731/871/53 734/874/53 730/869/53 +f 730/869/53 762/909/53 779/926/53 +f 779/926/53 778/925/53 753/899/53 +f 753/899/53 731/871/53 730/869/53 +f 751/896/54 778/925/54 784/931/54 +f 784/931/54 780/927/54 772/919/54 +f 772/919/54 774/921/54 771/918/54 +f 771/918/54 744/887/54 746/890/54 +f 746/890/54 743/886/54 752/898/54 +f 752/898/54 755/901/54 751/896/54 +f 751/896/54 784/931/54 772/919/54 +f 772/919/54 771/918/54 746/890/54 +f 746/890/54 752/898/54 751/896/54 +f 772/919/55 780/927/55 783/930/55 +f 783/930/55 779/926/55 758/905/55 +f 758/905/55 760/907/55 757/904/55 +f 757/904/55 766/913/55 769/916/55 +f 769/916/55 765/912/55 773/920/55 +f 773/920/55 776/923/55 772/919/55 +f 772/919/55 783/930/55 758/905/55 +f 758/905/55 757/904/55 769/916/55 +f 769/916/55 773/920/55 772/919/55 +f 744/887/56 771/918/56 777/924/56 +f 777/924/56 773/920/56 765/912/56 +f 765/912/56 767/914/56 764/911/56 +f 764/911/56 737/878/56 739/881/56 +f 739/881/56 736/877/56 745/889/56 +f 745/889/56 748/892/56 744/887/56 +f 744/887/56 777/924/56 765/912/56 +f 765/912/56 764/911/56 739/881/56 +f 739/881/56 745/889/56 744/887/56 +f 849/1006/52 876/1039/52 882/1045/52 +f 882/1045/52 878/1041/52 869/1032/52 +f 869/1032/52 875/1038/52 871/1034/52 +f 871/1034/52 842/997/52 844/1000/52 +f 844/1000/52 841/996/52 850/1008/52 +f 850/1008/52 853/1011/52 849/1006/52 +f 849/1006/52 882/1045/52 869/1032/52 +f 869/1032/52 871/1034/52 844/1000/52 +f 844/1000/52 850/1008/52 849/1006/52 +f 786/933/53 815/970/53 818/973/53 +f 818/973/53 814/969/53 835/990/53 +f 835/990/53 837/992/53 834/989/53 +f 834/989/53 807/960/53 809/963/53 +f 809/963/53 806/959/53 787/935/53 +f 787/935/53 790/938/53 786/933/53 +f 786/933/53 818/973/53 835/990/53 +f 835/990/53 834/989/53 809/963/53 +f 809/963/53 787/935/53 786/933/53 +f 807/960/54 834/989/54 840/995/54 +f 840/995/54 836/991/54 828/983/54 +f 828/983/54 830/985/54 827/982/54 +f 827/982/54 800/951/54 802/954/54 +f 802/954/54 799/950/54 808/962/54 +f 808/962/54 811/965/54 807/960/54 +f 807/960/54 840/995/54 828/983/54 +f 828/983/54 827/982/54 802/954/54 +f 802/954/54 808/962/54 807/960/54 +f 828/983/55 836/991/55 839/994/55 +f 839/994/55 835/990/55 814/969/55 +f 814/969/55 816/971/55 813/968/55 +f 813/968/55 822/977/55 825/980/55 +f 825/980/55 821/976/55 829/984/55 +f 829/984/55 832/987/55 828/983/55 +f 828/983/55 839/994/55 814/969/55 +f 814/969/55 813/968/55 825/980/55 +f 825/980/55 829/984/55 828/983/55 +f 800/951/56 827/982/56 833/988/56 +f 833/988/56 829/984/56 821/976/56 +f 821/976/56 823/978/56 820/975/56 +f 820/975/56 793/942/56 795/945/56 +f 795/945/56 792/941/56 801/953/56 +f 801/953/56 804/956/56 800/951/56 +f 800/951/56 833/988/56 821/976/56 +f 821/976/56 820/975/56 795/945/56 +f 795/945/56 801/953/56 800/951/56 +f 905/1070/52 932/1103/52 938/1109/52 +f 938/1109/52 934/1105/52 925/1096/52 +f 925/1096/52 931/1102/52 927/1098/52 +f 927/1098/52 898/1061/52 900/1064/52 +f 900/1064/52 897/1060/52 906/1072/52 +f 906/1072/52 909/1075/52 905/1070/52 +f 905/1070/52 938/1109/52 925/1096/52 +f 925/1096/52 927/1098/52 900/1064/52 +f 900/1064/52 906/1072/52 905/1070/52 +f 842/997/53 871/1034/53 874/1037/53 +f 874/1037/53 870/1033/53 891/1054/53 +f 891/1054/53 893/1056/53 890/1053/53 +f 890/1053/53 863/1024/53 865/1027/53 +f 865/1027/53 862/1023/53 843/999/53 +f 843/999/53 846/1002/53 842/997/53 +f 842/997/53 874/1037/53 891/1054/53 +f 891/1054/53 890/1053/53 865/1027/53 +f 865/1027/53 843/999/53 842/997/53 +f 863/1024/54 890/1053/54 896/1059/54 +f 896/1059/54 892/1055/54 884/1047/54 +f 884/1047/54 886/1049/54 883/1046/54 +f 883/1046/54 856/1015/54 858/1018/54 +f 858/1018/54 855/1014/54 864/1026/54 +f 864/1026/54 867/1029/54 863/1024/54 +f 863/1024/54 896/1059/54 884/1047/54 +f 884/1047/54 883/1046/54 858/1018/54 +f 858/1018/54 864/1026/54 863/1024/54 +f 884/1047/55 892/1055/55 895/1058/55 +f 895/1058/55 891/1054/55 870/1033/55 +f 870/1033/55 872/1035/55 869/1032/55 +f 869/1032/55 878/1041/55 881/1044/55 +f 881/1044/55 877/1040/55 885/1048/55 +f 885/1048/55 888/1051/55 884/1047/55 +f 884/1047/55 895/1058/55 870/1033/55 +f 870/1033/55 869/1032/55 881/1044/55 +f 881/1044/55 885/1048/55 884/1047/55 +f 856/1015/56 883/1046/56 889/1052/56 +f 889/1052/56 885/1048/56 877/1040/56 +f 877/1040/56 879/1042/56 876/1039/56 +f 876/1039/56 849/1006/56 851/1009/56 +f 851/1009/56 848/1005/56 857/1017/56 +f 857/1017/56 860/1020/56 856/1015/56 +f 856/1015/56 889/1052/56 877/1040/56 +f 877/1040/56 876/1039/56 851/1009/56 +f 851/1009/56 857/1017/56 856/1015/56 +f 961/1134/52 988/1167/52 994/1173/52 +f 994/1173/52 990/1169/52 981/1160/52 +f 981/1160/52 987/1166/52 983/1162/52 +f 983/1162/52 954/1125/52 956/1128/52 +f 956/1128/52 953/1124/52 962/1136/52 +f 962/1136/52 965/1139/52 961/1134/52 +f 961/1134/52 994/1173/52 981/1160/52 +f 981/1160/52 983/1162/52 956/1128/52 +f 956/1128/52 962/1136/52 961/1134/52 +f 898/1061/53 927/1098/53 930/1101/53 +f 930/1101/53 926/1097/53 947/1118/53 +f 947/1118/53 949/1120/53 946/1117/53 +f 946/1117/53 919/1088/53 921/1091/53 +f 921/1091/53 918/1087/53 899/1063/53 +f 899/1063/53 902/1066/53 898/1061/53 +f 898/1061/53 930/1101/53 947/1118/53 +f 947/1118/53 946/1117/53 921/1091/53 +f 921/1091/53 899/1063/53 898/1061/53 +f 919/1088/54 946/1117/54 952/1123/54 +f 952/1123/54 948/1119/54 940/1111/54 +f 940/1111/54 942/1113/54 939/1110/54 +f 939/1110/54 912/1079/54 914/1082/54 +f 914/1082/54 911/1078/54 920/1090/54 +f 920/1090/54 923/1093/54 919/1088/54 +f 919/1088/54 952/1123/54 940/1111/54 +f 940/1111/54 939/1110/54 914/1082/54 +f 914/1082/54 920/1090/54 919/1088/54 +f 940/1111/55 948/1119/55 951/1122/55 +f 951/1122/55 947/1118/55 926/1097/55 +f 926/1097/55 928/1099/55 925/1096/55 +f 925/1096/55 934/1105/55 937/1108/55 +f 937/1108/55 933/1104/55 941/1112/55 +f 941/1112/55 944/1115/55 940/1111/55 +f 940/1111/55 951/1122/55 926/1097/55 +f 926/1097/55 925/1096/55 937/1108/55 +f 937/1108/55 941/1112/55 940/1111/55 +f 912/1079/56 939/1110/56 945/1116/56 +f 945/1116/56 941/1112/56 933/1104/56 +f 933/1104/56 935/1106/56 932/1103/56 +f 932/1103/56 905/1070/56 907/1073/56 +f 907/1073/56 904/1069/56 913/1081/56 +f 913/1081/56 916/1084/56 912/1079/56 +f 912/1079/56 945/1116/56 933/1104/56 +f 933/1104/56 932/1103/56 907/1073/56 +f 907/1073/56 913/1081/56 912/1079/56 +f 954/1125/91 983/1162/91 986/1165/91 +f 986/1165/53 982/1161/53 1003/1182/53 +f 1003/1182/53 1005/1184/53 1002/1181/53 +f 1002/1181/53 975/1152/53 977/1155/53 +f 977/1155/53 974/1151/53 955/1127/53 +f 955/1127/53 958/1130/53 954/1125/53 +f 954/1125/53 986/1165/53 1003/1182/53 +f 1003/1182/53 1002/1181/53 977/1155/53 +f 977/1155/53 955/1127/53 954/1125/53 +f 975/1152/54 1002/1181/54 1008/1187/54 +f 1008/1187/54 1004/1183/54 996/1175/54 +f 996/1175/54 998/1177/54 995/1174/54 +f 995/1174/54 968/1143/54 970/1146/54 +f 970/1146/54 967/1142/54 976/1154/54 +f 976/1154/54 979/1157/54 975/1152/54 +f 975/1152/54 1008/1187/54 996/1175/54 +f 996/1175/54 995/1174/54 970/1146/54 +f 970/1146/54 976/1154/54 975/1152/54 +f 996/1175/55 1004/1183/55 1007/1186/55 +f 1007/1186/55 1003/1182/55 982/1161/55 +f 982/1161/55 984/1163/55 981/1160/55 +f 981/1160/55 990/1169/55 993/1172/55 +f 993/1172/55 989/1168/55 997/1176/55 +f 997/1176/55 1000/1179/55 996/1175/55 +f 996/1175/55 1007/1186/55 982/1161/55 +f 982/1161/55 981/1160/55 993/1172/55 +f 993/1172/55 997/1176/55 996/1175/55 +f 968/1143/56 995/1174/56 1001/1180/56 +f 1001/1180/56 997/1176/56 989/1168/56 +f 989/1168/56 991/1170/56 988/1167/56 +f 988/1167/56 961/1134/56 963/1137/56 +f 963/1137/56 960/1133/56 969/1145/56 +f 969/1145/56 972/1148/56 968/1143/56 +f 968/1143/56 1001/1180/56 989/1168/56 +f 989/1168/56 988/1167/56 963/1137/56 +f 963/1137/56 969/1145/56 968/1143/56 +f 116/168/92 117/169/92 119/172/92 +f 118/170/93 117/169/93 116/168/93 +f 119/172/94 117/169/94 118/171/94 +f 123/177/95 124/178/95 126/181/95 +f 125/180/96 124/178/96 123/177/96 +f 126/181/97 124/178/97 125/179/97 +f 130/186/98 131/187/98 133/190/98 +f 132/188/99 131/187/99 130/186/99 +f 133/190/100 131/187/100 132/189/100 +f 137/195/101 138/196/101 140/199/101 +f 139/197/102 138/196/102 137/195/102 +f 140/199/103 138/196/103 139/198/103 +f 144/203/104 145/204/104 147/206/104 +f 146/205/105 145/204/105 144/203/105 +f 147/206/106 145/204/106 146/205/106 +f 151/210/107 152/211/107 154/213/107 +f 153/212/108 152/211/108 151/210/108 +f 154/213/109 152/211/109 153/212/109 +f 158/217/110 159/218/110 161/220/110 +f 160/219/111 159/218/111 158/217/111 +f 161/220/112 159/218/112 160/219/112 +f 165/224/113 166/225/113 168/227/113 +f 167/226/114 166/225/114 165/224/114 +f 168/227/115 166/225/115 167/226/115 +f 172/232/92 173/233/92 175/236/92 +f 174/234/93 173/233/93 172/232/93 +f 175/236/94 173/233/94 174/235/94 +f 179/241/95 180/242/95 182/245/95 +f 181/243/96 180/242/96 179/241/96 +f 182/245/97 180/242/97 181/244/97 +f 186/250/98 187/251/98 189/254/98 +f 188/252/99 187/251/99 186/250/99 +f 189/254/100 187/251/100 188/253/100 +f 193/259/101 194/260/101 196/263/101 +f 195/261/102 194/260/102 193/259/102 +f 196/263/103 194/260/103 195/262/103 +f 200/267/104 201/268/104 203/270/104 +f 202/269/105 201/268/105 200/267/105 +f 203/270/106 201/268/106 202/269/106 +f 207/274/107 208/275/107 210/277/107 +f 209/276/108 208/275/108 207/274/108 +f 210/277/109 208/275/109 209/276/109 +f 214/281/110 215/282/110 217/284/110 +f 216/283/111 215/282/111 214/281/111 +f 217/284/112 215/282/112 216/283/112 +f 221/288/116 222/289/116 224/291/116 +f 223/290/114 222/289/114 221/288/114 +f 224/291/115 222/289/115 223/290/115 +f 228/296/92 229/297/92 231/300/92 +f 230/298/93 229/297/93 228/296/93 +f 231/300/94 229/297/94 230/299/94 +f 235/305/95 236/306/95 238/309/95 +f 237/307/96 236/306/96 235/305/96 +f 238/309/97 236/306/97 237/308/97 +f 242/314/98 243/315/98 245/318/98 +f 244/316/99 243/315/99 242/314/99 +f 245/318/100 243/315/100 244/317/100 +f 249/323/101 250/324/101 252/327/101 +f 251/325/102 250/324/102 249/323/102 +f 252/327/103 250/324/103 251/326/103 +f 256/331/104 257/332/104 259/334/104 +f 258/333/105 257/332/105 256/331/105 +f 259/334/117 257/332/117 258/333/117 +f 263/338/107 264/339/107 266/341/107 +f 265/340/108 264/339/108 263/338/108 +f 266/341/109 264/339/109 265/340/109 +f 270/345/110 271/346/110 273/348/110 +f 272/347/111 271/346/111 270/345/111 +f 273/348/112 271/346/112 272/347/112 +f 277/352/116 278/353/116 280/355/116 +f 279/354/114 278/353/114 277/352/114 +f 280/355/115 278/353/115 279/354/115 +f 284/360/92 285/361/92 287/364/92 +f 286/362/93 285/361/93 284/360/93 +f 287/364/118 285/361/118 286/363/118 +f 291/369/95 292/370/95 294/373/95 +f 293/371/96 292/370/96 291/369/96 +f 294/373/97 292/370/97 293/372/97 +f 298/378/98 299/379/98 301/382/98 +f 300/380/99 299/379/99 298/378/99 +f 301/382/100 299/379/100 300/381/100 +f 305/387/101 306/388/101 308/391/101 +f 307/389/102 306/388/102 305/387/102 +f 308/391/103 306/388/103 307/390/103 +f 312/395/104 313/396/104 315/398/104 +f 314/397/105 313/396/105 312/395/105 +f 315/398/106 313/396/106 314/397/106 +f 319/402/119 320/403/119 322/405/119 +f 321/404/108 320/403/108 319/402/108 +f 322/405/109 320/403/109 321/404/109 +f 326/409/120 327/410/120 329/412/120 +f 328/411/121 327/410/121 326/409/121 +f 329/412/112 327/410/112 328/411/112 +f 333/416/116 334/417/116 336/419/116 +f 335/418/114 334/417/114 333/416/114 +f 336/419/115 334/417/115 335/418/115 +f 340/424/92 341/425/92 343/428/92 +f 342/426/93 341/425/93 340/424/93 +f 343/428/94 341/425/94 342/427/94 +f 347/433/95 348/434/95 350/437/95 +f 349/435/96 348/434/96 347/433/96 +f 350/437/97 348/434/97 349/436/97 +f 354/442/98 355/443/98 357/446/98 +f 356/444/99 355/443/99 354/442/99 +f 357/446/100 355/443/100 356/445/100 +f 361/451/101 362/452/101 364/455/101 +f 363/453/102 362/452/102 361/451/102 +f 364/455/103 362/452/103 363/454/103 +f 368/459/104 369/460/104 371/462/104 +f 370/461/105 369/460/105 368/459/105 +f 371/462/106 369/460/106 370/461/106 +f 375/466/107 376/467/107 378/469/107 +f 377/468/108 376/467/108 375/466/108 +f 378/469/109 376/467/109 377/468/109 +f 382/473/110 383/474/110 385/476/110 +f 384/475/111 383/474/111 382/473/111 +f 385/476/112 383/474/112 384/475/112 +f 389/480/113 390/481/113 392/483/113 +f 391/482/114 390/481/114 389/480/114 +f 392/483/115 390/481/115 391/482/115 +f 396/488/92 397/489/92 399/492/92 +f 398/490/93 397/489/93 396/488/93 +f 399/492/94 397/489/94 398/491/94 +f 403/497/95 404/498/95 406/501/95 +f 405/499/96 404/498/96 403/497/96 +f 406/501/97 404/498/97 405/500/97 +f 410/506/122 411/507/122 413/510/122 +f 412/508/99 411/507/99 410/506/99 +f 413/510/100 411/507/100 412/509/100 +f 417/515/101 418/516/101 420/519/101 +f 419/517/102 418/516/102 417/515/102 +f 420/519/103 418/516/103 419/518/103 +f 424/523/104 425/524/104 427/526/104 +f 426/525/105 425/524/105 424/523/105 +f 427/526/106 425/524/106 426/525/106 +f 431/530/107 432/531/107 434/533/107 +f 433/532/108 432/531/108 431/530/108 +f 434/533/109 432/531/109 433/532/109 +f 438/537/110 439/538/110 441/540/110 +f 440/539/111 439/538/111 438/537/111 +f 441/540/112 439/538/112 440/539/112 +f 445/544/116 446/545/116 448/547/116 +f 447/546/114 446/545/114 445/544/114 +f 448/547/115 446/545/115 447/546/115 +f 452/552/92 453/553/92 455/556/92 +f 454/554/93 453/553/93 452/552/93 +f 455/556/94 453/553/94 454/555/94 +f 459/561/95 460/562/95 462/565/95 +f 461/563/96 460/562/96 459/561/96 +f 462/565/97 460/562/97 461/564/97 +f 466/570/122 467/571/122 469/574/122 +f 468/572/99 467/571/99 466/570/99 +f 469/574/100 467/571/100 468/573/100 +f 473/579/101 474/580/101 476/583/101 +f 475/581/123 474/580/123 473/579/123 +f 476/583/103 474/580/103 475/582/103 +f 480/587/104 481/588/104 483/590/104 +f 482/589/105 481/588/105 480/587/105 +f 483/590/117 481/588/117 482/589/117 +f 487/594/107 488/595/107 490/597/107 +f 489/596/108 488/595/108 487/594/108 +f 490/597/109 488/595/109 489/596/109 +f 494/601/110 495/602/110 497/604/110 +f 496/603/111 495/602/111 494/601/111 +f 497/604/112 495/602/112 496/603/112 +f 501/608/116 502/609/116 504/611/116 +f 503/610/114 502/609/114 501/608/114 +f 504/611/124 502/609/124 503/610/124 +f 508/616/125 509/617/125 511/620/125 +f 510/618/93 509/617/93 508/616/93 +f 511/620/118 509/617/118 510/619/118 +f 515/625/95 516/626/95 518/629/95 +f 517/627/96 516/626/96 515/625/96 +f 518/629/97 516/626/97 517/628/97 +f 522/634/122 523/635/122 525/638/122 +f 524/636/126 523/635/126 522/634/126 +f 525/638/100 523/635/100 524/637/100 +f 529/643/101 530/644/101 532/647/101 +f 531/645/102 530/644/102 529/643/102 +f 532/647/127 530/644/127 531/646/127 +f 536/651/128 537/652/128 539/654/128 +f 538/653/105 537/652/105 536/651/105 +f 539/654/106 537/652/106 538/653/106 +f 543/658/119 544/659/119 546/661/119 +f 545/660/108 544/659/108 543/658/108 +f 546/661/109 544/659/109 545/660/109 +f 550/665/120 551/666/120 553/668/120 +f 552/667/111 551/666/111 550/665/111 +f 553/668/112 551/666/112 552/667/112 +f 557/672/113 558/673/113 560/675/113 +f 559/674/114 558/673/114 557/672/114 +f 560/675/124 558/673/124 559/674/124 +f 564/680/92 565/681/92 567/684/92 +f 566/682/93 565/681/93 564/680/93 +f 567/684/94 565/681/94 566/683/94 +f 571/689/95 572/690/95 574/693/95 +f 573/691/96 572/690/96 571/689/96 +f 574/693/97 572/690/97 573/692/97 +f 578/698/129 579/699/129 581/702/129 +f 580/700/99 579/699/99 578/698/99 +f 581/702/100 579/699/100 580/701/100 +f 585/707/101 586/708/101 588/711/101 +f 587/709/102 586/708/102 585/707/102 +f 588/711/103 586/708/103 587/710/103 +f 592/715/130 593/716/130 595/718/130 +f 594/717/105 593/716/105 592/715/105 +f 595/718/106 593/716/106 594/717/106 +f 599/722/107 600/723/107 602/725/107 +f 601/724/108 600/723/108 599/722/108 +f 602/725/109 600/723/109 601/724/109 +f 606/729/120 607/730/120 609/732/120 +f 608/731/131 607/730/131 606/729/131 +f 609/732/112 607/730/112 608/731/112 +f 613/736/116 614/737/116 616/739/116 +f 615/738/114 614/737/114 613/736/114 +f 616/739/132 614/737/132 615/738/132 +f 620/744/92 621/745/92 623/748/92 +f 622/746/93 621/745/93 620/744/93 +f 623/748/94 621/745/94 622/747/94 +f 627/753/95 628/754/95 630/757/95 +f 629/755/96 628/754/96 627/753/96 +f 630/757/97 628/754/97 629/756/97 +f 634/762/98 635/763/98 637/766/98 +f 636/764/99 635/763/99 634/762/99 +f 637/766/100 635/763/100 636/765/100 +f 641/771/101 642/772/101 644/775/101 +f 643/773/102 642/772/102 641/771/102 +f 644/775/103 642/772/103 643/774/103 +f 648/779/104 649/780/104 651/782/104 +f 650/781/105 649/780/105 648/779/105 +f 651/782/106 649/780/106 650/781/106 +f 655/786/107 656/787/107 658/789/107 +f 657/788/108 656/787/108 655/786/108 +f 658/789/133 656/787/133 657/788/133 +f 662/793/120 663/794/120 665/796/120 +f 664/795/131 663/794/131 662/793/131 +f 665/796/112 663/794/112 664/795/112 +f 669/800/116 670/801/116 672/803/116 +f 671/802/114 670/801/114 669/800/114 +f 672/803/132 670/801/132 671/802/132 +f 676/808/92 677/809/92 679/812/92 +f 678/810/93 677/809/93 676/808/93 +f 679/812/94 677/809/94 678/811/94 +f 683/817/95 684/818/95 686/821/95 +f 685/819/96 684/818/96 683/817/96 +f 686/821/97 684/818/97 685/820/97 +f 690/826/98 691/827/98 693/830/98 +f 692/828/99 691/827/99 690/826/99 +f 693/830/100 691/827/100 692/829/100 +f 697/835/101 698/836/101 700/839/101 +f 699/837/123 698/836/123 697/835/123 +f 700/839/134 698/836/134 699/838/134 +f 704/843/130 705/844/130 707/846/130 +f 706/845/105 705/844/105 704/843/105 +f 707/846/117 705/844/117 706/845/117 +f 711/850/107 712/851/107 714/853/107 +f 713/852/108 712/851/108 711/850/108 +f 714/853/109 712/851/109 713/852/109 +f 718/857/110 719/858/110 721/860/110 +f 720/859/111 719/858/111 718/857/111 +f 721/860/112 719/858/112 720/859/112 +f 725/864/116 726/865/116 728/867/116 +f 727/866/114 726/865/114 725/864/114 +f 728/867/135 726/865/135 727/866/135 +f 732/872/92 733/873/92 735/876/92 +f 734/874/93 733/873/93 732/872/93 +f 735/876/118 733/873/118 734/875/118 +f 739/881/95 740/882/95 742/885/95 +f 741/883/136 740/882/136 739/881/136 +f 742/885/97 740/882/97 741/884/97 +f 746/890/98 747/891/98 749/894/98 +f 748/892/126 747/891/126 746/890/126 +f 749/894/100 747/891/100 748/893/100 +f 753/899/101 754/900/101 756/903/101 +f 755/901/102 754/900/102 753/899/102 +f 756/903/134 754/900/134 755/902/134 +f 760/907/128 761/908/128 763/910/128 +f 762/909/105 761/908/105 760/907/105 +f 763/910/106 761/908/106 762/909/106 +f 767/914/119 768/915/119 770/917/119 +f 769/916/108 768/915/108 767/914/108 +f 770/917/109 768/915/109 769/916/109 +f 774/921/120 775/922/120 777/924/120 +f 776/923/137 775/922/137 774/921/137 +f 777/924/112 775/922/112 776/923/112 +f 781/928/113 782/929/113 784/931/113 +f 783/930/138 782/929/138 781/928/138 +f 784/931/124 782/929/124 783/930/124 +f 788/936/92 789/937/92 791/940/92 +f 790/938/93 789/937/93 788/936/93 +f 791/940/94 789/937/94 790/939/94 +f 795/945/95 796/946/95 798/949/95 +f 797/947/96 796/946/96 795/945/96 +f 798/949/97 796/946/97 797/948/97 +f 802/954/122 803/955/122 805/958/122 +f 804/956/99 803/955/99 802/954/99 +f 805/958/100 803/955/100 804/957/100 +f 809/963/101 810/964/101 812/967/101 +f 811/965/102 810/964/102 809/963/102 +f 812/967/127 810/964/127 811/966/127 +f 816/971/104 817/972/104 819/974/104 +f 818/973/105 817/972/105 816/971/105 +f 819/974/117 817/972/117 818/973/117 +f 823/978/119 824/979/119 826/981/119 +f 825/980/108 824/979/108 823/978/108 +f 826/981/109 824/979/109 825/980/109 +f 830/985/120 831/986/120 833/988/120 +f 832/987/111 831/986/111 830/985/111 +f 833/988/139 831/986/139 832/987/139 +f 837/992/116 838/993/116 840/995/116 +f 839/994/138 838/993/138 837/992/138 +f 840/995/115 838/993/115 839/994/115 +f 844/1000/92 845/1001/92 847/1004/92 +f 846/1002/93 845/1001/93 844/1000/93 +f 847/1004/94 845/1001/94 846/1003/94 +f 851/1009/95 852/1010/95 854/1013/95 +f 853/1011/96 852/1010/96 851/1009/96 +f 854/1013/97 852/1010/97 853/1012/97 +f 858/1018/122 859/1019/122 861/1022/122 +f 860/1020/99 859/1019/99 858/1018/99 +f 861/1022/100 859/1019/100 860/1021/100 +f 865/1027/101 866/1028/101 868/1031/101 +f 867/1029/123 866/1028/123 865/1027/123 +f 868/1031/127 866/1028/127 867/1030/127 +f 872/1035/104 873/1036/104 875/1038/104 +f 874/1037/105 873/1036/105 872/1035/105 +f 875/1038/117 873/1036/117 874/1037/117 +f 879/1042/119 880/1043/119 882/1045/119 +f 881/1044/108 880/1043/108 879/1042/108 +f 882/1045/109 880/1043/109 881/1044/109 +f 886/1049/110 887/1050/110 889/1052/110 +f 888/1051/111 887/1050/111 886/1049/111 +f 889/1052/139 887/1050/139 888/1051/139 +f 893/1056/116 894/1057/116 896/1059/116 +f 895/1058/138 894/1057/138 893/1056/138 +f 896/1059/115 894/1057/115 895/1058/115 +f 900/1064/92 901/1065/92 903/1068/92 +f 902/1066/93 901/1065/93 900/1064/93 +f 903/1068/94 901/1065/94 902/1067/94 +f 907/1073/95 908/1074/95 910/1077/95 +f 909/1075/140 908/1074/140 907/1073/140 +f 910/1077/97 908/1074/97 909/1076/97 +f 914/1082/122 915/1083/122 917/1086/122 +f 916/1084/99 915/1083/99 914/1082/99 +f 917/1086/100 915/1083/100 916/1085/100 +f 921/1091/101 922/1092/101 924/1095/101 +f 923/1093/102 922/1092/102 921/1091/102 +f 924/1095/103 922/1092/103 923/1094/103 +f 928/1099/128 929/1100/128 931/1102/128 +f 930/1101/105 929/1100/105 928/1099/105 +f 931/1102/117 929/1100/117 930/1101/117 +f 935/1106/107 936/1107/107 938/1109/107 +f 937/1108/108 936/1107/108 935/1106/108 +f 938/1109/109 936/1107/109 937/1108/109 +f 942/1113/110 943/1114/110 945/1116/110 +f 944/1115/111 943/1114/111 942/1113/111 +f 945/1116/139 943/1114/139 944/1115/139 +f 949/1120/116 950/1121/116 952/1123/116 +f 951/1122/114 950/1121/114 949/1120/114 +f 952/1123/124 950/1121/124 951/1122/124 +f 956/1128/92 957/1129/92 959/1132/92 +f 958/1130/93 957/1129/93 956/1128/93 +f 959/1132/94 957/1129/94 958/1131/94 +f 963/1137/95 964/1138/95 966/1141/95 +f 965/1139/96 964/1138/96 963/1137/96 +f 966/1141/97 964/1138/97 965/1140/97 +f 970/1146/122 971/1147/122 973/1150/122 +f 972/1148/126 971/1147/126 970/1146/126 +f 973/1150/100 971/1147/100 972/1149/100 +f 977/1155/101 978/1156/101 980/1159/101 +f 979/1157/102 978/1156/102 977/1155/102 +f 980/1159/127 978/1156/127 979/1158/127 +f 984/1163/128 985/1164/128 987/1166/128 +f 986/1165/105 985/1164/105 984/1163/105 +f 987/1166/106 985/1164/106 986/1165/106 +f 991/1170/119 992/1171/119 994/1173/119 +f 993/1172/108 992/1171/108 991/1170/108 +f 994/1173/109 992/1171/109 993/1172/109 +f 998/1177/120 999/1178/120 1001/1180/120 +f 1000/1179/111 999/1178/111 998/1177/111 +f 1001/1180/112 999/1178/112 1000/1179/112 +f 1005/1184/113 1006/1185/113 1008/1187/113 +f 1007/1186/138 1006/1185/138 1005/1184/138 +f 1008/1187/124 1006/1185/124 1007/1186/124 +f 121/174/52 148/207/52 154/213/52 +f 154/213/52 150/209/52 141/200/52 +f 141/200/52 147/206/52 143/202/52 +f 143/202/52 114/165/52 116/168/52 +f 116/168/52 113/164/52 122/176/52 +f 122/176/52 125/180/52 121/174/52 +f 121/174/52 154/213/52 141/200/52 +f 141/200/52 143/202/52 116/168/52 +f 116/168/52 122/176/52 121/174/52 diff --git a/src/main.zig b/src/main.zig index 9d09f28..711bdf8 100755 --- a/src/main.zig +++ b/src/main.zig @@ -5,6 +5,10 @@ const print = std.debug.print; const Allocator = std.mem.Allocator; const ChipContext = @import("chip.zig"); const RaylibChip = @import("raylib-chip.zig"); +const UI = @import("ui.zig").UI; + +const MemoryView = @import("memory-view.zig").MemoryView; +const Range = @import("memory-view.zig").Range; const assert = std.debug.assert; @@ -31,574 +35,120 @@ fn megabytes(amount: usize) usize { return amount * 1024 * 1024; } -fn nibble_to_char(nibble: u4) u8 { - if (0 <= nibble and nibble <= 9) { - return '0' + @as(u8, nibble); +const Light = struct { + const LightType = enum(i32) { + DIRECTIONAL = 0, + POINT = 1, + }; + + type: LightType, + enabled: bool, + position: rl.Vector3, + target: rl.Vector3, + color: rl.Color, + attenuation: f32 = 0.0, + + enabledLoc: i32, + typeLoc: i32, + positionLoc: i32, + targetLoc: i32, + colorLoc: i32, + attenuationLoc: i32 = 0, + + fn create(light_type: LightType, postion: rl.Vector3, target: rl.Vector3, color: rl.Color, shader: rl.Shader) Light { + var light = Light{ + .type = light_type, + .enabled = true, + .position = postion, + .target = target, + .color = color, + .enabledLoc = rl.GetShaderLocation(shader, "lights[0].enabled"), + .typeLoc = rl.GetShaderLocation(shader, "lights[0].type"), + .positionLoc = rl.GetShaderLocation(shader, "lights[0].position"), + .targetLoc = rl.GetShaderLocation(shader, "lights[0].target"), + .colorLoc = rl.GetShaderLocation(shader, "lights[0].color"), + }; + light.update_values(shader); + return light; + } + + fn update_values(light: *Light, shader: rl.Shader) void { + const enabled: i32 = @intFromBool(light.enabled); + rl.SetShaderValue(shader, light.enabledLoc, &enabled, rl.ShaderUniformDataType.SHADER_UNIFORM_INT); + + const lightType: i32 = @intFromEnum(light.type); + rl.SetShaderValue(shader, light.typeLoc, &lightType, rl.ShaderUniformDataType.SHADER_UNIFORM_INT); + + const position = [3]f32{ light.position.x, light.position.y, light.position.z }; + rl.SetShaderValue(shader, light.positionLoc, &position, rl.ShaderUniformDataType.SHADER_UNIFORM_VEC3); + + const target = [3]f32{ light.target.x, light.target.y, light.target.z }; + rl.SetShaderValue(shader, light.targetLoc, &target, rl.ShaderUniformDataType.SHADER_UNIFORM_VEC3); + + const color = [4]f32{ + @as(f32, @floatFromInt(light.color.r)) / 255.0, + @as(f32, @floatFromInt(light.color.g)) / 255.0, + @as(f32, @floatFromInt(light.color.b)) / 255.0, + @as(f32, @floatFromInt(light.color.a)) / 255.0, + }; + rl.SetShaderValue(shader, light.colorLoc, &color, rl.ShaderUniformDataType.SHADER_UNIFORM_VEC4); + } +}; + +fn get_camera_projection(camera: *const rl.Camera3D) rl.Matrix { + const screen_width: f32 = @floatFromInt(rl.GetScreenWidth()); + const screen_height: f32 = @floatFromInt(rl.GetScreenHeight()); + + if (camera.projection == .CAMERA_PERSPECTIVE) { + return rl.MatrixPerspective(camera.fovy*rl.DEG2RAD, screen_width/screen_height, rl.RL_CULL_DISTANCE_NEAR, rl.RL_CULL_DISTANCE_FAR); + } else if (camera.projection == .CAMERA_ORTHOGRAPHIC) { + const aspect = screen_width/screen_height; + const top = camera.fovy/2.0; + const right = top*aspect; + + return rl.MatrixOrtho(-right, right, -top, top, rl.RL_CULL_DISTANCE_NEAR, rl.RL_CULL_DISTANCE_FAR); } else { - return 'A' + @as(u8, nibble - 10); + unreachable; } } -fn hex_to_strz(str: [:0]u8, number: u32) void { - var i: i32 = @intCast(str.len-1); - var leftover = number; - while (leftover > 0 and i >= 0): (leftover >>= 4) { - const nibble: u4 = @intCast(leftover & 0b1111); - str[@intCast(i)] = nibble_to_char(nibble); - i -= 1; - } +fn get_screen_direction_from_camera(mat_proj: *const rl.Matrix, mat_view: *const rl.Matrix, point: rl.Vector2) rl.Vector3 { + const screen_width: f32 = @floatFromInt(rl.GetScreenWidth()); + const screen_height: f32 = @floatFromInt(rl.GetScreenHeight()); - while (i >= 0): (i -= 1) { - str[@intCast(i)] = '0'; - } + const ndc_x = (2.0*point.x) / screen_width - 1.0; + const ndc_y = 1.0 - (2.0*point.y) / screen_height; + + var near_point = rl.Vector3Unproject(.{ .x = ndc_x, .y = ndc_y, .z = 0.0 }, mat_proj.*, mat_view.*); + var far_point = rl.Vector3Unproject(.{ .x = ndc_x, .y = ndc_y, .z = 1.0 }, mat_proj.*, mat_view.*); + + return rl.Vector3Subtract(far_point, near_point).normalize(); } -fn is_point_inside(px: f32, py: f32, x: f32, y: f32, width: f32, height: f32) bool { - return (x <= px and px < x+width) and (y <= py and y < y+height); +fn get_preffered_distance_to_box(camera: *const rl.Camera3D, box: rl.BoundingBox) f32 { + const screen_width: f32 = @floatFromInt(rl.GetScreenWidth()); + const screen_height: f32 = @floatFromInt(rl.GetScreenHeight()); + const margin = @min(screen_width, screen_height)*0.1; + + const box_size = box.max.sub(box.min); + + const max_model_scale = @min((screen_width-2*margin)/box_size.x, (screen_height-2*margin)/box_size.y); + // const model_screen_width = box_size.x * max_model_scale; + const model_screen_height = box_size.y * max_model_scale; + + const mat_proj = get_camera_projection(camera); + const mat_view = rl.MatrixIdentity(); // rl.MatrixLookAt(camera.position, camera.target, camera.up); + + const screen_middle = rl.Vector2{ .x = screen_width/2, .y = screen_height/2 }; + const box_top_middle = screen_middle.add(.{ .y = -model_screen_height/2 }); + + const middle_dir = get_screen_direction_from_camera(&mat_proj, &mat_view, screen_middle); + const top_middle_dir = get_screen_direction_from_camera(&mat_proj, &mat_view, box_top_middle); + const angle = top_middle_dir.angleBetween(middle_dir); + const distance = 1/@tan(angle) * (box_size.y/2) + box_size.z/4; + return distance; } -fn is_point_inside_rect(px: f32, py: f32, rect: rl.Rectangle) bool { - return is_point_inside(px, py, rect.x, rect.y, rect.width, rect.height); -} - -fn clamp(value: f32, min: f32, max: f32) f32 { - return @min(@max(value, min), max); -} - -const UI = struct { - const TransformFrame = struct { - ox: f32 = 0, - oy: f32 = 0, - sx: f32 = 1, - sy: f32 = 1, - }; - - frames: [16]TransformFrame, - top_frame: u32, - - mouse: rl.Vector2, - mouse_delta: rl.Vector2, - - pub fn init() UI { - return UI{ - .frames = [1]TransformFrame{ TransformFrame{} } ** 16, - .top_frame = 0, - .mouse = rl.Vector2.zero(), - .mouse_delta = rl.Vector2.zero(), - }; - } - - pub fn pushTransform(self: *UI) void { - assert(self.top_frame < self.frames.len-1); - - rl.rlPushMatrix(); - self.top_frame += 1; - self.frames[self.top_frame] = self.frames[self.top_frame - 1]; - } - - pub fn pushTransformT(self: *UI, transform: TransformFrame) void { - self.pushTransform(); - self.translate(transform.ox, transform.oy); - self.scale(transform.sx, transform.sy); - } - - pub fn translate(self: *UI, x: f32, y: f32) void { - const top_frame = &self.frames[self.top_frame]; - top_frame.ox += x * top_frame.sx; - top_frame.oy += y * top_frame.sy; - rl.rlTranslatef(x, y, 0); - } - - pub fn scale(self: *UI, x: f32, y: f32) void { - const top_frame = &self.frames[self.top_frame]; - top_frame.sx *= x; - top_frame.sy *= y; - rl.rlScalef(x, y, 0); - } - - pub fn popTransform(self: *UI) void { - rl.rlPopMatrix(); - self.top_frame -= 1; - } - - pub fn update(self: *UI) void { - assert(self.top_frame == 0); // Check if 'pushTransform()' and 'popTransform()' are paired - - self.frames[0] = .{}; - self.mouse = rl.GetMousePosition(); - self.mouse_delta = rl.GetMouseDelta(); - } - - /// Screen space -> UI space - pub fn apply_transform(self: *UI, vec2: rl.Vector2) rl.Vector2 { - const top_frame = &self.frames[self.top_frame]; - return rl.Vector2{ - .x = (vec2.x - top_frame.ox) * top_frame.sx, - .y = (vec2.y - top_frame.oy) * top_frame.sy - }; - } - - pub fn apply_scale(self: *UI, vec2: rl.Vector2) rl.Vector2 { - const top_frame = &self.frames[self.top_frame]; - return rl.Vector2{ - .x = vec2.x * top_frame.sx, - .y = vec2.y * top_frame.sy, - }; - } - - pub fn get_mouse(self: *UI) rl.Vector2 { - return self.apply_transform(self.mouse); - } - - pub fn get_mouse_delta(self: *UI) rl.Vector2 { - return self.apply_scale(self.mouse_delta); - } - - pub fn is_mouse_inside(self: *UI, x: f32, y: f32, width: f32, height: f32) bool { - const mouse = self.get_mouse(); - return (x <= mouse.x and mouse.x < x+width) and (y <= mouse.y and mouse.y < y+height); - } - - pub fn is_mouse_inside_rect(self: *UI, rect: rl.Rectangle) bool { - return self.is_mouse_inside(rect.x, rect.y, rect.width, rect.height); - } - - pub fn is_mouse_down() bool { - return rl.IsMouseButtonDown(rl.MouseButton.MOUSE_BUTTON_LEFT); - } - - pub fn is_mouse_up() bool { - return rl.IsMouseButtonUp(rl.MouseButton.MOUSE_BUTTON_LEFT); - } - - pub fn was_secondary_mouse_pressed() bool { - return rl.IsMouseButtonPressed(rl.MouseButton.MOUSE_BUTTON_RIGHT); - } - - pub fn is_holding_mouse(self: *UI, rect: rl.Rectangle, state: *bool) bool { - if (!state.* and UI.is_mouse_down() and self.is_mouse_inside_rect(rect)) { - state.* = true; - return true; - } - if (UI.is_mouse_up()) { - state.* = false; - return true; - } - return false; - } -}; - -const UIBox = struct { - x: f32, - y: f32, - width: f32, - height: f32, - - vert_margin: f32, - horz_margin: f32, - - pub fn init(x: f32, y: f32, width: f32, height: f32) UIBox { - return UIBox { - .x = x, - .y = y, - .width = width, - .height = height, - .vert_margin = 0, - .horz_margin = 0, - }; - } - - pub fn init_rect(rectangle: rl.Rectangle) UIBox { - return UIBox.init(rectangle.x, rectangle.y, rectangle.width, rectangle.height); - } - - pub fn body_x(self: *UIBox) f32 { - return self.x + self.horz_margin; - } - - pub fn body_y(self: *UIBox) f32 { - return self.y + self.vert_margin; - } - - pub fn body_width(self: *UIBox) f32 { - return self.width - 2*self.horz_margin; - } - - pub fn body_height(self: *UIBox) f32 { - return self.height - 2*self.vert_margin; - } - - pub fn body_rect(self: *UIBox) rl.Rectangle { - return rl.Rectangle{ - .x = self.body_x(), - .y = self.body_y(), - .width = self.body_width(), - .height = self.body_height() - }; - } - - pub fn rect(self: *UIBox) rl.Rectangle { - return rl.Rectangle{ - .x = self.x, - .y = self.y, - .width = self.width, - .height = self.height - }; - } -}; - -const HorizontalLayout = struct { - x: f32, - y: f32, - width: f32, - height: f32, - - used_width: f32, - - pub fn init(x: f32, y: f32, width: f32, height: f32) HorizontalLayout { - return HorizontalLayout{ - .x = x, - .y = y, - .width = width, - .height = height, - .used_width = 0 - }; - } - - pub fn next_x(self: *HorizontalLayout) f32 { - return self.x + self.used_width; - } - - pub fn next_y(self: *HorizontalLayout) f32 { - return self.y; - } - - pub fn push_rect(self: *HorizontalLayout, width: f32) rl.Rectangle { - const rect = rl.Rectangle{ - .x = self.next_x(), - .y = self.next_y(), - .width = width, - .height = self.height - }; - self.push(width); - return rect; - } - - pub fn push(self: *HorizontalLayout, width: f32) void { - self.used_width += width; - } - - pub fn used_size(self: *HorizontalLayout) rl.Vector2 { - return rl.Vector2{ .x = self.used_width, .y = self.height }; - } -}; - -const Range = struct { start: u32 = 0, end: u32 = 0 }; - -const MemoryView = struct { - const Highlight = struct { - range: Range, - color: rl.Color - }; - - font: *const rl.Font, - font_size: f32, - - base_address: u32, - memory: []u8, - scroll: f32 = 0, - - scrolling: bool = false, - selecting: bool = false, - editing: bool = false, - - editing_byte: u32 = 0, - selection_pivot: u32 = 0, - allocator: *const Allocator, - - grey_out_zeros: bool = true, - - text_color: rl.Color = rl.BLACK, - dim_text_color: rl.Color = rl.GRAY, - - row_width: u5 = 16, - - pub fn init(memory: []u8, font: *const rl.Font, font_size: f32, allocator: *const Allocator) MemoryView { - return MemoryView{ - .allocator = allocator, - .base_address = 0, - .memory = memory, - .font = font, - .font_size = font_size, - }; - } - - pub fn get_memory_row_count(self: *const MemoryView) f32 { - return @ceil(@as(f32, @floatFromInt(self.memory.len)) / @as(f32, @floatFromInt(self.row_width))); - } - - pub fn get_visible_row_count(self: *const MemoryView, height: f32) f32 { - return @min(height / self.font_size, self.get_memory_row_count()); - } - - pub fn get_max_scroll(self: *const MemoryView, height: f32) f32 { - return @max(self.get_memory_row_count() - self.get_visible_row_count(height), 0); - } - - pub fn show(self: *MemoryView, ui: *UI, x: f32, y: f32, width: f32, height: f32, selection: *Range) !void { - if (ui.is_mouse_inside(x, y, width, height)) { - self.scroll -= rl.GetMouseWheelMove(); - } - - self.scroll = clamp(self.scroll, 0, self.get_max_scroll(height)); - - const from_row: u32 = @intFromFloat(@floor(self.scroll)); - const to_row: u32 = @intFromFloat(@ceil(self.scroll + self.get_visible_row_count(height))); - - const scroll_offset = @rem(self.scroll, 1) * self.font_size; - var layout = HorizontalLayout.init(x, y - scroll_offset, width, height); - - layout.push(try self.show_address_column(ui, layout.next_x(), layout.next_y(), from_row, to_row)); - layout.push(self.show_hex_column(ui, layout.next_x(), layout.next_y(), selection, from_row, to_row)); - layout.push(self.show_ascii_column(ui, layout.next_x(), layout.next_y(), selection, from_row, to_row)); - layout.push(self.show_scrollbar(ui, layout.next_x(), y, height)); - } - - pub fn show_address_column(self: *MemoryView, ui: *UI, x: f32, y: f32, from_row: u32, to_row: u32) !f32 { - const font = self.font.*; - const font_size = self.font_size; - const margin = font_size/2; - - const memory_size_f32: f32 = @floatFromInt(self.memory.len); - const memory_size_log10: u32 = @intFromFloat(@floor(@log2(memory_size_f32)/2)); - const address_column_max_chars: u32 = memory_size_log10 + 1; - const row_count = (to_row - from_row); - - var label_buf = try self.allocator.allocSentinel(u8, address_column_max_chars, 0); - defer self.allocator.free(label_buf); - - hex_to_strz(label_buf, 0); - const column_width = rl.MeasureTextEx(font, label_buf, font_size, 0).x + 2*margin; - - ui.pushTransformT(.{ .ox = x, .oy = y }); - for (0..row_count) |i| { - const row = from_row + @as(u32, @intCast(i)); - const row_address = self.base_address + row*self.row_width; - hex_to_strz(label_buf, row_address); - - const cell_rect = rl.Rectangle { - .x = 0, - .y = self.font_size * @as(f32, @floatFromInt(i)), - .height = self.font_size, - .width = column_width - }; - if (ui.is_mouse_inside_rect(cell_rect)) { - rl.DrawRectangleRec(cell_rect, rl.RED); - } - - const text_pos = rl.Vector2{ .x = cell_rect.x + margin, .y = cell_rect.y }; - rl.DrawTextEx(font, label_buf, text_pos, font_size, 0, self.text_color); - } - ui.popTransform(); - - return column_width; - } - - fn is_in_range(x: u32, from: u32, to: u32) bool { - return from <= x and x < to; - } - - pub fn show_hex_column(self: *MemoryView, ui: *UI, x: f32, y: f32, selection: *Range, from_row: u32, to_row: u32) f32 { - assert(self.row_width <= 16); - - const font = self.font.*; - const font_size = self.font_size; - const margin = font_size/6; - - var middle_margin: f32 = 0.0; - if (self.row_width == 16) { - middle_margin = font_size/2; - } - - const cell_width = rl.MeasureTextEx(font, "00", font_size, 0).x; - const row_count = (to_row - from_row); - - const highlights = [_]Highlight{ - Highlight{ .range = .{ .start = 16, .end = 17, }, .color = rl.RED }, - Highlight{ .range = selection.*, .color = rl.RED }, - }; - - ui.pushTransformT(.{ .ox = x, .oy = y }); - var cell_bufz = [_:0]u8{0} ** 2; - for (0..row_count) |i| { - const row = from_row + @as(u32, @intCast(i)); - const row_memory_idx: u32 = @intCast(row*self.row_width); - - var cell_rects: [16]rl.Rectangle = undefined; - const to_column = @min(self.memory.len - row*self.row_width, self.row_width); - for (0..to_column) |column| { - var cell_rect = rl.Rectangle { - .x = (cell_width + 2*margin) * @as(f32, @floatFromInt(column)), - .y = 0, - .width = cell_width + 2*margin, - .height = self.font_size - }; - - if (column >= self.row_width/2) { - cell_rect.x += middle_margin; - } - - cell_rects[column] = cell_rect; - } - - for (highlights) |highlight| { - const highlight_start = highlight.range.start; - const highlight_end = highlight.range.end; - if (row_memory_idx >= highlight_end) continue; - if (row_memory_idx+self.row_width <= highlight_start) continue; - - var highlight_from_column: u32 = undefined; - if (row_memory_idx > highlight_start) { - highlight_from_column = 0; - } else { - highlight_from_column = @mod(highlight_start, self.row_width); - } - - var highlight_to_column: u32 = undefined; - if (row_memory_idx+self.row_width <= highlight_end) { - highlight_to_column = self.row_width-1; - } else { - highlight_to_column = @mod(highlight_end-1, self.row_width); - } - - const from_cell = cell_rects[highlight_from_column]; - const to_cell = cell_rects[highlight_to_column]; - rl.DrawRectangleRec(rl.Rectangle{ - .x = from_cell.x, - .y = from_cell.y, - .width = (to_cell.x+to_cell.width) - from_cell.x, - .height = (to_cell.y+to_cell.height) - from_cell.y, - }, highlight.color); - } - - for (0..to_column) |column| { - const memory_idx: u32 = row_memory_idx + @as(u32, @intCast(column)); - if (ui.is_holding_mouse(cell_rects[column], &self.selecting)) { - if (self.selecting) { - self.selection_pivot = memory_idx; - selection.start = memory_idx; - selection.end = memory_idx+1; - } - } - - if (self.selecting) { - if (ui.is_mouse_inside_rect(cell_rects[column])) { - if (memory_idx > self.selection_pivot) { - selection.start = self.selection_pivot; - selection.end = memory_idx+1; - } else { - selection.start = memory_idx; - selection.end = self.selection_pivot+1; - } - } - } - - const text_pos = rl.Vector2{ .x = cell_rects[column].x + margin }; - const value = self.memory[memory_idx]; - hex_to_strz(&cell_bufz, value); - var color = self.text_color; - if (self.grey_out_zeros and value == 0) { - color = self.dim_text_color; - } - rl.DrawTextEx(font, &cell_bufz, text_pos, font_size, 0, color); - } - ui.translate(0, font_size); - } - ui.popTransform(); - - return (cell_width + 2*margin)*@as(f32, @floatFromInt(self.row_width)) + middle_margin; - } - - pub fn show_ascii_column(self: *MemoryView, ui: *UI, x: f32, y: f32, selection: *Range, from_row: u32, to_row: u32) f32 { - const font = self.font.*; - const font_size = self.font_size; - const margin = font_size/2; - - const cell_width = rl.MeasureTextEx(font, ".", font_size, 0).x; - const row_count = (to_row - from_row); - - ui.pushTransformT(.{ .ox = x+margin, .oy = y }); - for (0..row_count) |i| { - const row = from_row + @as(u32, @intCast(i)); - - const to_column = @min(self.memory.len - row*self.row_width, self.row_width); - for (0..to_column) |column| { - const memory_idx: u32 = @intCast(row*self.row_width + column); - const value = self.memory[memory_idx]; - var char: u8 = 'A'; - if (std.ascii.isPrint(value)) { - char = value; - } else { - char = '.'; - } - - const pos_x = cell_width * @as(f32, @floatFromInt(column)); - if (selection.start <= memory_idx and memory_idx < selection.end) { - const cell_rect = rl.Rectangle{ - .x = pos_x, - .y = 0, - .height = self.font_size, - .width = cell_width - }; - rl.DrawRectangleRec(cell_rect, rl.RED); - } - - const char_str = [2]u8 { char, 0 }; - rl.DrawTextEx(font, char_str[0..1 :0], rl.Vector2{ .x = pos_x }, font_size, 0, self.text_color); - } - - ui.translate(0, font_size); - } - ui.popTransform(); - - return cell_width*@as(f32, @floatFromInt(self.row_width)) + 2*margin; - } - - pub fn show_scrollbar(self: *MemoryView, ui: *UI, x: f32, y: f32, height: f32) f32 { - const max_scroll = self.get_max_scroll(height); - if (max_scroll == 0) { - return 0; - } - - const visible_row_count = self.get_visible_row_count(height); - const memory_row_count = self.get_memory_row_count(); - const visible_percent = visible_row_count / memory_row_count; - const scroll_percent = self.scroll / max_scroll; - const scrollbar_height = visible_percent * height; - - const scrollbar = rl.Rectangle { - .x = x, - .y = y + scroll_percent * (height - scrollbar_height), - .width = self.font_size, - .height = scrollbar_height - }; - - - var color = rl.BLACK; - _ = ui.is_holding_mouse(scrollbar, &self.scrolling); - if (self.scrolling) { - const mouse_dy = rl.GetMouseDelta().y; - self.scroll += (mouse_dy / (height - scrollbar_height) * max_scroll); - self.scroll = clamp(self.scroll, 0, max_scroll); - color = rl.DARKGRAY; - } - - rl.DrawRectangleRec(scrollbar, color); - - return scrollbar.width; - } -}; - pub fn main() anyerror!void { var program_memory = try std.heap.page_allocator.alloc(u8, megabytes(2)); var fba = std.heap.FixedBufferAllocator.init(program_memory); @@ -608,12 +158,9 @@ pub fn main() anyerror!void { defer chip.deinit(); chip.set_memory(0x200, @embedFile("ROMs/br8kout.ch8")); - - { - // const file = try std.fs.cwd().openFile("ROMs/morse_demo.ch8", .{ .mode = .read_only }); - // defer file.close(); - // try chip.set_memory_from_file(0x200, file); - } + // const file = try std.fs.cwd().openFile("ROMs/morse_demo.ch8", .{ .mode = .read_only }); + // defer file.close(); + // try chip.set_memory_from_file(0x200, file); const pixel_size = 20; const initial_screen_width: i32 = @as(i32, chip.display_width) * pixel_size; @@ -658,14 +205,43 @@ pub fn main() anyerror!void { // var temp_mem = [1]u8{0xAA} ** (16*80 + 10); // var memory_view = MemoryView.init(&temp_mem, &font, 32); - var memory_view = MemoryView.init(chip.memory, &font, font_size, &allocator); - var selected_memory = Range{}; - var ui = UI.init(); + // var memory_view = MemoryView.init(chip.memory, &font, font_size, &allocator); + // var selected_memory = Range{}; + // var ui = UI.init(); + var camera = rl.Camera3D{ + .position = rl.Vector3.new(0.0, 0, 0.0), + .target = rl.Vector3.new(0.0, 0.0, 0.0), + .up = rl.Vector3.new(0.0, 1.0, 0.0), + .fovy = 45.0, + .projection = rl.CameraProjection.CAMERA_PERSPECTIVE, + }; + + var model = rl.LoadModel("src/assets/models/emulator.obj"); + var model_bbox = rl.GetModelBoundingBox(model); + + var model_position = rl.Vector3{ }; + var model_size = model_bbox.max.sub(model_bbox.min); + + const shader = rl.LoadShader("src/shaders/lighting.vs", "src/shaders/lighting.fs"); + shader.locs.?[@intFromEnum(rl.ShaderLocationIndex.SHADER_LOC_VECTOR_VIEW)] = rl.GetShaderLocation(shader, "viewPos"); + const ambientLoc = rl.GetShaderLocation(shader, "ambient"); + rl.SetShaderValue(shader, ambientLoc, &[4]f32{ 0.2, 0.2, 0.2, 1.0 }, rl.ShaderUniformDataType.SHADER_UNIFORM_VEC4); + + for (0..@intCast(model.materialCount)) |i| { + model.materials.?[i].shader = shader; + } + + var light = Light.create(Light.LightType.DIRECTIONAL, rl.Vector3.new(0.2, 0, -0.2), rl.Vector3.zero(), rl.WHITE, shader); + + std.debug.print("dimensions {}", .{model_size}); + + var camera_turn_vel = rl.Vector3Zero(); + var camera_target_orientation: ?rl.Vector3 = null; + var previous_click_time: f64 = 0.0; + + // rl.DisableCursor(); while (!rl.WindowShouldClose()) { - const screen_width = rl.GetScreenWidth(); - const screen_height = rl.GetScreenHeight(); - var dt = rl.GetFrameTime(); raylib_chip.update(dt); @@ -679,28 +255,163 @@ pub fn main() anyerror!void { } } - rl.BeginDrawing(); - defer rl.EndDrawing(); + const mouse_delta = rl.GetMouseDelta(); - if (!edit_mode) { - rl.ClearBackground(rl.DARKGRAY); + if (rl.IsWindowResized()) { + const distance = get_preffered_distance_to_box(&camera, model_bbox); + const direction = camera.position.sub(model_position).normalize(); + camera.position = model_position.add(direction.scale(distance)); + } - const scale_x = @divFloor(screen_width, chip.display_width); - const scale_y = @divFloor(screen_height, chip.display_height); - const min_scale = @min(scale_x, scale_y); + if (rl.Vector3Equals(camera.position, rl.Vector3Zero()) == 1) { + const distance = get_preffered_distance_to_box(&camera, model_bbox); + camera.target = model_position; + camera.position = model_position.sub(rl.Vector3.new(0, 0, 1).scale(distance)); + } - const display_width = chip.display_width * min_scale; - const display_height = chip.display_height * min_scale; - const display_x = @divFloor(screen_width - display_width, 2); - const display_y = @divFloor(screen_height - display_height, 2); - raylib_chip.render(display_x, display_y, display_width, display_height); - } else { - rl.ClearBackground(rl.RAYWHITE); - ui.update(); - - if (tab == .MemoryView) { - try memory_view.show(&ui, 0, 0, @floatFromInt(screen_width), @floatFromInt(screen_height), &selected_memory); + var camera_turn_acc = rl.Vector3Zero(); + if (rl.IsMouseButtonDown(rl.MouseButton.MOUSE_BUTTON_LEFT)) { + if (@fabs(mouse_delta.x) > 5) { + const rotation_speed = 2; // Radians/second + camera_turn_acc.x = -rotation_speed*mouse_delta.x; + } + if (@fabs(mouse_delta.x) < 5) { + camera_turn_vel = camera_turn_vel.scale(0.90); // Holding drag } } + + if (rl.IsMouseButtonPressed(rl.MouseButton.MOUSE_BUTTON_LEFT)) { + camera_target_orientation = null; + + const now = rl.GetTime(); + const duration_between_clicks = now - previous_click_time; + if (duration_between_clicks < 0.3) { + const ray = rl.GetMouseRay(rl.GetMousePosition(), camera); + const collision = rl.GetRayCollisionBox(ray, model_bbox); + if (collision.hit) { + const front_face_normal = rl.Vector3.new(0, 0, -1); + const back_face_normal = rl.Vector3.new(0, 0, 1); + if (rl.Vector3Equals(collision.normal, front_face_normal) == 1) { + camera_target_orientation = front_face_normal; + } else if (rl.Vector3Equals(collision.normal, back_face_normal) == 1) { + camera_target_orientation = back_face_normal; + } + } + } + previous_click_time = now; + } + + if (camera_target_orientation) |target| { + const current_direction = camera.position.sub(model_position).normalize(); + const current_angle = std.math.atan2(f32, current_direction.z, current_direction.x); + const target_angle = std.math.atan2(f32, target.z, target.x); + const diff_angle = std.math.pi - @mod((target_angle - current_angle) + 3*std.math.pi, 2*std.math.pi); + if (@fabs(diff_angle) < 0.001) { + camera_turn_vel.x = 0; + camera_target_orientation = null; + } else { + camera_turn_vel.x = diff_angle*3; + } + } + + camera_turn_vel = camera_turn_vel.scale(0.95); // Ambient drag + camera_turn_vel = camera_turn_vel.add(camera_turn_acc.scale(dt)); + + const camera_min_vel = 0; + if (camera_turn_vel.length() > camera_min_vel) { + const rotation = rl.MatrixRotate(camera.up.normalize(), camera_turn_vel.x*dt); + var view = rl.Vector3Subtract(camera.position, camera.target); + view = rl.Vector3Transform(view, rotation); + camera.position = rl.Vector3Add(camera.target, view); + } + + // { + // var matProj = rl.MatrixIdentity(); + // // projection = CAMERA_PERSPECTIVE + // matProj = rl.MatrixPerspective(camera.fovy*rl.DEG2RAD, (screen_width/screen_height), rl.RL_CULL_DISTANCE_NEAR, rl.RL_CULL_DISTANCE_FAR); + // + // var matView = rl.MatrixLookAt(camera.position, camera.target, camera.up); + // // Convert world position vector to quaternion + // var worldPos = rl.Vector4{ .x = position.x, .y = position.y, .z = position.z, .w = 1.0 }; + // + // std.debug.print("worldPos {}\n", .{worldPos}); + // // Transform world position to view + // worldPos = rl.QuaternionTransform(worldPos, matView); + // + // // Transform result to projection (clip space position) + // worldPos = rl.QuaternionTransform(worldPos, matProj); + // + // // Calculate normalized device coordinates (inverted y) + // var ndcPos = rl.Vector3.new( worldPos.x/worldPos.w, -worldPos.y/worldPos.w, worldPos.z/worldPos.w ); + // + // // Calculate 2d screen position vector + // screen_position = rl.Vector2{ .x = (ndcPos.x + 1.0)/2.0*screen_width, .y = (ndcPos.y + 1.0)/2.0*screen_height }; + // } + + // const target_screen_position = rl.Vector2{ .x = screen_width/2, .y = screen_height*0.1 }; + // { + // var matProj = get_camera_projection(&camera); + // var matView = rl.MatrixLookAt(camera.position, camera.target, camera.up); + // + // const ndc_x = (2.0*target_screen_position.x) / screen_width - 1.0; + // const ndc_y = 1.0 - (2.0*target_screen_position.y) / screen_height; + // + // var near_point = rl.Vector3Unproject(.{ .x = ndc_x, .y = ndc_y, .z = 0.0 }, matProj, matView); + // var far_point = rl.Vector3Unproject(.{ .x = ndc_x, .y = ndc_y, .z = 1.0 }, matProj, matView); + // + // var direction = rl.Vector3Subtract(far_point, near_point).normalize(); + // + // var origin: rl.Vector3 = undefined; + // if (camera.projection == .CAMERA_PERSPECTIVE) { + // origin = camera.position; + // } else { + // origin = rl.Vector3Unproject(.{ .x = ndc_x, .y = ndc_y, .z = -1.0 }, matProj, matView); + // } + // + // var world_pos = origin.add(direction.scale(3)); + // + // model_position = world_pos; + // } + + const cameraPos = [3]f32{ camera.position.x, camera.position.y, camera.position.z }; + rl.SetShaderValue(shader, shader.locs.?[@intFromEnum(rl.ShaderLocationIndex.SHADER_LOC_VECTOR_VIEW)], &cameraPos, rl.ShaderUniformDataType.SHADER_UNIFORM_VEC3); + light.update_values(shader); + + rl.BeginDrawing(); + rl.ClearBackground(.{ .r = 33, .g = 33, .b = 33, .a = 255 }); + + + rl.BeginMode3D(camera); + rl.DrawModel(model, model_position, 1.0, rl.WHITE); + + // rl.rlPushMatrix(); + // rl.rlSetLineWidth(2); + // rl.rlTranslatef(model_position.x, model_position.y, model_position.z); + // rl.DrawBoundingBox(model_bbox, rl.GREEN); + // rl.rlPopMatrix(); + rl.EndMode3D(); + + rl.EndDrawing(); + + // if (!edit_mode) { + // rl.ClearBackground(rl.DARKGRAY); + // + // const scale_x = @divFloor(screen_width, chip.display_width); + // const scale_y = @divFloor(screen_height, chip.display_height); + // const min_scale = @min(scale_x, scale_y); + // + // const display_width = chip.display_width * min_scale; + // const display_height = chip.display_height * min_scale; + // const display_x = @divFloor(screen_width - display_width, 2); + // const display_y = @divFloor(screen_height - display_height, 2); + // raylib_chip.render(display_x, display_y, display_width, display_height); + // } else { + // rl.ClearBackground(rl.RAYWHITE); + // ui.update(); + // + // if (tab == .MemoryView) { + // try memory_view.show(&ui, 0, 0, @floatFromInt(screen_width), @floatFromInt(screen_height), &selected_memory); + // } + // } } } diff --git a/src/memory-view.zig b/src/memory-view.zig new file mode 100644 index 0000000..ad8119b --- /dev/null +++ b/src/memory-view.zig @@ -0,0 +1,340 @@ +const rl = @import("raylib"); +const std = @import("std"); +const UILib = @import("ui.zig"); + +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const UI = UILib.UI; +const HorizontalLayout = UILib.HorizontalLayout; + +fn nibble_to_char(nibble: u4) u8 { + if (0 <= nibble and nibble <= 9) { + return '0' + @as(u8, nibble); + } else { + return 'A' + @as(u8, nibble - 10); + } +} + +fn hex_to_strz(str: [:0]u8, number: u32) void { + var i: i32 = @intCast(str.len-1); + var leftover = number; + while (leftover > 0 and i >= 0): (leftover >>= 4) { + const nibble: u4 = @intCast(leftover & 0b1111); + str[@intCast(i)] = nibble_to_char(nibble); + i -= 1; + } + + while (i >= 0): (i -= 1) { + str[@intCast(i)] = '0'; + } +} + +fn clamp(value: f32, min: f32, max: f32) f32 { + return @min(@max(value, min), max); +} + +pub const Range = struct { start: u32 = 0, end: u32 = 0 }; + +pub const MemoryView = struct { + const Highlight = struct { + range: Range, + color: rl.Color + }; + + font: *const rl.Font, + font_size: f32, + + base_address: u32, + memory: []u8, + scroll: f32 = 0, + + scrolling: bool = false, + selecting: bool = false, + editing: bool = false, + + editing_byte: u32 = 0, + selection_pivot: u32 = 0, + allocator: *const Allocator, + + grey_out_zeros: bool = true, + + text_color: rl.Color = rl.BLACK, + dim_text_color: rl.Color = rl.GRAY, + + row_width: u5 = 16, + + pub fn init(memory: []u8, font: *const rl.Font, font_size: f32, allocator: *const Allocator) MemoryView { + return MemoryView{ + .allocator = allocator, + .base_address = 0, + .memory = memory, + .font = font, + .font_size = font_size, + }; + } + + pub fn get_memory_row_count(self: *const MemoryView) f32 { + return @ceil(@as(f32, @floatFromInt(self.memory.len)) / @as(f32, @floatFromInt(self.row_width))); + } + + pub fn get_visible_row_count(self: *const MemoryView, height: f32) f32 { + return @min(height / self.font_size, self.get_memory_row_count()); + } + + pub fn get_max_scroll(self: *const MemoryView, height: f32) f32 { + return @max(self.get_memory_row_count() - self.get_visible_row_count(height), 0); + } + + pub fn show(self: *MemoryView, ui: *UI, x: f32, y: f32, width: f32, height: f32, selection: *Range) !void { + if (ui.is_mouse_inside(x, y, width, height)) { + self.scroll -= rl.GetMouseWheelMove(); + } + + self.scroll = clamp(self.scroll, 0, self.get_max_scroll(height)); + + const from_row: u32 = @intFromFloat(@floor(self.scroll)); + const to_row: u32 = @intFromFloat(@ceil(self.scroll + self.get_visible_row_count(height))); + + const scroll_offset = @rem(self.scroll, 1) * self.font_size; + var layout = HorizontalLayout.init(x, y - scroll_offset, width, height); + + layout.push(try self.show_address_column(ui, layout.next_x(), layout.next_y(), from_row, to_row)); + layout.push(self.show_hex_column(ui, layout.next_x(), layout.next_y(), selection, from_row, to_row)); + layout.push(self.show_ascii_column(ui, layout.next_x(), layout.next_y(), selection, from_row, to_row)); + layout.push(self.show_scrollbar(ui, layout.next_x(), y, height)); + } + + pub fn show_address_column(self: *MemoryView, ui: *UI, x: f32, y: f32, from_row: u32, to_row: u32) !f32 { + const font = self.font.*; + const font_size = self.font_size; + const margin = font_size/2; + + const memory_size_f32: f32 = @floatFromInt(self.memory.len); + const memory_size_log10: u32 = @intFromFloat(@floor(@log2(memory_size_f32)/2)); + const address_column_max_chars: u32 = memory_size_log10 + 1; + const row_count = (to_row - from_row); + + var label_buf = try self.allocator.allocSentinel(u8, address_column_max_chars, 0); + defer self.allocator.free(label_buf); + + hex_to_strz(label_buf, 0); + const column_width = rl.MeasureTextEx(font, label_buf, font_size, 0).x + 2*margin; + + ui.pushTransformT(.{ .ox = x, .oy = y }); + for (0..row_count) |i| { + const row = from_row + @as(u32, @intCast(i)); + const row_address = self.base_address + row*self.row_width; + hex_to_strz(label_buf, row_address); + + const cell_rect = rl.Rectangle { + .x = 0, + .y = self.font_size * @as(f32, @floatFromInt(i)), + .height = self.font_size, + .width = column_width + }; + if (ui.is_mouse_inside_rect(cell_rect)) { + rl.DrawRectangleRec(cell_rect, rl.RED); + } + + const text_pos = rl.Vector2{ .x = cell_rect.x + margin, .y = cell_rect.y }; + rl.DrawTextEx(font, label_buf, text_pos, font_size, 0, self.text_color); + } + ui.popTransform(); + + return column_width; + } + + fn is_in_range(x: u32, from: u32, to: u32) bool { + return from <= x and x < to; + } + + pub fn show_hex_column(self: *MemoryView, ui: *UI, x: f32, y: f32, selection: *Range, from_row: u32, to_row: u32) f32 { + assert(self.row_width <= 16); + + const font = self.font.*; + const font_size = self.font_size; + const margin = font_size/6; + + var middle_margin: f32 = 0.0; + if (self.row_width == 16) { + middle_margin = font_size/2; + } + + const cell_width = rl.MeasureTextEx(font, "00", font_size, 0).x; + const row_count = (to_row - from_row); + + const highlights = [_]Highlight{ + Highlight{ .range = .{ .start = 16, .end = 17, }, .color = rl.RED }, + Highlight{ .range = selection.*, .color = rl.RED }, + }; + + ui.pushTransformT(.{ .ox = x, .oy = y }); + var cell_bufz = [_:0]u8{0} ** 2; + for (0..row_count) |i| { + const row = from_row + @as(u32, @intCast(i)); + const row_memory_idx: u32 = @intCast(row*self.row_width); + + var cell_rects: [16]rl.Rectangle = undefined; + const to_column = @min(self.memory.len - row*self.row_width, self.row_width); + for (0..to_column) |column| { + var cell_rect = rl.Rectangle { + .x = (cell_width + 2*margin) * @as(f32, @floatFromInt(column)), + .y = 0, + .width = cell_width + 2*margin, + .height = self.font_size + }; + + if (column >= self.row_width/2) { + cell_rect.x += middle_margin; + } + + cell_rects[column] = cell_rect; + } + + for (highlights) |highlight| { + const highlight_start = highlight.range.start; + const highlight_end = highlight.range.end; + if (row_memory_idx >= highlight_end) continue; + if (row_memory_idx+self.row_width <= highlight_start) continue; + + var highlight_from_column: u32 = undefined; + if (row_memory_idx > highlight_start) { + highlight_from_column = 0; + } else { + highlight_from_column = @mod(highlight_start, self.row_width); + } + + var highlight_to_column: u32 = undefined; + if (row_memory_idx+self.row_width <= highlight_end) { + highlight_to_column = self.row_width-1; + } else { + highlight_to_column = @mod(highlight_end-1, self.row_width); + } + + const from_cell = cell_rects[highlight_from_column]; + const to_cell = cell_rects[highlight_to_column]; + rl.DrawRectangleRec(rl.Rectangle{ + .x = from_cell.x, + .y = from_cell.y, + .width = (to_cell.x+to_cell.width) - from_cell.x, + .height = (to_cell.y+to_cell.height) - from_cell.y, + }, highlight.color); + } + + for (0..to_column) |column| { + const memory_idx: u32 = row_memory_idx + @as(u32, @intCast(column)); + if (ui.is_holding_mouse(cell_rects[column], &self.selecting)) { + if (self.selecting) { + self.selection_pivot = memory_idx; + selection.start = memory_idx; + selection.end = memory_idx+1; + } + } + + if (self.selecting) { + if (ui.is_mouse_inside_rect(cell_rects[column])) { + if (memory_idx > self.selection_pivot) { + selection.start = self.selection_pivot; + selection.end = memory_idx+1; + } else { + selection.start = memory_idx; + selection.end = self.selection_pivot+1; + } + } + } + + const text_pos = rl.Vector2{ .x = cell_rects[column].x + margin }; + const value = self.memory[memory_idx]; + hex_to_strz(&cell_bufz, value); + var color = self.text_color; + if (self.grey_out_zeros and value == 0) { + color = self.dim_text_color; + } + rl.DrawTextEx(font, &cell_bufz, text_pos, font_size, 0, color); + } + ui.translate(0, font_size); + } + ui.popTransform(); + + return (cell_width + 2*margin)*@as(f32, @floatFromInt(self.row_width)) + middle_margin; + } + + pub fn show_ascii_column(self: *MemoryView, ui: *UI, x: f32, y: f32, selection: *Range, from_row: u32, to_row: u32) f32 { + const font = self.font.*; + const font_size = self.font_size; + const margin = font_size/2; + + const cell_width = rl.MeasureTextEx(font, ".", font_size, 0).x; + const row_count = (to_row - from_row); + + ui.pushTransformT(.{ .ox = x+margin, .oy = y }); + for (0..row_count) |i| { + const row = from_row + @as(u32, @intCast(i)); + + const to_column = @min(self.memory.len - row*self.row_width, self.row_width); + for (0..to_column) |column| { + const memory_idx: u32 = @intCast(row*self.row_width + column); + const value = self.memory[memory_idx]; + var char: u8 = 'A'; + if (std.ascii.isPrint(value)) { + char = value; + } else { + char = '.'; + } + + const pos_x = cell_width * @as(f32, @floatFromInt(column)); + if (selection.start <= memory_idx and memory_idx < selection.end) { + const cell_rect = rl.Rectangle{ + .x = pos_x, + .y = 0, + .height = self.font_size, + .width = cell_width + }; + rl.DrawRectangleRec(cell_rect, rl.RED); + } + + const char_str = [2]u8 { char, 0 }; + rl.DrawTextEx(font, char_str[0..1 :0], rl.Vector2{ .x = pos_x }, font_size, 0, self.text_color); + } + + ui.translate(0, font_size); + } + ui.popTransform(); + + return cell_width*@as(f32, @floatFromInt(self.row_width)) + 2*margin; + } + + pub fn show_scrollbar(self: *MemoryView, ui: *UI, x: f32, y: f32, height: f32) f32 { + const max_scroll = self.get_max_scroll(height); + if (max_scroll == 0) { + return 0; + } + + const visible_row_count = self.get_visible_row_count(height); + const memory_row_count = self.get_memory_row_count(); + const visible_percent = visible_row_count / memory_row_count; + const scroll_percent = self.scroll / max_scroll; + const scrollbar_height = visible_percent * height; + + const scrollbar = rl.Rectangle { + .x = x, + .y = y + scroll_percent * (height - scrollbar_height), + .width = self.font_size, + .height = scrollbar_height + }; + + + var color = rl.BLACK; + _ = ui.is_holding_mouse(scrollbar, &self.scrolling); + if (self.scrolling) { + const mouse_dy = rl.GetMouseDelta().y; + self.scroll += (mouse_dy / (height - scrollbar_height) * max_scroll); + self.scroll = clamp(self.scroll, 0, max_scroll); + color = rl.DARKGRAY; + } + + rl.DrawRectangleRec(scrollbar, color); + + return scrollbar.width; + } +}; diff --git a/src/shaders/lighting.fs b/src/shaders/lighting.fs new file mode 100644 index 0000000..b9f3796 --- /dev/null +++ b/src/shaders/lighting.fs @@ -0,0 +1,82 @@ +#version 330 + +// Input vertex attributes (from vertex shader) +in vec3 fragPosition; +in vec2 fragTexCoord; +//in vec4 fragColor; +in vec3 fragNormal; + +// Input uniform values +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +// Output fragment color +out vec4 finalColor; + +// NOTE: Add here your custom variables + +#define MAX_LIGHTS 1 +#define LIGHT_DIRECTIONAL 0 +#define LIGHT_POINT 1 + +struct MaterialProperty { + vec3 color; + int useSampler; + sampler2D sampler; +}; + +struct Light { + int enabled; + int type; + vec3 position; + vec3 target; + vec4 color; +}; + +// Input lighting values +uniform Light lights[MAX_LIGHTS]; +uniform vec4 ambient; +uniform vec3 viewPos; + +void main() +{ + // Texel color fetching from texture sampler + vec4 texelColor = texture(texture0, fragTexCoord); + vec3 lightDot = vec3(0.0); + vec3 normal = normalize(fragNormal); + vec3 viewD = normalize(viewPos - fragPosition); + vec3 specular = vec3(0.0); + + // NOTE: Implement here your fragment shader code + + for (int i = 0; i < MAX_LIGHTS; i++) + { + if (lights[i].enabled == 1) + { + vec3 light = vec3(0.0); + + if (lights[i].type == LIGHT_DIRECTIONAL) + { + light = -normalize(lights[i].target - lights[i].position); + } + + if (lights[i].type == LIGHT_POINT) + { + light = normalize(lights[i].position - fragPosition); + } + + float NdotL = max(dot(normal, light), 0.0); + lightDot += lights[i].color.rgb*NdotL; + + float specCo = 0.0; + if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // 16 refers to shine + specular += specCo; + } + } + + finalColor = (texelColor*((colDiffuse + vec4(specular, 1.0))*vec4(lightDot, 1.0))); + finalColor += texelColor*(ambient/10.0)*colDiffuse; + + // Gamma correction + finalColor = pow(finalColor, vec4(1.0/1.9)); +} diff --git a/src/shaders/lighting.vs b/src/shaders/lighting.vs new file mode 100644 index 0000000..f8ec45f --- /dev/null +++ b/src/shaders/lighting.vs @@ -0,0 +1,32 @@ +#version 330 + +// Input vertex attributes +in vec3 vertexPosition; +in vec2 vertexTexCoord; +in vec3 vertexNormal; +in vec4 vertexColor; + +// Input uniform values +uniform mat4 mvp; +uniform mat4 matModel; +uniform mat4 matNormal; + +// Output vertex attributes (to fragment shader) +out vec3 fragPosition; +out vec2 fragTexCoord; +out vec4 fragColor; +out vec3 fragNormal; + +// NOTE: Add here your custom variables + +void main() +{ + // Send vertex attributes to fragment shader + fragPosition = vec3(matModel*vec4(vertexPosition, 1.0)); + fragTexCoord = vertexTexCoord; + fragColor = vertexColor; + fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0))); + + // Calculate final vertex position + gl_Position = mvp*vec4(vertexPosition, 1.0); +} diff --git a/src/ui.zig b/src/ui.zig new file mode 100644 index 0000000..5411524 --- /dev/null +++ b/src/ui.zig @@ -0,0 +1,230 @@ +const rl = @import("raylib"); +const assert = @import("std").debug.assert; + +pub const UI = struct { + const TransformFrame = struct { + ox: f32 = 0, + oy: f32 = 0, + sx: f32 = 1, + sy: f32 = 1, + }; + + frames: [16]TransformFrame, + top_frame: u32, + + mouse: rl.Vector2, + mouse_delta: rl.Vector2, + + pub fn init() UI { + return UI{ + .frames = [1]TransformFrame{ TransformFrame{} } ** 16, + .top_frame = 0, + .mouse = rl.Vector2.zero(), + .mouse_delta = rl.Vector2.zero(), + }; + } + + pub fn pushTransform(self: *UI) void { + assert(self.top_frame < self.frames.len-1); + + rl.rlPushMatrix(); + self.top_frame += 1; + self.frames[self.top_frame] = self.frames[self.top_frame - 1]; + } + + pub fn pushTransformT(self: *UI, transform: TransformFrame) void { + self.pushTransform(); + self.translate(transform.ox, transform.oy); + self.scale(transform.sx, transform.sy); + } + + pub fn translate(self: *UI, x: f32, y: f32) void { + const top_frame = &self.frames[self.top_frame]; + top_frame.ox += x * top_frame.sx; + top_frame.oy += y * top_frame.sy; + rl.rlTranslatef(x, y, 0); + } + + pub fn scale(self: *UI, x: f32, y: f32) void { + const top_frame = &self.frames[self.top_frame]; + top_frame.sx *= x; + top_frame.sy *= y; + rl.rlScalef(x, y, 0); + } + + pub fn popTransform(self: *UI) void { + rl.rlPopMatrix(); + self.top_frame -= 1; + } + + pub fn update(self: *UI) void { + assert(self.top_frame == 0); // Check if 'pushTransform()' and 'popTransform()' are paired + + self.frames[0] = .{}; + self.mouse = rl.GetMousePosition(); + self.mouse_delta = rl.GetMouseDelta(); + } + + /// Screen space -> UI space + pub fn apply_transform(self: *UI, vec2: rl.Vector2) rl.Vector2 { + const top_frame = &self.frames[self.top_frame]; + return rl.Vector2{ + .x = (vec2.x - top_frame.ox) * top_frame.sx, + .y = (vec2.y - top_frame.oy) * top_frame.sy + }; + } + + pub fn apply_scale(self: *UI, vec2: rl.Vector2) rl.Vector2 { + const top_frame = &self.frames[self.top_frame]; + return rl.Vector2{ + .x = vec2.x * top_frame.sx, + .y = vec2.y * top_frame.sy, + }; + } + + pub fn get_mouse(self: *UI) rl.Vector2 { + return self.apply_transform(self.mouse); + } + + pub fn get_mouse_delta(self: *UI) rl.Vector2 { + return self.apply_scale(self.mouse_delta); + } + + pub fn is_mouse_inside(self: *UI, x: f32, y: f32, width: f32, height: f32) bool { + const mouse = self.get_mouse(); + return (x <= mouse.x and mouse.x < x+width) and (y <= mouse.y and mouse.y < y+height); + } + + pub fn is_mouse_inside_rect(self: *UI, rect: rl.Rectangle) bool { + return self.is_mouse_inside(rect.x, rect.y, rect.width, rect.height); + } + + pub fn is_mouse_down() bool { + return rl.IsMouseButtonDown(rl.MouseButton.MOUSE_BUTTON_LEFT); + } + + pub fn is_mouse_up() bool { + return rl.IsMouseButtonUp(rl.MouseButton.MOUSE_BUTTON_LEFT); + } + + pub fn was_secondary_mouse_pressed() bool { + return rl.IsMouseButtonPressed(rl.MouseButton.MOUSE_BUTTON_RIGHT); + } + + pub fn is_holding_mouse(self: *UI, rect: rl.Rectangle, state: *bool) bool { + if (!state.* and UI.is_mouse_down() and self.is_mouse_inside_rect(rect)) { + state.* = true; + return true; + } + if (UI.is_mouse_up()) { + state.* = false; + return true; + } + return false; + } +}; + +pub const UIBox = struct { + x: f32, + y: f32, + width: f32, + height: f32, + + vert_margin: f32, + horz_margin: f32, + + pub fn init(x: f32, y: f32, width: f32, height: f32) UIBox { + return UIBox { + .x = x, + .y = y, + .width = width, + .height = height, + .vert_margin = 0, + .horz_margin = 0, + }; + } + + pub fn init_rect(rectangle: rl.Rectangle) UIBox { + return UIBox.init(rectangle.x, rectangle.y, rectangle.width, rectangle.height); + } + + pub fn body_x(self: *UIBox) f32 { + return self.x + self.horz_margin; + } + + pub fn body_y(self: *UIBox) f32 { + return self.y + self.vert_margin; + } + + pub fn body_width(self: *UIBox) f32 { + return self.width - 2*self.horz_margin; + } + + pub fn body_height(self: *UIBox) f32 { + return self.height - 2*self.vert_margin; + } + + pub fn body_rect(self: *UIBox) rl.Rectangle { + return rl.Rectangle{ + .x = self.body_x(), + .y = self.body_y(), + .width = self.body_width(), + .height = self.body_height() + }; + } + + pub fn rect(self: *UIBox) rl.Rectangle { + return rl.Rectangle{ + .x = self.x, + .y = self.y, + .width = self.width, + .height = self.height + }; + } +}; + +pub const HorizontalLayout = struct { + x: f32, + y: f32, + width: f32, + height: f32, + + used_width: f32, + + pub fn init(x: f32, y: f32, width: f32, height: f32) HorizontalLayout { + return HorizontalLayout{ + .x = x, + .y = y, + .width = width, + .height = height, + .used_width = 0 + }; + } + + pub fn next_x(self: *HorizontalLayout) f32 { + return self.x + self.used_width; + } + + pub fn next_y(self: *HorizontalLayout) f32 { + return self.y; + } + + pub fn push_rect(self: *HorizontalLayout, width: f32) rl.Rectangle { + const rect = rl.Rectangle{ + .x = self.next_x(), + .y = self.next_y(), + .width = width, + .height = self.height + }; + self.push(width); + return rect; + } + + pub fn push(self: *HorizontalLayout, width: f32) void { + self.used_width += width; + } + + pub fn used_size(self: *HorizontalLayout) rl.Vector2 { + return rl.Vector2{ .x = self.used_width, .y = self.height }; + } +};